diff --git a/open_wearable/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/open_wearable/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 4d7193ee..c834a06b 100644 --- a/open_wearable/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/open_wearable/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -53,6 +53,15 @@ "revision" : "d4a6d8100f4b886fdbc8ae399bf144ff3e9afb7e", "version" : "2.8.0" } + }, + { + "identity" : "zipfoundation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/weichsel/ZIPFoundation.git", + "state" : { + "revision" : "02b6abe5f6eef7e3cbd5f247c5cc24e246efcfe0", + "version" : "0.9.19" + } } ], "version" : 2 diff --git a/open_wearable/lib/apps/seal_check/assets/seal-check-icon.png b/open_wearable/lib/apps/seal_check/assets/seal-check-icon.png new file mode 100644 index 00000000..ae1bc01b Binary files /dev/null and b/open_wearable/lib/apps/seal_check/assets/seal-check-icon.png differ diff --git a/open_wearable/lib/apps/seal_check/audio_response_measurement_session.dart b/open_wearable/lib/apps/seal_check/audio_response_measurement_session.dart new file mode 100644 index 00000000..4683e48d --- /dev/null +++ b/open_wearable/lib/apps/seal_check/audio_response_measurement_session.dart @@ -0,0 +1,370 @@ +import 'package:open_earable_flutter/open_earable_flutter.dart'; +import 'package:open_wearable/apps/seal_check/seal_check_tone.dart'; + +/// The playback sample rate expected by OpenEarable seal-check firmware. +const int audioResponseSamplingRate = 48000; + +/// Frequencies requested from the seal-check firmware. +const List audioResponseRequestFrequencies = [ + 40, + 60, + 90, + 135, + 203, + 304, + 456, + 683, + 1025, +]; + +/// One frequency and magnitude pair returned by a seal-check measurement. +class AudioResponsePoint { + /// Creates a validated seal-check response point. + const AudioResponsePoint({ + required this.frequencyHz, + required this.magnitude, + }); + + /// Frequency represented by this point, in hertz. + final double frequencyHz; + + /// Raw FFT magnitude measured by the wearable. + final double magnitude; + + /// Converts this point to a JSON-compatible map. + Map toJson() => { + 'frequency_hz': frequencyHz, + 'magnitude': magnitude, + }; +} + +/// Phase currently being performed by a seal-check measurement session. +enum AudioResponseMeasurementPhase { + /// The pregenerated tone is being uploaded to one or more wearables. + uploadingTone, + + /// Uploaded tones are being played and measured by the wearables. + measuringResponse, +} + +/// Progress information emitted while a seal-check measurement is running. +class AudioResponseMeasurementProgress { + /// Creates a progress snapshot for the current session phase. + const AudioResponseMeasurementProgress({ + required this.phase, + required this.completedUploads, + required this.totalUploads, + required this.acknowledgedSamples, + required this.totalSamples, + }) : assert(completedUploads >= 0), + assert(totalUploads >= 0), + assert(completedUploads <= totalUploads), + assert(acknowledgedSamples >= 0), + assert(totalSamples >= 0), + assert(acknowledgedSamples <= totalSamples); + + /// Current session phase. + final AudioResponseMeasurementPhase phase; + + /// Number of tone uploads that have completed successfully. + final int completedUploads; + + /// Number of tone uploads required before measuring starts. + final int totalUploads; + + /// Number of uploaded samples acknowledged by the selected wearables. + final int acknowledgedSamples; + + /// Number of samples that must be acknowledged before measuring starts. + final int totalSamples; + + /// Acknowledged sample fraction, or `null` when there is no upload work. + double? get uploadFraction { + if (totalSamples == 0) return null; + return acknowledgedSamples / totalSamples; + } +} + +/// Receives progress updates from [AudioResponseMeasurementSession.measure]. +typedef AudioResponseMeasurementProgressCallback = void Function( + AudioResponseMeasurementProgress progress, +); + +/// Typed result used by the Seal Check app. +class AudioResponseMeasurement { + /// Creates an app measurement from a protocol [result]. + factory AudioResponseMeasurement.fromProtocol(AudioResponseResult result) { + if (result.frequencies.length != result.points || + result.response.length != result.points) { + throw FormatException( + 'Audio response result point count does not match its data arrays.', + ); + } + + final points = List.generate( + result.points, + (index) => AudioResponsePoint( + frequencyHz: result.frequencies[index].toDouble(), + magnitude: result.response[index].toDouble(), + ), + growable: false, + ); + return AudioResponseMeasurement._(id: result.id, points: points); + } + + const AudioResponseMeasurement._({ + required this.id, + required this.points, + }); + + /// Protocol measurement identifier. + final int id; + + /// Frequency response points returned by the wearable. + final List points; + + /// Converts this measurement to a JSON-compatible map. + Map toJson() => { + 'id': id, + 'points': points.map((point) => point.toJson()).toList(growable: false), + }; +} + +/// Coordinates buffer uploads and measurements for one Seal Check app run. +/// +/// A manager receives the generated stimulus only before its first measurement. +/// The committed buffer is then reused for subsequent measurements. +class AudioResponseMeasurementSession { + /// Creates a session for the selected [left] and/or [right] managers. + AudioResponseMeasurementSession({ + this.left, + this.right, + List? samples, + List frequencies = audioResponseRequestFrequencies, + this.samplingRate = audioResponseSamplingRate, + this.volume = 1.0, + }) : assert(left != null || right != null), + assert(volume >= 0 && volume <= 1), + assert(frequencies.isNotEmpty), + assert(frequencies.length <= 0xff), + assert(frequencies.every(_isUint16Frequency)), + frequencies = List.unmodifiable(frequencies), + samples = samples ?? sealCheckToneBuffer; + + /// Manager for the left wearable, when selected. + final AudioResponseManager? left; + + /// Manager for the right wearable, when selected. + final AudioResponseManager? right; + + /// Signed 16-bit PCM stimulus uploaded to each manager. + final List samples; + + /// Sampling rate of [samples]. + final int samplingRate; + + /// Playback volume passed to the wearable. + final double volume; + + /// Frequency response points requested from the wearable. + final List frequencies; + + final Map> _bufferUploads = {}; + int _nextTransferId = 1; + int _nextMeasurementId = 1; + + /// Measures all selected managers. + /// + /// The pregenerated tone is uploaded once per manager and cached for later + /// measurements. [onProgress] receives upload and measurement phase changes. + Future<({AudioResponseMeasurement? left, AudioResponseMeasurement? right})> + measure({ + AudioResponseMeasurementProgressCallback? onProgress, + }) async { + final measurementId = _takeMeasurementId(); + final managers = _selectedManagers(); + final uploads = managers + .where((entry) => !_bufferUploads.containsKey(entry.manager)) + .toList(growable: false); + + if (uploads.isNotEmpty) { + final uploadStates = + Map.fromEntries( + uploads.map( + (entry) => MapEntry( + entry.manager, + _UploadProgressState(totalSamples: samples.length), + ), + ), + ); + + void reportUploadProgress() { + onProgress?.call( + AudioResponseMeasurementProgress( + phase: AudioResponseMeasurementPhase.uploadingTone, + completedUploads: + uploadStates.values.where((state) => state.completed).length, + totalUploads: uploadStates.length, + acknowledgedSamples: uploadStates.values.fold( + 0, + (sum, state) => sum + state.acknowledgedSamples, + ), + totalSamples: uploadStates.values.fold( + 0, + (sum, state) => sum + state.totalSamples, + ), + ), + ); + } + + reportUploadProgress(); + + for (final entry in uploads) { + final state = uploadStates[entry.manager]!; + await _ensureBufferUploaded( + entry.manager, + onProgress: (progress) { + state.acknowledgedSamples = progress.acknowledgedSamples.clamp( + 0, + state.totalSamples, + ); + state.completed = + progress.phase == AudioResponseUploadPhase.completed; + reportUploadProgress(); + }, + ); + state + ..acknowledgedSamples = state.totalSamples + ..completed = true; + reportUploadProgress(); + } + } + + onProgress?.call( + const AudioResponseMeasurementProgress( + phase: AudioResponseMeasurementPhase.measuringResponse, + completedUploads: 0, + totalUploads: 0, + acknowledgedSamples: 0, + totalSamples: 0, + ), + ); + + final results = await Future.wait( + managers.map( + (entry) => _measureUploaded(entry.manager, measurementId) + .then((value) => (entry.isLeft, value)), + ), + ); + + AudioResponseMeasurement? leftResult; + AudioResponseMeasurement? rightResult; + for (final (isLeft, result) in results) { + if (isLeft) { + leftResult = result; + } else { + rightResult = result; + } + } + return (left: leftResult, right: rightResult); + } + + List<({bool isLeft, AudioResponseManager manager})> _selectedManagers() => [ + if (left != null) (isLeft: true, manager: left!), + if (right != null) (isLeft: false, manager: right!), + ]; + + Future _measureUploaded( + AudioResponseManager manager, + int measurementId, + ) async { + final transferId = await _bufferUploads[manager]!; + final result = await manager.measureAudioResponse( + AudioResponseConfig( + id: measurementId, + transfer_id: transferId, + volume: volume, + points: frequencies.length, + frequencies: frequencies, + ), + ); + return AudioResponseMeasurement.fromProtocol(result); + } + + Future _ensureBufferUploaded( + AudioResponseManager manager, { + AudioResponseUploadProgressCallback? onProgress, + }) async { + final existingUpload = _bufferUploads[manager]; + if (existingUpload != null) { + return existingUpload; + } + + final upload = _uploadBufferWithRetry(manager, onProgress: onProgress); + _bufferUploads[manager] = upload; + try { + return await upload; + } on Object { + if (identical(_bufferUploads[manager], upload)) { + _bufferUploads.remove(manager); + } + rethrow; + } + } + + Future _uploadBuffer( + AudioResponseManager manager, { + AudioResponseUploadProgressCallback? onProgress, + }) async { + final transferId = _takeTransferId(); + await manager.uploadAudioBuffer( + transferId: transferId, + samples: samples, + samplingRate: samplingRate, + onProgress: onProgress, + ); + return transferId; + } + + Future _uploadBufferWithRetry( + AudioResponseManager manager, { + AudioResponseUploadProgressCallback? onProgress, + }) async { + try { + return await _uploadBuffer(manager, onProgress: onProgress); + } on StateError catch (error) { + if (!_isClosedTransferStatusStream(error)) { + rethrow; + } + await Future.delayed(const Duration(milliseconds: 250)); + return _uploadBuffer(manager, onProgress: onProgress); + } + } + + int _takeTransferId() { + final id = _nextTransferId; + _nextTransferId = _nextTransferId == 0xffff ? 1 : _nextTransferId + 1; + return id; + } + + int _takeMeasurementId() { + final id = _nextMeasurementId; + _nextMeasurementId = + _nextMeasurementId == 0xff ? 1 : _nextMeasurementId + 1; + return id; + } +} + +class _UploadProgressState { + _UploadProgressState({required this.totalSamples}); + + final int totalSamples; + int acknowledgedSamples = 0; + bool completed = false; +} + +bool _isClosedTransferStatusStream(StateError error) { + return error.message == 'Audio response transfer status stream closed'; +} + +bool _isUint16Frequency(int frequency) => frequency > 0 && frequency <= 0xffff; diff --git a/open_wearable/lib/apps/seal_check/audio_response_measurement_view.dart b/open_wearable/lib/apps/seal_check/audio_response_measurement_view.dart new file mode 100644 index 00000000..9d390310 --- /dev/null +++ b/open_wearable/lib/apps/seal_check/audio_response_measurement_view.dart @@ -0,0 +1,881 @@ +import 'dart:convert'; +import 'dart:math' as math; + +import 'package:fl_chart/fl_chart.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; +import 'package:open_earable_flutter/open_earable_flutter.dart'; +import 'package:open_wearable/apps/seal_check/audio_response_measurement_session.dart'; +import 'package:open_wearable/apps/seal_check/seal_check_quality.dart'; + +// NOTE: We intentionally do NOT support writing files on web here. +// If you want web downloads, we can add a proper conditional import helper. +// ignore: avoid_web_libraries_in_flutter +import 'dart:io'; + +import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart'; + +// Target curve constants mirrored from firmware seal_check_service.c +final List _kTargetFrequencies = audioResponseRequestFrequencies + .map((frequency) => frequency.toDouble()) + .toList( + growable: false, + ); +const List _kTargetMagnitudes = sealCheckTargetMagnitudes; + +/// Returns the index in [_kTargetFrequencies] closest to [freqHz] on a log scale. +int _closestTargetIndex(double freqHz) { + int best = 0; + double bestDist = double.infinity; + final logF = math.log(freqHz); + for (int i = 0; i < _kTargetFrequencies.length; i++) { + final dist = (logF - math.log(_kTargetFrequencies[i])).abs(); + if (dist < bestDist) { + bestDist = dist; + best = i; + } + } + return best; +} + +/// Measures and visualizes seal-check results from one or two wearables. +class SealCheckMeasurementView extends StatefulWidget { + /// Creates a seal-check measurement view. + const SealCheckMeasurementView({ + super.key, + this.left, + this.right, + this.title = 'Seal Check', + }) : assert( + left != null || right != null, + 'At least one of left or right must be provided', + ); + + final AudioResponseManager? left; + final AudioResponseManager? right; + + /// Title displayed in the app bar. + final String title; + + @override + State createState() => + _SealCheckMeasurementViewState(); +} + +class _SealCheckMeasurementViewState extends State { + bool _isMeasuring = false; + Object? _error; + StackTrace? _stack; + AudioResponseMeasurement? _leftResult; + AudioResponseMeasurement? _rightResult; + AudioResponseMeasurementProgress? _progress; + bool _showRawValues = false; + late final AudioResponseMeasurementSession _session; + + bool get _hasBothSides => widget.left != null && widget.right != null; + bool get _hasAnyResult => _leftResult != null || _rightResult != null; + + @override + void initState() { + super.initState(); + _session = AudioResponseMeasurementSession( + left: widget.left, + right: widget.right, + ); + } + + String _two(int v) => v.toString().padLeft(2, '0'); + + String _timestampForFilename(DateTime dt) { + // yyyyMMdd_HHmmss + return '${dt.year}${_two(dt.month)}${_two(dt.day)}_${_two(dt.hour)}${_two(dt.minute)}${_two(dt.second)}'; + } + + Future _saveResultToDownloadsAsJson( + Map result, + ) async { + if (kIsWeb) return null; + + final now = DateTime.now(); + final fileName = 'seal_check_${_timestampForFilename(now)}.json'; + + if (Platform.isAndroid) { + final dirPath = await FilePicker.getDirectoryPath(); + if (dirPath == null || dirPath.isEmpty) return null; + final String path = p.join(dirPath, fileName); + await File(path).writeAsString( + const JsonEncoder.withIndent(' ').convert(result), + flush: true, + ); + return path; + } + + Directory? downloads; + try { + downloads = await getDownloadsDirectory(); + } catch (_) { + downloads = null; + } + final dir = downloads ?? await getApplicationDocumentsDirectory(); + final String path = p.join(dir.path, fileName); + await File(path).writeAsString( + const JsonEncoder.withIndent(' ').convert(result), + flush: true, + ); + return path; + } + + Future _startMeasurement() async { + setState(() { + _isMeasuring = true; + _error = null; + _stack = null; + _leftResult = null; + _rightResult = null; + _progress = null; + }); + + try { + final results = await _session.measure(onProgress: _handleProgress); + if (!mounted) return; + + setState(() { + _leftResult = results.left; + _rightResult = results.right; + _isMeasuring = false; + _progress = null; + }); + } catch (e, st) { + if (!mounted) return; + setState(() { + _error = e; + _stack = st; + _isMeasuring = false; + _progress = null; + }); + } + } + + void _handleProgress(AudioResponseMeasurementProgress progress) { + if (!mounted) return; + setState(() { + _progress = progress; + }); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return PlatformScaffold( + appBar: PlatformAppBar( + title: Text(widget.title), + ), + body: Padding( + padding: const EdgeInsets.all(16), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: Row( + children: [ + Expanded( + child: FilledButton.icon( + onPressed: _isMeasuring ? null : _startMeasurement, + icon: const Icon(Icons.play_arrow), + label: Text(_isMeasuring ? 'Measuring…' : 'Measure'), + ), + ), + const SizedBox(width: 12), + OutlinedButton.icon( + onPressed: (_isMeasuring || !_hasAnyResult) + ? null + : () async { + final combined = { + if (_leftResult != null) + 'left': _leftResult!.toJson(), + if (_rightResult != null) + 'right': _rightResult!.toJson(), + }; + final path = + await _saveResultToDownloadsAsJson(combined); + final msg = path == null + ? 'Not saved — either not supported or you canceled.' + : 'Saved to: $path'; + if (!context.mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(msg)), + ); + }, + icon: const Icon(Icons.download), + label: const Text('Save JSON'), + ), + ], + ), + ), + const SizedBox(height: 16), + Expanded( + child: _isMeasuring + ? _buildLoading(theme) + : (_error != null) + ? _buildError(theme) + : _hasAnyResult + ? _buildResult(theme) + : Center( + child: Text( + 'Press “Measure” to start.', + style: theme.textTheme.titleMedium, + ), + ), + ), + ], + ), + ), + ); + } + + Widget _buildLoading(ThemeData theme) { + final progress = _progress; + final isUploading = + progress?.phase == AudioResponseMeasurementPhase.uploadingTone; + final uploadFraction = progress?.uploadFraction; + final progressLabel = isUploading && uploadFraction != null + ? '${(uploadFraction * 100).round()}%' + : null; + final statusText = switch (progress?.phase) { + AudioResponseMeasurementPhase.uploadingTone => progress?.totalUploads == 1 + ? 'Uploading seal-check tone…' + : 'Uploading seal-check tones…', + AudioResponseMeasurementPhase.measuringResponse => + _hasBothSides ? 'Measuring left + right…' : 'Running seal check…', + null => 'Preparing seal check…', + }; + + return Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 420), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + LinearProgressIndicator( + value: isUploading ? uploadFraction : null, + ), + const SizedBox(height: 16), + Text( + statusText, + style: theme.textTheme.titleMedium, + textAlign: TextAlign.center, + ), + if (progressLabel != null) ...[ + const SizedBox(height: 8), + Text( + progressLabel, + style: theme.textTheme.bodyMedium, + ), + ], + ], + ), + ), + ); + } + + Widget _buildError(ThemeData theme) { + return Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 600), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.error_outline, size: 48, color: theme.colorScheme.error), + const SizedBox(height: 12), + Text( + 'Measurement failed', + style: theme.textTheme.titleLarge, + ), + const SizedBox(height: 8), + Text( + _error.toString(), + style: theme.textTheme.bodyMedium, + textAlign: TextAlign.center, + ), + const SizedBox(height: 16), + FilledButton.icon( + onPressed: _startMeasurement, + icon: const Icon(Icons.replay), + label: const Text('Try again'), + ), + // If you want to show stack traces in debug builds: + if (_stack != null) + Padding( + padding: const EdgeInsets.only(top: 16), + child: Text( + _stack.toString(), + style: theme.textTheme.bodySmall + ?.copyWith(color: theme.hintColor), + ), + ), + ], + ), + ), + ); + } + + Widget _buildResult(ThemeData theme) { + List sortedPoints(AudioResponseMeasurement? result) { + final points = result?.points + .where( + (point) => point.frequencyHz > 0 && point.magnitude > 0, + ) + .toList(growable: false) ?? + []; + points.sort((a, b) => a.frequencyHz.compareTo(b.frequencyHz)); + return points; + } + + final leftPoints = sortedPoints(_leftResult); + final rightPoints = sortedPoints(_rightResult); + + // Compute a shared normalization factor (avg of all measured magnitudes) + final allMags = [ + ...leftPoints.map((point) => point.magnitude), + ...rightPoints.map((point) => point.magnitude), + ]; + final normMag = allMags.isEmpty + ? 1.0 + : allMags.reduce((a, b) => a + b) / allMags.length; + + final leftQuality = + leftPoints.isNotEmpty ? computeSealCheckQuality(leftPoints) : null; + final rightQuality = + rightPoints.isNotEmpty ? computeSealCheckQuality(rightPoints) : null; + + return SingleChildScrollView( + child: Column( + children: [ + // Summary cards + Row( + children: [ + if (leftQuality != null) ...[ + Expanded( + child: Card( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 14, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Left Quality', + style: theme.textTheme.labelMedium, + ), + const SizedBox(height: 4), + Text( + '${leftQuality.round()} / 100', + style: theme.textTheme.titleLarge, + ), + ], + ), + ), + ), + ), + if (rightQuality != null) const SizedBox(width: 8), + ], + if (rightQuality != null) + Expanded( + child: Card( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 14, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Right Quality', + style: theme.textTheme.labelMedium, + ), + const SizedBox(height: 4), + Text( + '${rightQuality.round()} / 100', + style: theme.textTheme.titleLarge, + ), + ], + ), + ), + ), + ), + ], + ), + const SizedBox(height: 8), + SizedBox( + height: 320, + child: Card( + child: Padding( + padding: const EdgeInsets.fromLTRB(8, 16, 16, 8), + child: _buildChart(theme, leftPoints, rightPoints, normMag), + ), + ), + ), + const SizedBox(height: 8), + SizedBox( + width: double.infinity, + child: OutlinedButton.icon( + onPressed: () => setState(() => _showRawValues = !_showRawValues), + icon: + Icon(_showRawValues ? Icons.expand_less : Icons.expand_more), + label: Text( + _showRawValues ? 'Hide raw values' : 'View raw values', + ), + ), + ), + if (_showRawValues) ...[ + const SizedBox(height: 8), + _buildRawValuesTabs(theme, leftPoints, rightPoints, normMag), + ], + ], + ), + ); + } + + Widget _buildChart( + ThemeData theme, + List leftPoints, + List rightPoints, + double normMag, + ) { + final colorScheme = theme.colorScheme; + const leftColor = Colors.blue; + final rightColor = colorScheme.error; + final targetColor = colorScheme.tertiary; + + // Convert to dB: 20 * log10(mag / normMag) + double toDb(double mag) => 20.0 * math.log(mag / normMag) / math.ln10; + + // Use frequency INDEX (0–8) as X so fl_chart tick placement is trivial. + // Each index corresponds to _kTargetFrequencies[index]. + List toSpots(List pts) { + final spots = []; + for (final point in pts) { + final freq = point.frequencyHz; + if (freq <= 0) continue; + spots.add( + FlSpot( + _closestTargetIndex(freq).toDouble(), + toDb(point.magnitude), + ), + ); + } + return spots; + } + + final leftSpots = toSpots(leftPoints); + final rightSpots = toSpots(rightPoints); + + // Target spots at integer indices; dB re 1.0 + final targetSpots = List.generate(_kTargetFrequencies.length, (i) { + return FlSpot( + i.toDouble(), + 20.0 * math.log(_kTargetMagnitudes[i]) / math.ln10, + ); + }); + + final allYValues = [ + ...leftSpots.map((s) => s.y), + ...rightSpots.map((s) => s.y), + ...targetSpots.map((s) => s.y), + ]; + final rawMin = allYValues.isEmpty ? -10.0 : allYValues.reduce(math.min); + final rawMax = allYValues.isEmpty ? 6.0 : allYValues.reduce(math.max); + final yMin = ((rawMin - 3).floorToDouble()).clamp(-30.0, -3.0); + final yMax = ((rawMax + 3).ceilToDouble()).clamp(3.0, 15.0); + + final lineBars = [ + // Target (dashed) + LineChartBarData( + spots: targetSpots, + color: targetColor, + barWidth: 2, + dotData: FlDotData( + show: true, + getDotPainter: (spot, percent, bar, index) => FlDotCirclePainter( + radius: 3, + color: targetColor, + strokeWidth: 0, + strokeColor: Colors.transparent, + ), + ), + dashArray: [6, 4], + isCurved: true, + curveSmoothness: 0.2, + belowBarData: BarAreaData(show: false), + ), + // Left + if (leftSpots.isNotEmpty) + LineChartBarData( + spots: leftSpots, + color: leftColor, + barWidth: 2.5, + dotData: FlDotData( + show: true, + getDotPainter: (spot, percent, bar, index) => FlDotCirclePainter( + radius: 4, + color: leftColor, + strokeWidth: 0, + strokeColor: Colors.transparent, + ), + ), + isCurved: true, + curveSmoothness: 0.2, + belowBarData: BarAreaData(show: false), + ), + // Right + if (rightSpots.isNotEmpty) + LineChartBarData( + spots: rightSpots, + color: rightColor, + barWidth: 2.5, + dotData: FlDotData( + show: true, + getDotPainter: (spot, percent, bar, index) => FlDotCirclePainter( + radius: 4, + color: rightColor, + strokeWidth: 0, + strokeColor: Colors.transparent, + ), + ), + isCurved: true, + curveSmoothness: 0.2, + belowBarData: BarAreaData(show: false), + ), + ]; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Legend + Wrap( + spacing: 16, + children: [ + if (leftSpots.isNotEmpty) _legendDot(leftColor, 'Left'), + if (rightSpots.isNotEmpty) _legendDot(rightColor, 'Right'), + _legendDash(targetColor, 'Target'), + ], + ), + const SizedBox(height: 8), + Expanded( + child: LineChart( + LineChartData( + minX: -0.5, + maxX: 8.5, + minY: yMin, + maxY: yMax, + clipData: const FlClipData.all(), + lineBarsData: lineBars, + titlesData: FlTitlesData( + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Magnitude (dB)', + style: theme.textTheme.labelSmall, + ), + axisNameSize: 16, + sideTitles: SideTitles( + showTitles: true, + reservedSize: 52, + interval: 3, + getTitlesWidget: (value, meta) => SideTitleWidget( + meta: meta, + child: Text( + '${value.toStringAsFixed(0)} dB', + style: theme.textTheme.labelSmall, + ), + ), + ), + ), + bottomTitles: AxisTitles( + axisNameWidget: Text( + 'Frequency (Hz)', + style: theme.textTheme.labelSmall, + ), + axisNameSize: 16, + sideTitles: SideTitles( + showTitles: true, + reservedSize: 48, + interval: 1.0, + getTitlesWidget: (value, meta) { + final idx = value.round(); + if ((value - idx).abs() > 0.01 || + idx < 0 || + idx >= _kTargetFrequencies.length) { + return const SizedBox.shrink(); + } + final freq = _kTargetFrequencies[idx]; + final label = freq >= 1000 + ? '${(freq / 1000).toStringAsFixed(1)}k' + : freq.toStringAsFixed(0); + return SideTitleWidget( + meta: meta, + angle: -math.pi / 3, + child: Text( + label, + style: theme.textTheme.labelSmall, + ), + ); + }, + ), + ), + topTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false), + ), + rightTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false), + ), + ), + gridData: FlGridData( + show: true, + drawVerticalLine: true, + getDrawingVerticalLine: (value) => FlLine( + color: theme.dividerColor.withAlpha(80), + strokeWidth: 0.8, + ), + getDrawingHorizontalLine: (value) => FlLine( + color: theme.dividerColor.withAlpha(80), + strokeWidth: 0.8, + ), + verticalInterval: 1.0, + checkToShowVerticalLine: (value) { + final idx = value.round(); + return (value - idx).abs() < 0.01 && + idx >= 0 && + idx < _kTargetFrequencies.length; + }, + ), + borderData: FlBorderData( + show: true, + border: Border( + bottom: BorderSide(color: theme.dividerColor), + left: BorderSide(color: theme.dividerColor), + ), + ), + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + getTooltipColor: (_) => Colors.grey.shade300, + getTooltipItems: (touchedSpots) { + return touchedSpots.map((s) { + final idx = + s.x.round().clamp(0, _kTargetFrequencies.length - 1); + final freq = _kTargetFrequencies[idx]; + final Color c; + final String sideLabel; + if (s.barIndex == 0) { + c = targetColor; + sideLabel = 'Target'; + } else if (leftSpots.isNotEmpty && s.barIndex == 1) { + c = leftColor; + sideLabel = 'Left'; + } else { + c = rightColor; + sideLabel = 'Right'; + } + return LineTooltipItem( + '$sideLabel\n${freq.toStringAsFixed(1)} Hz\n${s.y.toStringAsFixed(1)} dB', + TextStyle(color: c, fontSize: 12), + ); + }).toList(); + }, + ), + ), + ), + ), + ), + ], + ); + } + + Widget _buildRawValuesTabs( + ThemeData theme, + List leftPoints, + List rightPoints, + double normMag, + ) { + final tabs = <({String label, List points})>[]; + if (leftPoints.isNotEmpty) tabs.add((label: 'Left', points: leftPoints)); + if (rightPoints.isNotEmpty) tabs.add((label: 'Right', points: rightPoints)); + if (tabs.isEmpty) return const SizedBox.shrink(); + + // Single side: show table directly without tabs + if (tabs.length == 1) { + return SizedBox( + height: 300, + child: _buildRawValuesTable( + theme, + tabs.first.points, + normMag, + label: tabs.first.label, + ), + ); + } + + return SizedBox( + height: 300, + child: DefaultTabController( + length: tabs.length, + child: Card( + child: Column( + children: [ + TabBar( + tabs: tabs.map((t) => Tab(text: t.label)).toList(), + ), + Expanded( + child: TabBarView( + children: tabs + .map( + (t) => SingleChildScrollView( + child: _buildRawValuesTable( + theme, + t.points, + normMag, + label: t.label, + ), + ), + ) + .toList(), + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildRawValuesTable( + ThemeData theme, + List points, + double normMag, { + String label = '', + }) { + if (points.isEmpty) { + return const Padding( + padding: EdgeInsets.all(8), + child: Text('No data points.'), + ); + } + + return Card( + child: Padding( + padding: const EdgeInsets.all(8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8), + child: Text( + label.isEmpty ? 'Raw values' : 'Raw values — $label', + style: theme.textTheme.titleMedium, + ), + ), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: DataTable( + columnSpacing: 16, + headingRowHeight: 32, + dataRowMinHeight: 28, + dataRowMaxHeight: 36, + columns: const [ + DataColumn(label: Text('Freq (Hz)')), + DataColumn(label: Text('Magnitude'), numeric: true), + DataColumn(label: Text('dB'), numeric: true), + DataColumn(label: Text('Target Freq (Hz)')), + DataColumn(label: Text('Target (dB)'), numeric: true), + ], + rows: points.map((point) { + final freq = point.frequencyHz; + final mag = point.magnitude; + final db = 20.0 * math.log(mag / normMag) / math.ln10; + final tIdx = _closestTargetIndex(freq); + final tFreq = _kTargetFrequencies[tIdx]; + final tDb = + 20.0 * math.log(_kTargetMagnitudes[tIdx]) / math.ln10; + + return DataRow( + cells: [ + DataCell(Text(freq.toStringAsFixed(2))), + DataCell(Text(mag.toStringAsFixed(0))), + DataCell(Text('${db.toStringAsFixed(1)} dB')), + DataCell(Text(tFreq.toStringAsFixed(3))), + DataCell(Text('${tDb.toStringAsFixed(1)} dB')), + ], + ); + }).toList(), + ), + ), + ], + ), + ), + ); + } + + Widget _legendDot(Color color, String label) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 10, + height: 10, + decoration: BoxDecoration(color: color, shape: BoxShape.circle), + ), + const SizedBox(width: 4), + Text(label, style: const TextStyle(fontSize: 12)), + ], + ); + } + + Widget _legendDash(Color color, String label) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: 20, + height: 2, + child: CustomPaint( + painter: _DashPainter(color: color), + ), + ), + const SizedBox(width: 4), + Text(label, style: const TextStyle(fontSize: 12)), + ], + ); + } +} + +class _DashPainter extends CustomPainter { + final Color color; + const _DashPainter({required this.color}); + + @override + void paint(Canvas canvas, Size size) { + final paint = Paint() + ..color = color + ..strokeWidth = 2; + const dashWidth = 5.0; + const gap = 3.0; + double x = 0; + while (x < size.width) { + canvas.drawLine( + Offset(x, size.height / 2), + Offset((x + dashWidth).clamp(0, size.width), size.height / 2), + paint, + ); + x += dashWidth + gap; + } + } + + @override + bool shouldRepaint(_DashPainter old) => old.color != color; +} diff --git a/open_wearable/lib/apps/seal_check/seal_check_quality.dart b/open_wearable/lib/apps/seal_check/seal_check_quality.dart new file mode 100644 index 00000000..5d9f6b59 --- /dev/null +++ b/open_wearable/lib/apps/seal_check/seal_check_quality.dart @@ -0,0 +1,80 @@ +import 'dart:math' as math; + +import 'package:open_wearable/apps/seal_check/audio_response_measurement_session.dart'; + +/// Reference average peak magnitude used by the firmware quality formula. +const double sealCheckReferenceAverageMagnitude = 119.0; + +/// Reference slope used by the firmware quality formula. +const double sealCheckReferenceAverageSlope = -0.07382279460490486; + +/// Target response curve used by the firmware quality formula. +const List sealCheckTargetMagnitudes = [ + 0.90833731, + 1.18334124, + 1.38796968, + 1.16634027, + 0.85781358, + 0.65981396, + 0.84768657, + 0.98236069, + 1.00633671, +]; + +/// Computes seal-check quality with the same regression formula as firmware. +/// +/// The firmware first extracts valid peaks from the full FFT spectrum, then +/// computes quality from those valid peaks in their discovered order. The app +/// receives already-selected seal-check response points, so positive points are +/// treated as the valid peak set and are compared to [sealCheckTargetMagnitudes] +/// by index, matching the final C quality block. +double computeSealCheckQuality(List points) { + final validPoints = points + .where((point) => point.frequencyHz > 0 && point.magnitude > 0) + .toList(growable: false); + if (validPoints.length < 2) { + return 0.0; + } + + final logFrequencies = validPoints + .map((point) => math.log(point.frequencyHz)) + .toList(growable: false); + final amplitudes = + validPoints.map((point) => point.magnitude).toList(growable: false); + + final meanLogFrequency = logFrequencies.reduce((sum, value) => sum + value) / + logFrequencies.length; + final meanAmplitude = + amplitudes.reduce((sum, value) => sum + value) / amplitudes.length; + + var numerator = 0.0; + var denominator = 0.0; + for (var index = 0; index < validPoints.length; index++) { + final logFrequencyDiff = logFrequencies[index] - meanLogFrequency; + final amplitudeDiff = amplitudes[index] - meanAmplitude; + numerator += logFrequencyDiff * amplitudeDiff; + denominator += logFrequencyDiff * logFrequencyDiff; + } + + final slope = denominator == 0.0 ? 0.0 : numerator / denominator; + final averagePeakMagnitude = meanAmplitude; + + var mse = 0.0; + for (var index = 0; index < validPoints.length; index++) { + final targetMagnitude = sealCheckTargetMagnitudes[index]; + final frequencyError = + amplitudes[index] / averagePeakMagnitude - targetMagnitude; + mse += frequencyError * frequencyError; + } + mse /= validPoints.length; + + final quality = math.min( + averagePeakMagnitude / sealCheckReferenceAverageMagnitude, + 1.0, + ) - + mse - + (slope / sealCheckReferenceAverageMagnitude - + sealCheckReferenceAverageSlope); + + return (quality * 100.0).clamp(0.0, 100.0); +} diff --git a/open_wearable/lib/apps/seal_check/seal_check_tone.dart b/open_wearable/lib/apps/seal_check/seal_check_tone.dart new file mode 100644 index 00000000..f4a3a280 --- /dev/null +++ b/open_wearable/lib/apps/seal_check/seal_check_tone.dart @@ -0,0 +1,32003 @@ +/// Pregenerated signed 16-bit PCM seal-check stimulus. +const List sealCheckToneBuffer = [ + 2470, + 2689, + 2878, + 3033, + 3145, + 3210, + 3222, + 3177, + 3073, + 2907, + 2678, + 2386, + 2032, + 1618, + 1148, + 626, + 57, + -551, + -1194, + -1862, + -2547, + -3241, + -3934, + -4617, + -5281, + -5916, + -6514, + -7066, + -7564, + -8002, + -8372, + -8670, + -8891, + -9032, + -9091, + -9067, + -8960, + -8772, + -8506, + -8165, + -7756, + -7283, + -6754, + -6176, + -5559, + -4911, + -4242, + -3562, + -2880, + -2206, + -1550, + -922, + -330, + 217, + 712, + 1149, + 1522, + 1826, + 2057, + 2214, + 2294, + 2297, + 2226, + 2081, + 1866, + 1585, + 1244, + 847, + 403, + -82, + -601, + -1146, + -1708, + -2279, + -2851, + -3417, + -3969, + -4500, + -5004, + -5475, + -5908, + -6299, + -6645, + -6944, + -7195, + -7396, + -7549, + -7655, + -7716, + -7735, + -7716, + -7663, + -7580, + -7474, + -7348, + -7208, + -7060, + -6909, + -6760, + -6618, + -6487, + -6371, + -6272, + -6194, + -6138, + -6105, + -6095, + -6108, + -6142, + -6195, + -6263, + -6345, + -6435, + -6529, + -6622, + -6709, + -6784, + -6843, + -6880, + -6889, + -6867, + -6808, + -6709, + -6567, + -6380, + -6145, + -5863, + -5533, + -5156, + -4735, + -4272, + -3772, + -3240, + -2680, + -2100, + -1507, + -908, + -310, + 275, + 843, + 1382, + 1886, + 2346, + 2753, + 3101, + 3382, + 3592, + 3724, + 3776, + 3743, + 3625, + 3419, + 3128, + 2751, + 2293, + 1758, + 1149, + 473, + -261, + -1048, + -1878, + -2742, + -3631, + -4535, + -5443, + -6346, + -7234, + -8096, + -8925, + -9711, + -10447, + -11126, + -11742, + -12289, + -12765, + -13166, + -13491, + -13740, + -13914, + -14014, + -14044, + -14009, + -13913, + -13764, + -13566, + -13330, + -13061, + -12770, + -12463, + -12152, + -11843, + -11545, + -11267, + -11015, + -10798, + -10620, + -10487, + -10404, + -10374, + -10400, + -10481, + -10619, + -10813, + -11060, + -11358, + -11702, + -12087, + -12509, + -12960, + -13434, + -13923, + -14419, + -14915, + -15403, + -15876, + -16325, + -16743, + -17124, + -17462, + -17752, + -17988, + -18167, + -18287, + -18346, + -18342, + -18275, + -18148, + -17961, + -17718, + -17422, + -17078, + -16690, + -16264, + -15806, + -15323, + -14820, + -14304, + -13782, + -13260, + -12743, + -12238, + -11748, + -11279, + -10834, + -10417, + -10028, + -9670, + -9343, + -9047, + -8780, + -8541, + -8326, + -8134, + -7959, + -7797, + -7644, + -7495, + -7344, + -7186, + -7016, + -6830, + -6622, + -6388, + -6125, + -5830, + -5500, + -5135, + -4733, + -4294, + -3821, + -3314, + -2777, + -2213, + -1628, + -1026, + -414, + 202, + 815, + 1418, + 2003, + 2562, + 3087, + 3572, + 4010, + 4392, + 4714, + 4971, + 5156, + 5268, + 5303, + 5260, + 5139, + 4939, + 4664, + 4315, + 3898, + 3417, + 2879, + 2291, + 1660, + 996, + 308, + -394, + -1100, + -1801, + -2486, + -3144, + -3766, + -4342, + -4864, + -5324, + -5715, + -6030, + -6264, + -6413, + -6475, + -6449, + -6333, + -6129, + -5839, + -5466, + -5016, + -4493, + -3906, + -3260, + -2564, + -1828, + -1061, + -271, + 529, + 1332, + 2128, + 2906, + 3659, + 4377, + 5053, + 5679, + 6251, + 6762, + 7209, + 7590, + 7901, + 8143, + 8316, + 8421, + 8461, + 8439, + 8361, + 8230, + 8053, + 7836, + 7586, + 7310, + 7015, + 6709, + 6398, + 6089, + 5789, + 5504, + 5240, + 5000, + 4790, + 4612, + 4469, + 4361, + 4291, + 4257, + 4258, + 4292, + 4357, + 4448, + 4562, + 4695, + 4840, + 4994, + 5150, + 5302, + 5446, + 5576, + 5688, + 5775, + 5836, + 5865, + 5860, + 5820, + 5743, + 5628, + 5476, + 5288, + 5066, + 4814, + 4535, + 4233, + 3913, + 3580, + 3241, + 2902, + 2569, + 2248, + 1945, + 1668, + 1421, + 1210, + 1041, + 916, + 840, + 815, + 843, + 925, + 1061, + 1250, + 1489, + 1776, + 2107, + 2477, + 2881, + 3312, + 3764, + 4229, + 4700, + 5168, + 5627, + 6069, + 6484, + 6868, + 7211, + 7509, + 7755, + 7945, + 8075, + 8142, + 8145, + 8082, + 7954, + 7763, + 7511, + 7202, + 6840, + 6431, + 5982, + 5500, + 4993, + 4468, + 3936, + 3405, + 2884, + 2383, + 1909, + 1472, + 1079, + 738, + 455, + 236, + 85, + 7, + 3, + 75, + 222, + 444, + 739, + 1102, + 1529, + 2014, + 2552, + 3133, + 3750, + 4395, + 5057, + 5728, + 6396, + 7054, + 7690, + 8296, + 8862, + 9380, + 9843, + 10244, + 10576, + 10836, + 11018, + 11121, + 11143, + 11083, + 10942, + 10723, + 10428, + 10061, + 9628, + 9134, + 8586, + 7991, + 7356, + 6691, + 6004, + 5302, + 4594, + 3889, + 3194, + 2517, + 1865, + 1244, + 660, + 117, + -380, + -829, + -1228, + -1576, + -1873, + -2118, + -2314, + -2464, + -2569, + -2634, + -2663, + -2661, + -2632, + -2581, + -2514, + -2436, + -2351, + -2264, + -2179, + -2101, + -2032, + -1974, + -1929, + -1900, + -1884, + -1883, + -1895, + -1918, + -1949, + -1985, + -2021, + -2054, + -2079, + -2089, + -2081, + -2048, + -1985, + -1887, + -1750, + -1567, + -1337, + -1054, + -717, + -323, + 127, + 635, + 1200, + 1819, + 2491, + 3210, + 3973, + 4774, + 5607, + 6464, + 7338, + 8221, + 9105, + 9980, + 10838, + 11670, + 12467, + 13221, + 13924, + 14570, + 15150, + 15661, + 16096, + 16452, + 16726, + 16917, + 17024, + 17048, + 16991, + 16857, + 16648, + 16372, + 16033, + 15638, + 15197, + 14717, + 14207, + 13676, + 13135, + 12593, + 12058, + 11542, + 11052, + 10596, + 10184, + 9820, + 9512, + 9263, + 9079, + 8962, + 8913, + 8933, + 9021, + 9174, + 9390, + 9665, + 9993, + 10367, + 10782, + 11229, + 11701, + 12188, + 12682, + 13173, + 13654, + 14114, + 14546, + 14942, + 15294, + 15596, + 15842, + 16027, + 16147, + 16199, + 16182, + 16095, + 15938, + 15714, + 15424, + 15072, + 14663, + 14202, + 13696, + 13150, + 12573, + 11972, + 11355, + 10729, + 10104, + 9486, + 8883, + 8302, + 7749, + 7231, + 6753, + 6318, + 5930, + 5592, + 5305, + 5070, + 4887, + 4753, + 4668, + 4627, + 4628, + 4665, + 4734, + 4830, + 4946, + 5077, + 5217, + 5358, + 5497, + 5626, + 5742, + 5838, + 5911, + 5957, + 5973, + 5958, + 5910, + 5829, + 5715, + 5569, + 5394, + 5192, + 4967, + 4722, + 4463, + 4195, + 3922, + 3651, + 3386, + 3134, + 2900, + 2689, + 2505, + 2353, + 2237, + 2159, + 2122, + 2126, + 2173, + 2261, + 2390, + 2556, + 2758, + 2990, + 3248, + 3527, + 3820, + 4120, + 4421, + 4716, + 4996, + 5254, + 5483, + 5676, + 5826, + 5927, + 5972, + 5959, + 5881, + 5737, + 5525, + 5243, + 4891, + 4473, + 3988, + 3443, + 2840, + 2186, + 1488, + 753, + -9, + -792, + -1585, + -2378, + -3161, + -3925, + -4658, + -5352, + -5997, + -6583, + -7105, + -7553, + -7921, + -8205, + -8400, + -8503, + -8512, + -8427, + -8249, + -7979, + -7622, + -7181, + -6662, + -6072, + -5418, + -4708, + -3952, + -3158, + -2338, + -1500, + -655, + 185, + 1014, + 1820, + 2595, + 3330, + 4018, + 4651, + 5226, + 5735, + 6177, + 6549, + 6849, + 7076, + 7233, + 7320, + 7341, + 7299, + 7199, + 7047, + 6848, + 6608, + 6336, + 6037, + 5718, + 5388, + 5052, + 4717, + 4390, + 4075, + 3779, + 3504, + 3255, + 3035, + 2844, + 2685, + 2556, + 2458, + 2388, + 2344, + 2323, + 2322, + 2334, + 2357, + 2385, + 2412, + 2433, + 2443, + 2436, + 2408, + 2354, + 2269, + 2151, + 1996, + 1803, + 1569, + 1294, + 979, + 625, + 234, + -191, + -648, + -1131, + -1636, + -2156, + -2687, + -3222, + -3753, + -4275, + -4781, + -5265, + -5719, + -6139, + -6519, + -6853, + -7139, + -7373, + -7552, + -7675, + -7741, + -7751, + -7707, + -7610, + -7463, + -7272, + -7040, + -6774, + -6480, + -6165, + -5835, + -5500, + -5165, + -4840, + -4531, + -4246, + -3991, + -3774, + -3599, + -3472, + -3397, + -3377, + -3414, + -3509, + -3663, + -3873, + -4138, + -4455, + -4818, + -5224, + -5665, + -6135, + -6626, + -7130, + -7639, + -8142, + -8632, + -9100, + -9536, + -9932, + -10279, + -10572, + -10802, + -10964, + -11053, + -11065, + -10998, + -10849, + -10620, + -10310, + -9921, + -9458, + -8923, + -8324, + -7666, + -6957, + -6205, + -5420, + -4609, + -3784, + -2954, + -2130, + -1321, + -537, + 211, + 917, + 1570, + 2164, + 2693, + 3149, + 3530, + 3831, + 4050, + 4186, + 4239, + 4210, + 4101, + 3917, + 3660, + 3337, + 2954, + 2517, + 2033, + 1510, + 957, + 381, + -208, + -804, + -1399, + -1984, + -2554, + -3101, + -3621, + -4107, + -4557, + -4966, + -5333, + -5657, + -5936, + -6172, + -6365, + -6519, + -6634, + -6717, + -6769, + -6796, + -6802, + -6793, + -6774, + -6749, + -6724, + -6703, + -6690, + -6690, + -6706, + -6740, + -6794, + -6870, + -6968, + -7088, + -7228, + -7387, + -7562, + -7749, + -7945, + -8146, + -8345, + -8539, + -8721, + -8885, + -9027, + -9140, + -9220, + -9260, + -9257, + -9207, + -9107, + -8953, + -8745, + -8481, + -8162, + -7788, + -7363, + -6888, + -6368, + -5808, + -5213, + -4590, + -3946, + -3288, + -2624, + -1963, + -1313, + -683, + -81, + 485, + 1007, + 1478, + 1892, + 2243, + 2526, + 2736, + 2872, + 2931, + 2913, + 2818, + 2649, + 2407, + 2098, + 1726, + 1296, + 818, + 297, + -256, + -835, + -1429, + -2029, + -2624, + -3205, + -3762, + -4287, + -4770, + -5204, + -5581, + -5896, + -6141, + -6314, + -6412, + -6431, + -6371, + -6233, + -6018, + -5729, + -5370, + -4946, + -4462, + -3927, + -3346, + -2728, + -2083, + -1418, + -743, + -67, + 600, + 1250, + 1876, + 2468, + 3019, + 3524, + 3976, + 4371, + 4705, + 4977, + 5184, + 5326, + 5404, + 5419, + 5376, + 5277, + 5127, + 4932, + 4698, + 4431, + 4139, + 3829, + 3508, + 3185, + 2866, + 2559, + 2271, + 2007, + 1774, + 1577, + 1419, + 1305, + 1236, + 1215, + 1241, + 1315, + 1434, + 1598, + 1802, + 2044, + 2318, + 2619, + 2942, + 3281, + 3630, + 3981, + 4330, + 4669, + 4993, + 5296, + 5572, + 5818, + 6028, + 6200, + 6331, + 6420, + 6465, + 6466, + 6425, + 6342, + 6220, + 6063, + 5874, + 5658, + 5418, + 5161, + 4892, + 4617, + 4341, + 4069, + 3807, + 3559, + 3332, + 3127, + 2949, + 2800, + 2681, + 2595, + 2540, + 2516, + 2522, + 2554, + 2609, + 2683, + 2771, + 2867, + 2965, + 3058, + 3140, + 3203, + 3240, + 3244, + 3208, + 3125, + 2990, + 2797, + 2540, + 2217, + 1824, + 1359, + 822, + 212, + -469, + -1219, + -2034, + -2910, + -3840, + -4818, + -5836, + -6887, + -7959, + -9045, + -10134, + -11214, + -12277, + -13312, + -14307, + -15254, + -16143, + -16965, + -17712, + -18377, + -18954, + -19439, + -19826, + -20114, + -20302, + -20389, + -20376, + -20266, + -20063, + -19772, + -19399, + -18950, + -18433, + -17857, + -17230, + -16563, + -15866, + -15147, + -14418, + -13687, + -12965, + -12261, + -11583, + -10939, + -10335, + -9778, + -9273, + -8824, + -8434, + -8105, + -7837, + -7629, + -7482, + -7391, + -7355, + -7367, + -7425, + -7521, + -7650, + -7805, + -7980, + -8167, + -8360, + -8551, + -8735, + -8906, + -9057, + -9184, + -9282, + -9348, + -9379, + -9373, + -9329, + -9248, + -9130, + -8976, + -8790, + -8573, + -8331, + -8068, + -7788, + -7497, + -7201, + -6905, + -6615, + -6337, + -6076, + -5837, + -5624, + -5443, + -5297, + -5188, + -5118, + -5088, + -5100, + -5152, + -5243, + -5371, + -5533, + -5725, + -5943, + -6182, + -6436, + -6700, + -6966, + -7230, + -7484, + -7722, + -7938, + -8126, + -8281, + -8398, + -8473, + -8503, + -8484, + -8416, + -8297, + -8128, + -7909, + -7643, + -7333, + -6983, + -6598, + -6182, + -5743, + -5286, + -4819, + -4350, + -3886, + -3435, + -3004, + -2601, + -2233, + -1906, + -1627, + -1400, + -1230, + -1120, + -1074, + -1091, + -1172, + -1318, + -1524, + -1790, + -2110, + -2479, + -2892, + -3342, + -3820, + -4320, + -4831, + -5345, + -5854, + -6347, + -6815, + -7250, + -7643, + -7986, + -8272, + -8494, + -8647, + -8726, + -8728, + -8651, + -8493, + -8255, + -7938, + -7545, + -7079, + -6545, + -5949, + -5297, + -4599, + -3862, + -3094, + -2306, + -1507, + -707, + 83, + 855, + 1599, + 2307, + 2969, + 3578, + 4127, + 4611, + 5024, + 5363, + 5625, + 5809, + 5914, + 5942, + 5893, + 5772, + 5582, + 5328, + 5016, + 4652, + 4244, + 3800, + 3326, + 2832, + 2325, + 1814, + 1306, + 809, + 330, + -123, + -546, + -934, + -1282, + -1587, + -1846, + -2057, + -2221, + -2337, + -2406, + -2431, + -2414, + -2359, + -2269, + -2150, + -2006, + -1842, + -1663, + -1476, + -1284, + -1095, + -911, + -737, + -577, + -435, + -312, + -211, + -133, + -77, + -44, + -32, + -39, + -62, + -98, + -142, + -191, + -239, + -281, + -312, + -327, + -320, + -285, + -218, + -115, + 27, + 215, + 448, + 730, + 1060, + 1440, + 1868, + 2341, + 2859, + 3416, + 4008, + 4629, + 5274, + 5934, + 6604, + 7275, + 7938, + 8585, + 9208, + 9797, + 10346, + 10845, + 11288, + 11667, + 11976, + 12211, + 12367, + 12441, + 12430, + 12334, + 12153, + 11889, + 11543, + 11119, + 10623, + 10061, + 9438, + 8763, + 8044, + 7290, + 6510, + 5715, + 4914, + 4118, + 3335, + 2577, + 1852, + 1168, + 533, + -44, + -559, + -1007, + -1383, + -1685, + -1911, + -2060, + -2133, + -2133, + -2062, + -1924, + -1725, + -1470, + -1168, + -824, + -448, + -47, + 369, + 792, + 1214, + 1624, + 2017, + 2383, + 2715, + 3007, + 3254, + 3451, + 3595, + 3682, + 3711, + 3682, + 3596, + 3454, + 3258, + 3014, + 2725, + 2397, + 2036, + 1649, + 1242, + 824, + 403, + -14, + -420, + -806, + -1167, + -1494, + -1782, + -2025, + -2219, + -2360, + -2446, + -2473, + -2441, + -2350, + -2201, + -1996, + -1737, + -1428, + -1074, + -679, + -248, + 211, + 694, + 1194, + 1704, + 2218, + 2729, + 3232, + 3721, + 4190, + 4636, + 5054, + 5442, + 5796, + 6116, + 6400, + 6650, + 6865, + 7048, + 7202, + 7329, + 7433, + 7519, + 7590, + 7653, + 7713, + 7774, + 7841, + 7921, + 8016, + 8133, + 8274, + 8442, + 8640, + 8871, + 9133, + 9428, + 9755, + 10111, + 10495, + 10902, + 11328, + 11768, + 12216, + 12666, + 13111, + 13543, + 13955, + 14340, + 14689, + 14997, + 15254, + 15456, + 15594, + 15666, + 15664, + 15587, + 15431, + 15194, + 14877, + 14478, + 14001, + 13448, + 12824, + 12132, + 11381, + 10575, + 9724, + 8836, + 7921, + 6988, + 6048, + 5110, + 4186, + 3284, + 2417, + 1592, + 819, + 107, + -537, + -1108, + -1599, + -2006, + -2327, + -2558, + -2700, + -2753, + -2719, + -2601, + -2404, + -2133, + -1794, + -1394, + -942, + -446, + 84, + 640, + 1211, + 1789, + 2362, + 2921, + 3459, + 3966, + 4434, + 4857, + 5228, + 5543, + 5796, + 5986, + 6110, + 6168, + 6159, + 6086, + 5950, + 5755, + 5505, + 5206, + 4863, + 4482, + 4070, + 3635, + 3183, + 2722, + 2259, + 1801, + 1354, + 926, + 521, + 145, + -198, + -506, + -775, + -1003, + -1190, + -1337, + -1443, + -1512, + -1544, + -1545, + -1517, + -1465, + -1394, + -1310, + -1218, + -1123, + -1031, + -946, + -876, + -823, + -792, + -786, + -810, + -864, + -950, + -1070, + -1221, + -1405, + -1618, + -1858, + -2121, + -2403, + -2701, + -3007, + -3316, + -3623, + -3921, + -4204, + -4466, + -4699, + -4900, + -5061, + -5178, + -5248, + -5266, + -5229, + -5136, + -4986, + -4779, + -4515, + -4197, + -3828, + -3410, + -2950, + -2453, + -1924, + -1370, + -799, + -218, + 363, + 939, + 1502, + 2042, + 2552, + 3026, + 3458, + 3840, + 4168, + 4438, + 4647, + 4793, + 4874, + 4891, + 4845, + 4738, + 4573, + 4355, + 4089, + 3782, + 3440, + 3070, + 2683, + 2285, + 1885, + 1493, + 1118, + 769, + 453, + 179, + -45, + -215, + -323, + -365, + -337, + -238, + -64, + 182, + 502, + 893, + 1350, + 1871, + 2448, + 3076, + 3746, + 4451, + 5182, + 5930, + 6685, + 7436, + 8175, + 8891, + 9575, + 10217, + 10810, + 11344, + 11814, + 12213, + 12536, + 12778, + 12937, + 13011, + 12999, + 12902, + 12721, + 12459, + 12121, + 11710, + 11232, + 10695, + 10105, + 9469, + 8796, + 8094, + 7371, + 6637, + 5898, + 5164, + 4441, + 3737, + 3058, + 2410, + 1798, + 1225, + 695, + 211, + -226, + -617, + -962, + -1262, + -1519, + -1736, + -1917, + -2066, + -2186, + -2283, + -2363, + -2429, + -2487, + -2542, + -2598, + -2660, + -2732, + -2816, + -2915, + -3031, + -3165, + -3317, + -3488, + -3675, + -3878, + -4092, + -4315, + -4543, + -4771, + -4995, + -5209, + -5408, + -5586, + -5738, + -5858, + -5941, + -5984, + -5980, + -5928, + -5823, + -5664, + -5449, + -5179, + -4853, + -4474, + -4043, + -3564, + -3041, + -2481, + -1888, + -1270, + -633, + 13, + 661, + 1303, + 1930, + 2532, + 3102, + 3631, + 4111, + 4535, + 4897, + 5190, + 5410, + 5553, + 5616, + 5598, + 5497, + 5315, + 5053, + 4715, + 4304, + 3826, + 3287, + 2694, + 2055, + 1377, + 672, + -53, + -788, + -1522, + -2247, + -2953, + -3631, + -4272, + -4867, + -5412, + -5898, + -6320, + -6676, + -6960, + -7172, + -7311, + -7378, + -7373, + -7301, + -7164, + -6968, + -6720, + -6424, + -6090, + -5725, + -5337, + -4936, + -4530, + -4127, + -3738, + -3370, + -3032, + -2730, + -2472, + -2263, + -2108, + -2012, + -1978, + -2007, + -2101, + -2258, + -2479, + -2759, + -3097, + -3486, + -3923, + -4402, + -4914, + -5454, + -6014, + -6586, + -7162, + -7735, + -8295, + -8836, + -9352, + -9834, + -10277, + -10677, + -11028, + -11327, + -11571, + -11759, + -11891, + -11965, + -11984, + -11949, + -11864, + -11732, + -11558, + -11346, + -11101, + -10830, + -10539, + -10234, + -9920, + -9605, + -9293, + -8990, + -8701, + -8431, + -8183, + -7961, + -7766, + -7600, + -7464, + -7358, + -7280, + -7229, + -7203, + -7197, + -7209, + -7234, + -7266, + -7301, + -7334, + -7358, + -7369, + -7361, + -7330, + -7269, + -7176, + -7046, + -6878, + -6667, + -6414, + -6117, + -5778, + -5397, + -4977, + -4520, + -4032, + -3516, + -2978, + -2424, + -1861, + -1297, + -737, + -191, + 334, + 831, + 1293, + 1713, + 2083, + 2399, + 2655, + 2848, + 2972, + 3028, + 3013, + 2927, + 2771, + 2547, + 2260, + 1913, + 1511, + 1062, + 572, + 49, + -496, + -1056, + -1621, + -2180, + -2724, + -3243, + -3727, + -4166, + -4552, + -4877, + -5133, + -5314, + -5414, + -5428, + -5355, + -5192, + -4937, + -4593, + -4159, + -3641, + -3042, + -2366, + -1622, + -816, + 43, + 948, + 1889, + 2855, + 3836, + 4823, + 5805, + 6772, + 7715, + 8625, + 9493, + 10311, + 11074, + 11774, + 12407, + 12969, + 13457, + 13870, + 14208, + 14471, + 14660, + 14779, + 14831, + 14821, + 14754, + 14635, + 14472, + 14270, + 14038, + 13781, + 13508, + 13226, + 12939, + 12657, + 12383, + 12123, + 11882, + 11662, + 11468, + 11302, + 11163, + 11053, + 10971, + 10915, + 10883, + 10873, + 10880, + 10901, + 10930, + 10964, + 10995, + 11021, + 11034, + 11030, + 11003, + 10950, + 10865, + 10746, + 10590, + 10394, + 10156, + 9877, + 9556, + 9194, + 8794, + 8357, + 7889, + 7392, + 6872, + 6334, + 5784, + 5229, + 4674, + 4128, + 3596, + 3085, + 2602, + 2152, + 1741, + 1374, + 1056, + 789, + 576, + 420, + 320, + 277, + 290, + 356, + 473, + 636, + 840, + 1081, + 1352, + 1647, + 1957, + 2276, + 2596, + 2910, + 3209, + 3487, + 3736, + 3951, + 4125, + 4253, + 4330, + 4355, + 4324, + 4235, + 4090, + 3888, + 3633, + 3326, + 2972, + 2576, + 2144, + 1683, + 1201, + 705, + 204, + -292, + -776, + -1238, + -1669, + -2061, + -2405, + -2694, + -2922, + -3081, + -3168, + -3177, + -3107, + -2955, + -2721, + -2405, + -2010, + -1538, + -995, + -384, + 286, + 1010, + 1780, + 2585, + 3417, + 4266, + 5123, + 5975, + 6815, + 7631, + 8415, + 9156, + 9847, + 10480, + 11048, + 11545, + 11967, + 12309, + 12569, + 12745, + 12838, + 12848, + 12777, + 12628, + 12406, + 12115, + 11762, + 11352, + 10893, + 10393, + 9859, + 9300, + 8723, + 8137, + 7549, + 6968, + 6399, + 5850, + 5326, + 4833, + 4373, + 3951, + 3569, + 3229, + 2930, + 2673, + 2456, + 2278, + 2135, + 2024, + 1942, + 1883, + 1843, + 1817, + 1800, + 1787, + 1772, + 1751, + 1719, + 1673, + 1609, + 1524, + 1416, + 1283, + 1126, + 944, + 737, + 509, + 261, + -2, + -279, + -565, + -854, + -1141, + -1421, + -1688, + -1936, + -2160, + -2354, + -2514, + -2634, + -2711, + -2742, + -2722, + -2652, + -2529, + -2354, + -2127, + -1851, + -1528, + -1162, + -758, + -320, + 143, + 627, + 1123, + 1624, + 2121, + 2606, + 3071, + 3506, + 3905, + 4259, + 4561, + 4805, + 4984, + 5093, + 5129, + 5089, + 4971, + 4773, + 4497, + 4144, + 3717, + 3219, + 2656, + 2033, + 1358, + 638, + -117, + -900, + -1702, + -2511, + -3319, + -4115, + -4891, + -5635, + -6340, + -6998, + -7600, + -8141, + -8614, + -9014, + -9339, + -9586, + -9754, + -9842, + -9853, + -9788, + -9651, + -9446, + -9180, + -8859, + -8490, + -8081, + -7641, + -7177, + -6700, + -6219, + -5741, + -5277, + -4834, + -4421, + -4044, + -3710, + -3425, + -3194, + -3019, + -2904, + -2850, + -2858, + -2927, + -3055, + -3239, + -3476, + -3761, + -4089, + -4453, + -4847, + -5264, + -5696, + -6136, + -6576, + -7008, + -7426, + -7821, + -8189, + -8522, + -8816, + -9065, + -9268, + -9420, + -9520, + -9567, + -9562, + -9505, + -9398, + -9245, + -9049, + -8814, + -8545, + -8248, + -7928, + -7592, + -7246, + -6897, + -6550, + -6212, + -5888, + -5584, + -5304, + -5054, + -4835, + -4652, + -4505, + -4396, + -4326, + -4292, + -4295, + -4332, + -4400, + -4495, + -4613, + -4749, + -4899, + -5057, + -5217, + -5374, + -5522, + -5657, + -5772, + -5865, + -5929, + -5963, + -5964, + -5930, + -5859, + -5752, + -5609, + -5432, + -5224, + -4988, + -4728, + -4449, + -4156, + -3857, + -3557, + -3264, + -2985, + -2727, + -2497, + -2302, + -2150, + -2047, + -1998, + -2008, + -2081, + -2222, + -2431, + -2711, + -3062, + -3482, + -3970, + -4522, + -5133, + -5799, + -6513, + -7268, + -8055, + -8866, + -9691, + -10520, + -11343, + -12149, + -12929, + -13672, + -14368, + -15009, + -15584, + -16087, + -16509, + -16845, + -17091, + -17241, + -17293, + -17246, + -17100, + -16855, + -16515, + -16082, + -15562, + -14960, + -14284, + -13541, + -12739, + -11888, + -10996, + -10075, + -9135, + -8184, + -7234, + -6294, + -5373, + -4480, + -3623, + -2809, + -2045, + -1336, + -686, + -99, + 423, + 880, + 1271, + 1598, + 1863, + 2068, + 2218, + 2318, + 2372, + 2388, + 2371, + 2328, + 2265, + 2191, + 2110, + 2031, + 1959, + 1900, + 1858, + 1838, + 1845, + 1880, + 1946, + 2044, + 2174, + 2335, + 2526, + 2745, + 2988, + 3252, + 3533, + 3824, + 4123, + 4422, + 4715, + 4999, + 5265, + 5510, + 5728, + 5914, + 6064, + 6174, + 6242, + 6265, + 6242, + 6173, + 6057, + 5897, + 5694, + 5450, + 5171, + 4859, + 4521, + 4160, + 3785, + 3399, + 3011, + 2626, + 2251, + 1893, + 1556, + 1247, + 971, + 731, + 533, + 378, + 268, + 205, + 188, + 218, + 291, + 406, + 558, + 743, + 957, + 1193, + 1444, + 1704, + 1965, + 2220, + 2461, + 2681, + 2872, + 3027, + 3141, + 3206, + 3219, + 3173, + 3066, + 2896, + 2661, + 2360, + 1994, + 1565, + 1076, + 532, + -63, + -704, + -1382, + -2092, + -2824, + -3569, + -4319, + -5064, + -5795, + -6503, + -7178, + -7811, + -8395, + -8923, + -9386, + -9780, + -10099, + -10340, + -10501, + -10579, + -10574, + -10488, + -10323, + -10082, + -9770, + -9392, + -8954, + -8465, + -7933, + -7366, + -6773, + -6164, + -5550, + -4939, + -4341, + -3766, + -3223, + -2720, + -2265, + -1865, + -1525, + -1251, + -1047, + -915, + -858, + -875, + -966, + -1129, + -1361, + -1659, + -2017, + -2430, + -2892, + -3395, + -3933, + -4496, + -5077, + -5668, + -6260, + -6846, + -7417, + -7968, + -8490, + -8979, + -9428, + -9834, + -10193, + -10501, + -10759, + -10963, + -11116, + -11217, + -11269, + -11274, + -11236, + -11158, + -11046, + -10903, + -10735, + -10548, + -10346, + -10136, + -9922, + -9709, + -9501, + -9304, + -9119, + -8950, + -8798, + -8665, + -8552, + -8458, + -8382, + -8322, + -8275, + -8239, + -8210, + -8182, + -8153, + -8115, + -8065, + -7997, + -7905, + -7784, + -7631, + -7439, + -7205, + -6926, + -6600, + -6224, + -5797, + -5319, + -4791, + -4215, + -3594, + -2931, + -2231, + -1499, + -742, + 33, + 821, + 1611, + 2396, + 3168, + 3917, + 4635, + 5313, + 5944, + 6520, + 7033, + 7478, + 7849, + 8142, + 8352, + 8478, + 8518, + 8472, + 8341, + 8128, + 7835, + 7467, + 7030, + 6531, + 5976, + 5375, + 4735, + 4066, + 3378, + 2681, + 1984, + 1298, + 631, + -5, + -604, + -1157, + -1657, + -2098, + -2475, + -2783, + -3019, + -3182, + -3270, + -3286, + -3229, + -3104, + -2913, + -2663, + -2359, + -2008, + -1617, + -1195, + -749, + -289, + 176, + 639, + 1091, + 1522, + 1926, + 2295, + 2622, + 2902, + 3130, + 3302, + 3415, + 3468, + 3460, + 3391, + 3264, + 3080, + 2843, + 2558, + 2229, + 1864, + 1469, + 1051, + 617, + 175, + -266, + -700, + -1119, + -1515, + -1882, + -2212, + -2502, + -2745, + -2938, + -3078, + -3162, + -3189, + -3159, + -3073, + -2931, + -2737, + -2494, + -2206, + -1878, + -1514, + -1122, + -706, + -273, + 168, + 615, + 1060, + 1496, + 1918, + 2321, + 2701, + 3053, + 3374, + 3663, + 3916, + 4134, + 4317, + 4465, + 4581, + 4666, + 4724, + 4759, + 4775, + 4776, + 4767, + 4755, + 4743, + 4738, + 4745, + 4767, + 4811, + 4879, + 4975, + 5101, + 5261, + 5454, + 5680, + 5940, + 6232, + 6553, + 6899, + 7267, + 7652, + 8048, + 8449, + 8847, + 9237, + 9610, + 9960, + 10277, + 10556, + 10789, + 10969, + 11090, + 11146, + 11133, + 11047, + 10886, + 10646, + 10328, + 9931, + 9458, + 8911, + 8294, + 7612, + 6870, + 6076, + 5238, + 4364, + 3463, + 2545, + 1620, + 698, + -208, + -1092, + -1941, + -2747, + -3499, + -4191, + -4813, + -5360, + -5825, + -6205, + -6496, + -6696, + -6803, + -6819, + -6745, + -6584, + -6341, + -6019, + -5626, + -5169, + -4655, + -4094, + -3493, + -2864, + -2215, + -1556, + -898, + -249, + 380, + 983, + 1551, + 2076, + 2553, + 2975, + 3339, + 3641, + 3879, + 4051, + 4159, + 4202, + 4184, + 4107, + 3975, + 3794, + 3568, + 3304, + 3008, + 2688, + 2350, + 2003, + 1652, + 1305, + 969, + 650, + 353, + 84, + -152, + -354, + -518, + -642, + -726, + -769, + -772, + -738, + -668, + -566, + -435, + -281, + -108, + 77, + 272, + 469, + 664, + 849, + 1021, + 1174, + 1305, + 1409, + 1483, + 1524, + 1532, + 1506, + 1444, + 1349, + 1221, + 1064, + 881, + 675, + 451, + 215, + -27, + -271, + -510, + -738, + -947, + -1133, + -1289, + -1410, + -1491, + -1527, + -1515, + -1452, + -1335, + -1164, + -939, + -660, + -329, + 51, + 477, + 944, + 1447, + 1980, + 2536, + 3107, + 3688, + 4269, + 4842, + 5400, + 5935, + 6439, + 6905, + 7327, + 7698, + 8014, + 8269, + 8462, + 8589, + 8649, + 8642, + 8569, + 8432, + 8235, + 7982, + 7677, + 7327, + 6938, + 6519, + 6078, + 5623, + 5163, + 4707, + 4264, + 3844, + 3453, + 3102, + 2797, + 2544, + 2351, + 2221, + 2160, + 2169, + 2251, + 2406, + 2633, + 2930, + 3295, + 3722, + 4208, + 4744, + 5325, + 5942, + 6587, + 7250, + 7922, + 8593, + 9254, + 9894, + 10504, + 11075, + 11599, + 12067, + 12472, + 12809, + 13071, + 13254, + 13357, + 13375, + 13309, + 13160, + 12928, + 12616, + 12228, + 11769, + 11244, + 10659, + 10023, + 9342, + 8624, + 7878, + 7112, + 6335, + 5555, + 4781, + 4019, + 3278, + 2563, + 1882, + 1238, + 636, + 80, + -427, + -885, + -1293, + -1651, + -1960, + -2222, + -2441, + -2618, + -2758, + -2866, + -2946, + -3003, + -3042, + -3068, + -3086, + -3100, + -3115, + -3135, + -3163, + -3202, + -3253, + -3318, + -3397, + -3490, + -3596, + -3714, + -3839, + -3971, + -4104, + -4234, + -4356, + -4466, + -4557, + -4625, + -4663, + -4667, + -4632, + -4552, + -4423, + -4242, + -4006, + -3712, + -3359, + -2946, + -2474, + -1945, + -1360, + -723, + -38, + 688, + 1452, + 2247, + 3063, + 3895, + 4733, + 5569, + 6394, + 7199, + 7976, + 8716, + 9411, + 10054, + 10637, + 11156, + 11604, + 11977, + 12273, + 12489, + 12625, + 12680, + 12657, + 12557, + 12385, + 12146, + 11845, + 11489, + 11086, + 10644, + 10172, + 9679, + 9174, + 8667, + 8168, + 7686, + 7231, + 6809, + 6431, + 6102, + 5829, + 5617, + 5471, + 5393, + 5386, + 5451, + 5587, + 5792, + 6064, + 6398, + 6790, + 7235, + 7724, + 8252, + 8809, + 9388, + 9979, + 10573, + 11162, + 11736, + 12286, + 12806, + 13286, + 13720, + 14102, + 14425, + 14687, + 14884, + 15013, + 15073, + 15064, + 14987, + 14845, + 14640, + 14376, + 14059, + 13695, + 13289, + 12848, + 12381, + 11895, + 11397, + 10896, + 10400, + 9915, + 9449, + 9009, + 8600, + 8228, + 7897, + 7612, + 7374, + 7186, + 7049, + 6962, + 6924, + 6934, + 6988, + 7084, + 7217, + 7381, + 7572, + 7785, + 8012, + 8248, + 8486, + 8722, + 8948, + 9159, + 9350, + 9518, + 9657, + 9764, + 9838, + 9876, + 9879, + 9845, + 9775, + 9673, + 9539, + 9377, + 9190, + 8984, + 8763, + 8532, + 8297, + 8062, + 7835, + 7619, + 7420, + 7244, + 7094, + 6975, + 6889, + 6839, + 6826, + 6851, + 6915, + 7015, + 7151, + 7319, + 7515, + 7735, + 7975, + 8226, + 8485, + 8742, + 8992, + 9227, + 9439, + 9620, + 9764, + 9864, + 9914, + 9906, + 9837, + 9702, + 9498, + 9223, + 8874, + 8453, + 7959, + 7396, + 6766, + 6073, + 5324, + 4525, + 3682, + 2804, + 1900, + 980, + 52, + -872, + -1784, + -2672, + -3528, + -4340, + -5101, + -5801, + -6434, + -6991, + -7468, + -7859, + -8162, + -8373, + -8492, + -8519, + -8455, + -8304, + -8068, + -7754, + -7366, + -6913, + -6402, + -5841, + -5241, + -4610, + -3958, + -3296, + -2633, + -1980, + -1346, + -740, + -170, + 355, + 829, + 1247, + 1602, + 1891, + 2112, + 2261, + 2340, + 2348, + 2287, + 2159, + 1969, + 1720, + 1418, + 1069, + 678, + 253, + -198, + -670, + -1155, + -1646, + -2135, + -2618, + -3087, + -3538, + -3965, + -4365, + -4735, + -5073, + -5377, + -5647, + -5883, + -6086, + -6259, + -6405, + -6526, + -6628, + -6714, + -6789, + -6860, + -6930, + -7005, + -7092, + -7194, + -7316, + -7463, + -7638, + -7845, + -8086, + -8363, + -8676, + -9025, + -9410, + -9829, + -10279, + -10757, + -11259, + -11781, + -12316, + -12860, + -13405, + -13946, + -14476, + -14988, + -15475, + -15932, + -16352, + -16730, + -17061, + -17340, + -17563, + -17729, + -17835, + -17881, + -17866, + -17791, + -17659, + -17472, + -17235, + -16952, + -16628, + -16270, + -15884, + -15478, + -15059, + -14634, + -14212, + -13800, + -13406, + -13037, + -12699, + -12399, + -12142, + -11932, + -11773, + -11668, + -11618, + -11624, + -11685, + -11799, + -11964, + -12176, + -12430, + -12720, + -13039, + -13382, + -13738, + -14101, + -14461, + -14810, + -15138, + -15437, + -15699, + -15914, + -16076, + -16178, + -16213, + -16176, + -16064, + -15872, + -15600, + -15247, + -14812, + -14298, + -13708, + -13046, + -12316, + -11526, + -10683, + -9794, + -8868, + -7915, + -6944, + -5966, + -4991, + -4028, + -3088, + -2181, + -1316, + -501, + 255, + 946, + 1566, + 2109, + 2571, + 2950, + 3244, + 3452, + 3575, + 3615, + 3575, + 3458, + 3270, + 3016, + 2702, + 2336, + 1925, + 1476, + 999, + 501, + -9, + -525, + -1038, + -1541, + -2028, + -2493, + -2930, + -3336, + -3706, + -4039, + -4332, + -4584, + -4797, + -4971, + -5107, + -5209, + -5279, + -5322, + -5341, + -5342, + -5329, + -5308, + -5283, + -5260, + -5243, + -5237, + -5246, + -5273, + -5322, + -5393, + -5490, + -5612, + -5760, + -5933, + -6128, + -6345, + -6578, + -6826, + -7083, + -7345, + -7606, + -7862, + -8105, + -8331, + -8533, + -8707, + -8847, + -8948, + -9006, + -9017, + -8979, + -8890, + -8747, + -8552, + -8304, + -8005, + -7658, + -7266, + -6834, + -6367, + -5870, + -5352, + -4818, + -4276, + -3736, + -3204, + -2690, + -2202, + -1748, + -1335, + -971, + -663, + -417, + -238, + -129, + -94, + -136, + -255, + -451, + -722, + -1066, + -1479, + -1957, + -2494, + -3082, + -3715, + -4383, + -5079, + -5792, + -6514, + -7233, + -7941, + -8628, + -9283, + -9899, + -10466, + -10978, + -11427, + -11807, + -12114, + -12343, + -12493, + -12561, + -12549, + -12456, + -12284, + -12038, + -11722, + -11341, + -10902, + -10412, + -9878, + -9309, + -8713, + -8101, + -7481, + -6861, + -6251, + -5660, + -5095, + -4564, + -4074, + -3629, + -3236, + -2899, + -2619, + -2399, + -2240, + -2141, + -2101, + -2117, + -2186, + -2304, + -2464, + -2662, + -2890, + -3143, + -3412, + -3690, + -3969, + -4242, + -4502, + -4741, + -4954, + -5133, + -5275, + -5374, + -5426, + -5430, + -5382, + -5282, + -5131, + -4929, + -4677, + -4380, + -4039, + -3661, + -3249, + -2808, + -2346, + -1868, + -1380, + -889, + -401, + 76, + 539, + 981, + 1397, + 1784, + 2136, + 2451, + 2727, + 2964, + 3159, + 3314, + 3430, + 3508, + 3553, + 3566, + 3552, + 3516, + 3463, + 3397, + 3325, + 3251, + 3182, + 3122, + 3076, + 3050, + 3047, + 3070, + 3122, + 3206, + 3323, + 3472, + 3653, + 3865, + 4105, + 4370, + 4656, + 4958, + 5271, + 5588, + 5903, + 6209, + 6498, + 6764, + 6999, + 7196, + 7348, + 7449, + 7493, + 7474, + 7389, + 7234, + 7006, + 6704, + 6328, + 5878, + 5356, + 4766, + 4111, + 3397, + 2630, + 1818, + 967, + 88, + -809, + -1717, + -2625, + -3521, + -4396, + -5239, + -6040, + -6790, + -7480, + -8102, + -8647, + -9111, + -9486, + -9770, + -9959, + -10051, + -10047, + -9946, + -9750, + -9464, + -9091, + -8638, + -8110, + -7515, + -6861, + -6158, + -5415, + -4641, + -3846, + -3041, + -2235, + -1438, + -660, + 91, + 807, + 1481, + 2106, + 2677, + 3189, + 3639, + 4025, + 4345, + 4600, + 4791, + 4919, + 4987, + 5001, + 4963, + 4881, + 4759, + 4604, + 4423, + 4223, + 4011, + 3793, + 3576, + 3368, + 3172, + 2996, + 2843, + 2717, + 2622, + 2559, + 2531, + 2537, + 2577, + 2650, + 2755, + 2887, + 3044, + 3221, + 3413, + 3617, + 3825, + 4033, + 4234, + 4424, + 4597, + 4747, + 4869, + 4961, + 5017, + 5035, + 5013, + 4948, + 4842, + 4693, + 4503, + 4273, + 4008, + 3709, + 3382, + 3031, + 2662, + 2280, + 1892, + 1504, + 1123, + 755, + 406, + 82, + -210, + -466, + -682, + -853, + -978, + -1052, + -1076, + -1048, + -970, + -844, + -671, + -455, + -201, + 85, + 400, + 735, + 1085, + 1442, + 1798, + 2145, + 2477, + 2785, + 3063, + 3303, + 3501, + 3649, + 3744, + 3782, + 3761, + 3677, + 3531, + 3323, + 3055, + 2729, + 2349, + 1920, + 1447, + 937, + 397, + -163, + -737, + -1316, + -1890, + -2449, + -2985, + -3488, + -3950, + -4363, + -4719, + -5011, + -5234, + -5381, + -5451, + -5439, + -5344, + -5167, + -4907, + -4567, + -4150, + -3661, + -3105, + -2489, + -1819, + -1105, + -356, + 420, + 1214, + 2014, + 2812, + 3597, + 4360, + 5091, + 5782, + 6426, + 7013, + 7540, + 7999, + 8388, + 8702, + 8939, + 9100, + 9184, + 9192, + 9128, + 8994, + 8796, + 8538, + 8228, + 7871, + 7475, + 7048, + 6598, + 6132, + 5660, + 5188, + 4725, + 4278, + 3853, + 3457, + 3095, + 2771, + 2488, + 2251, + 2060, + 1917, + 1822, + 1773, + 1768, + 1807, + 1884, + 1996, + 2139, + 2309, + 2498, + 2704, + 2919, + 3138, + 3358, + 3571, + 3774, + 3963, + 4135, + 4285, + 4413, + 4517, + 4596, + 4650, + 4680, + 4689, + 4678, + 4650, + 4609, + 4560, + 4508, + 4456, + 4411, + 4378, + 4361, + 4368, + 4401, + 4467, + 4568, + 4709, + 4893, + 5121, + 5395, + 5714, + 6080, + 6489, + 6939, + 7428, + 7950, + 8501, + 9074, + 9663, + 10261, + 10860, + 11451, + 12026, + 12577, + 13095, + 13572, + 13999, + 14369, + 14675, + 14911, + 15070, + 15149, + 15144, + 15052, + 14872, + 14603, + 14247, + 13806, + 13282, + 12681, + 12008, + 11269, + 10472, + 9625, + 8736, + 7815, + 6873, + 5918, + 4961, + 4012, + 3081, + 2176, + 1308, + 484, + -287, + -1001, + -1651, + -2233, + -2743, + -3179, + -3541, + -3827, + -4041, + -4183, + -4259, + -4272, + -4228, + -4134, + -3998, + -3825, + -3626, + -3408, + -3181, + -2952, + -2730, + -2525, + -2342, + -2191, + -2077, + -2005, + -1982, + -2011, + -2094, + -2235, + -2432, + -2687, + -2997, + -3360, + -3773, + -4231, + -4728, + -5260, + -5820, + -6399, + -6991, + -7588, + -8182, + -8765, + -9329, + -9867, + -10373, + -10839, + -11260, + -11630, + -11946, + -12204, + -12402, + -12538, + -12612, + -12623, + -12574, + -12467, + -12305, + -12092, + -11832, + -11531, + -11195, + -10828, + -10438, + -10032, + -9615, + -9193, + -8774, + -8362, + -7964, + -7582, + -7223, + -6888, + -6581, + -6304, + -6056, + -5839, + -5652, + -5494, + -5361, + -5251, + -5160, + -5085, + -5021, + -4963, + -4905, + -4843, + -4771, + -4684, + -4578, + -4448, + -4289, + -4100, + -3876, + -3616, + -3319, + -2984, + -2612, + -2205, + -1765, + -1294, + -799, + -282, + 249, + 790, + 1333, + 1872, + 2398, + 2903, + 3382, + 3825, + 4225, + 4577, + 4872, + 5106, + 5273, + 5369, + 5392, + 5338, + 5207, + 4999, + 4715, + 4358, + 3930, + 3437, + 2884, + 2278, + 1626, + 936, + 219, + -517, + -1262, + -2007, + -2739, + -3450, + -4129, + -4767, + -5354, + -5883, + -6344, + -6733, + -7042, + -7267, + -7405, + -7454, + -7412, + -7279, + -7059, + -6752, + -6363, + -5897, + -5360, + -4760, + -4104, + -3400, + -2658, + -1888, + -1098, + -299, + 498, + 1286, + 2054, + 2793, + 3496, + 4156, + 4764, + 5317, + 5809, + 6236, + 6596, + 6889, + 7113, + 7269, + 7360, + 7388, + 7357, + 7272, + 7138, + 6961, + 6748, + 6506, + 6241, + 5962, + 5674, + 5386, + 5103, + 4833, + 4580, + 4351, + 4149, + 3979, + 3843, + 3742, + 3679, + 3653, + 3663, + 3709, + 3787, + 3895, + 4028, + 4183, + 4355, + 4538, + 4727, + 4916, + 5101, + 5275, + 5433, + 5570, + 5683, + 5767, + 5819, + 5836, + 5817, + 5761, + 5668, + 5537, + 5372, + 5175, + 4948, + 4695, + 4421, + 4132, + 3833, + 3529, + 3227, + 2934, + 2655, + 2398, + 2167, + 1969, + 1809, + 1691, + 1619, + 1597, + 1626, + 1709, + 1845, + 2033, + 2274, + 2563, + 2898, + 3275, + 3688, + 4131, + 4599, + 5083, + 5577, + 6073, + 6563, + 7039, + 7494, + 7919, + 8307, + 8653, + 8949, + 9191, + 9375, + 9496, + 9552, + 9542, + 9466, + 9325, + 9120, + 8854, + 8532, + 8158, + 7739, + 7281, + 6792, + 6281, + 5754, + 5223, + 4694, + 4179, + 3685, + 3221, + 2796, + 2417, + 2091, + 1825, + 1623, + 1490, + 1428, + 1441, + 1528, + 1689, + 1922, + 2226, + 2594, + 3023, + 3507, + 4038, + 4608, + 5210, + 5833, + 6469, + 7108, + 7739, + 8354, + 8942, + 9495, + 10003, + 10459, + 10855, + 11185, + 11443, + 11625, + 11727, + 11748, + 11686, + 11541, + 11314, + 11009, + 10628, + 10175, + 9657, + 9080, + 8450, + 7775, + 7062, + 6321, + 5559, + 4786, + 4008, + 3235, + 2474, + 1733, + 1018, + 335, + -309, + -913, + -1471, + -1981, + -2441, + -2851, + -3211, + -3522, + -3786, + -4004, + -4182, + -4321, + -4428, + -4506, + -4560, + -4596, + -4619, + -4633, + -4643, + -4655, + -4671, + -4695, + -4730, + -4778, + -4841, + -4920, + -5013, + -5122, + -5243, + -5374, + -5513, + -5656, + -5799, + -5936, + -6063, + -6175, + -6266, + -6331, + -6364, + -6361, + -6316, + -6225, + -6084, + -5891, + -5642, + -5337, + -4975, + -4555, + -4080, + -3551, + -2972, + -2346, + -1679, + -976, + -245, + 507, + 1274, + 2047, + 2817, + 3575, + 4312, + 5020, + 5690, + 6315, + 6886, + 7396, + 7840, + 8212, + 8507, + 8723, + 8857, + 8908, + 8876, + 8762, + 8569, + 8301, + 7961, + 7557, + 7094, + 6579, + 6022, + 5430, + 4813, + 4181, + 3543, + 2909, + 2287, + 1689, + 1121, + 592, + 110, + -318, + -689, + -996, + -1237, + -1409, + -1510, + -1542, + -1506, + -1403, + -1238, + -1015, + -739, + -418, + -58, + 331, + 744, + 1171, + 1602, + 2029, + 2443, + 2835, + 3197, + 3522, + 3802, + 4031, + 4204, + 4316, + 4363, + 4344, + 4257, + 4102, + 3880, + 3592, + 3243, + 2836, + 2375, + 1867, + 1318, + 735, + 126, + -502, + -1141, + -1783, + -2420, + -3044, + -3648, + -4225, + -4769, + -5275, + -5737, + -6151, + -6515, + -6827, + -7085, + -7288, + -7439, + -7539, + -7589, + -7593, + -7556, + -7482, + -7377, + -7244, + -7092, + -6925, + -6750, + -6573, + -6399, + -6234, + -6084, + -5952, + -5842, + -5759, + -5704, + -5679, + -5685, + -5722, + -5790, + -5886, + -6009, + -6155, + -6320, + -6501, + -6693, + -6889, + -7086, + -7277, + -7457, + -7621, + -7762, + -7876, + -7960, + -8007, + -8016, + -7984, + -7910, + -7791, + -7628, + -7422, + -7175, + -6889, + -6569, + -6218, + -5841, + -5444, + -5035, + -4618, + -4203, + -3796, + -3405, + -3036, + -2699, + -2399, + -2144, + -1938, + -1788, + -1699, + -1672, + -1712, + -1820, + -1996, + -2239, + -2548, + -2920, + -3351, + -3835, + -4366, + -4938, + -5542, + -6171, + -6814, + -7462, + -8106, + -8734, + -9338, + -9908, + -10433, + -10904, + -11314, + -11654, + -11918, + -12100, + -12194, + -12198, + -12108, + -11924, + -11646, + -11275, + -10813, + -10265, + -9635, + -8929, + -8155, + -7321, + -6434, + -5504, + -4542, + -3556, + -2557, + -1556, + -561, + 415, + 1365, + 2281, + 3153, + 3975, + 4741, + 5444, + 6081, + 6648, + 7144, + 7568, + 7918, + 8198, + 8409, + 8554, + 8638, + 8665, + 8642, + 8573, + 8466, + 8327, + 8165, + 7984, + 7794, + 7600, + 7408, + 7225, + 7057, + 6906, + 6778, + 6676, + 6602, + 6557, + 6542, + 6556, + 6599, + 6668, + 6760, + 6872, + 7001, + 7140, + 7286, + 7433, + 7576, + 7709, + 7827, + 7925, + 7998, + 8041, + 8051, + 8024, + 7958, + 7850, + 7701, + 7508, + 7274, + 7000, + 6688, + 6340, + 5962, + 5557, + 5131, + 4690, + 4239, + 3785, + 3334, + 2894, + 2470, + 2070, + 1699, + 1363, + 1067, + 815, + 612, + 460, + 361, + 316, + 326, + 390, + 505, + 670, + 880, + 1131, + 1418, + 1735, + 2074, + 2430, + 2795, + 3161, + 3520, + 3865, + 4188, + 4483, + 4742, + 4959, + 5129, + 5248, + 5311, + 5316, + 5262, + 5146, + 4971, + 4738, + 4449, + 4108, + 3720, + 3290, + 2825, + 2333, + 1820, + 1296, + 770, + 250, + -254, + -735, + -1183, + -1589, + -1946, + -2247, + -2484, + -2654, + -2751, + -2771, + -2714, + -2576, + -2360, + -2065, + -1695, + -1254, + -745, + -176, + 446, + 1115, + 1822, + 2558, + 3313, + 4076, + 4839, + 5591, + 6322, + 7022, + 7682, + 8294, + 8849, + 9341, + 9763, + 10110, + 10378, + 10565, + 10667, + 10685, + 10620, + 10472, + 10244, + 9941, + 9568, + 9129, + 8631, + 8081, + 7487, + 6857, + 6198, + 5520, + 4829, + 4135, + 3445, + 2765, + 2104, + 1467, + 859, + 286, + -249, + -744, + -1197, + -1606, + -1972, + -2295, + -2577, + -2820, + -3027, + -3203, + -3350, + -3474, + -3580, + -3673, + -3758, + -3839, + -3922, + -4010, + -4109, + -4222, + -4352, + -4501, + -4670, + -4861, + -5074, + -5308, + -5562, + -5833, + -6118, + -6414, + -6716, + -7021, + -7322, + -7614, + -7892, + -8149, + -8381, + -8582, + -8746, + -8868, + -8945, + -8973, + -8948, + -8868, + -8733, + -8541, + -8293, + -7991, + -7637, + -7235, + -6788, + -6302, + -5783, + -5237, + -4673, + -4096, + -3517, + -2942, + -2381, + -1841, + -1332, + -861, + -435, + -62, + 251, + 501, + 683, + 793, + 828, + 788, + 672, + 481, + 218, + -113, + -509, + -965, + -1474, + -2027, + -2618, + -3237, + -3875, + -4523, + -5171, + -5810, + -6428, + -7018, + -7570, + -8076, + -8527, + -8918, + -9242, + -9494, + -9670, + -9767, + -9785, + -9722, + -9580, + -9360, + -9066, + -8702, + -8274, + -7788, + -7251, + -6670, + -6054, + -5413, + -4754, + -4087, + -3422, + -2767, + -2130, + -1521, + -947, + -414, + 70, + 502, + 877, + 1192, + 1445, + 1634, + 1760, + 1825, + 1829, + 1778, + 1674, + 1523, + 1330, + 1102, + 846, + 569, + 279, + -17, + -312, + -598, + -868, + -1116, + -1335, + -1520, + -1666, + -1770, + -1828, + -1839, + -1801, + -1714, + -1579, + -1398, + -1172, + -907, + -605, + -272, + 87, + 467, + 861, + 1263, + 1667, + 2066, + 2454, + 2825, + 3174, + 3495, + 3784, + 4037, + 4252, + 4425, + 4557, + 4645, + 4690, + 4694, + 4658, + 4585, + 4478, + 4341, + 4180, + 3998, + 3801, + 3595, + 3384, + 3176, + 2974, + 2785, + 2613, + 2462, + 2335, + 2237, + 2168, + 2131, + 2126, + 2153, + 2210, + 2295, + 2406, + 2537, + 2686, + 2846, + 3012, + 3177, + 3334, + 3477, + 3597, + 3689, + 3744, + 3756, + 3719, + 3626, + 3473, + 3255, + 2968, + 2610, + 2179, + 1675, + 1098, + 450, + -265, + -1045, + -1884, + -2775, + -3712, + -4686, + -5690, + -6713, + -7745, + -8777, + -9798, + -10797, + -11765, + -12690, + -13564, + -14377, + -15121, + -15788, + -16372, + -16866, + -17266, + -17570, + -17775, + -17880, + -17885, + -17794, + -17607, + -17331, + -16970, + -16530, + -16019, + -15444, + -14815, + -14141, + -13432, + -12697, + -11947, + -11191, + -10440, + -9702, + -8986, + -8301, + -7654, + -7052, + -6500, + -6003, + -5564, + -5187, + -4872, + -4620, + -4429, + -4299, + -4226, + -4206, + -4236, + -4309, + -4420, + -4562, + -4729, + -4915, + -5111, + -5312, + -5510, + -5699, + -5874, + -6029, + -6159, + -6260, + -6329, + -6363, + -6362, + -6324, + -6250, + -6141, + -5999, + -5826, + -5627, + -5404, + -5164, + -4911, + -4650, + -4387, + -4128, + -3879, + -3645, + -3431, + -3243, + -3084, + -2960, + -2872, + -2823, + -2816, + -2851, + -2927, + -3045, + -3201, + -3395, + -3623, + -3879, + -4161, + -4462, + -4777, + -5100, + -5425, + -5744, + -6053, + -6344, + -6611, + -6849, + -7052, + -7217, + -7339, + -7414, + -7442, + -7420, + -7349, + -7227, + -7058, + -6844, + -6587, + -6293, + -5965, + -5611, + -5236, + -4847, + -4451, + -4057, + -3671, + -3301, + -2955, + -2641, + -2364, + -2131, + -1948, + -1819, + -1749, + -1741, + -1796, + -1915, + -2099, + -2346, + -2653, + -3018, + -3435, + -3899, + -4403, + -4941, + -5505, + -6085, + -6674, + -7262, + -7840, + -8398, + -8928, + -9420, + -9867, + -10260, + -10593, + -10859, + -11054, + -11173, + -11213, + -11173, + -11052, + -10850, + -10569, + -10212, + -9784, + -9290, + -8736, + -8128, + -7476, + -6788, + -6073, + -5340, + -4599, + -3860, + -3134, + -2429, + -1755, + -1120, + -533, + 0, + 470, + 875, + 1209, + 1468, + 1652, + 1757, + 1786, + 1738, + 1617, + 1426, + 1169, + 852, + 481, + 63, + -395, + -886, + -1400, + -1931, + -2470, + -3009, + -3539, + -4054, + -4547, + -5011, + -5441, + -5832, + -6180, + -6482, + -6736, + -6941, + -7097, + -7203, + -7262, + -7276, + -7248, + -7182, + -7082, + -6952, + -6797, + -6624, + -6437, + -6241, + -6042, + -5844, + -5653, + -5472, + -5304, + -5154, + -5022, + -4911, + -4821, + -4752, + -4704, + -4674, + -4661, + -4660, + -4670, + -4684, + -4700, + -4711, + -4712, + -4699, + -4665, + -4605, + -4515, + -4389, + -4224, + -4015, + -3760, + -3456, + -3102, + -2698, + -2243, + -1739, + -1189, + -595, + 37, + 704, + 1400, + 2117, + 2849, + 3588, + 4326, + 5055, + 5765, + 6449, + 7097, + 7702, + 8256, + 8752, + 9183, + 9544, + 9829, + 10034, + 10158, + 10198, + 10153, + 10025, + 9815, + 9526, + 9163, + 8730, + 8234, + 7682, + 7082, + 6442, + 5772, + 5081, + 4380, + 3677, + 2984, + 2310, + 1664, + 1055, + 491, + -18, + -469, + -855, + -1171, + -1413, + -1580, + -1669, + -1682, + -1620, + -1484, + -1280, + -1010, + -681, + -299, + 127, + 592, + 1087, + 1602, + 2130, + 2661, + 3187, + 3698, + 4188, + 4648, + 5072, + 5454, + 5788, + 6070, + 6297, + 6467, + 6578, + 6631, + 6627, + 6567, + 6456, + 6296, + 6094, + 5854, + 5584, + 5290, + 4979, + 4659, + 4338, + 4023, + 3723, + 3444, + 3193, + 2978, + 2803, + 2673, + 2594, + 2568, + 2598, + 2686, + 2832, + 3036, + 3296, + 3610, + 3975, + 4388, + 4843, + 5335, + 5860, + 6410, + 6980, + 7562, + 8151, + 8739, + 9321, + 9891, + 10444, + 10973, + 11477, + 11949, + 12389, + 12793, + 13161, + 13492, + 13787, + 14047, + 14274, + 14471, + 14642, + 14789, + 14919, + 15035, + 15143, + 15247, + 15354, + 15467, + 15593, + 15735, + 15898, + 16085, + 16299, + 16542, + 16815, + 17119, + 17454, + 17818, + 18208, + 18623, + 19058, + 19508, + 19968, + 20431, + 20892, + 21343, + 21777, + 22186, + 22562, + 22899, + 23188, + 23423, + 23598, + 23706, + 23742, + 23703, + 23584, + 23384, + 23102, + 22737, + 22290, + 21763, + 21161, + 20486, + 19746, + 18946, + 18094, + 17199, + 16268, + 15312, + 14341, + 13365, + 12395, + 11440, + 10511, + 9617, + 8769, + 7974, + 7242, + 6578, + 5989, + 5480, + 5055, + 4716, + 4465, + 4302, + 4225, + 4233, + 4322, + 4487, + 4722, + 5021, + 5376, + 5778, + 6219, + 6690, + 7181, + 7682, + 8184, + 8676, + 9151, + 9598, + 10011, + 10381, + 10701, + 10967, + 11174, + 11317, + 11394, + 11405, + 11348, + 11224, + 11035, + 10785, + 10476, + 10113, + 9703, + 9250, + 8762, + 8245, + 7707, + 7154, + 6595, + 6037, + 5485, + 4948, + 4430, + 3937, + 3474, + 3046, + 2654, + 2301, + 1989, + 1717, + 1486, + 1295, + 1140, + 1020, + 930, + 867, + 825, + 800, + 787, + 780, + 773, + 762, + 740, + 703, + 647, + 568, + 462, + 326, + 160, + -38, + -269, + -532, + -825, + -1147, + -1493, + -1861, + -2246, + -2642, + -3045, + -3448, + -3845, + -4229, + -4596, + -4937, + -5248, + -5522, + -5754, + -5939, + -6075, + -6156, + -6181, + -6148, + -6057, + -5908, + -5702, + -5442, + -5131, + -4773, + -4373, + -3936, + -3470, + -2980, + -2475, + -1963, + -1450, + -946, + -457, + 6, + 440, + 835, + 1187, + 1489, + 1736, + 1926, + 2055, + 2121, + 2125, + 2065, + 1946, + 1767, + 1535, + 1253, + 927, + 564, + 170, + -244, + -673, + -1107, + -1537, + -1954, + -2349, + -2713, + -3039, + -3318, + -3544, + -3710, + -3811, + -3843, + -3802, + -3687, + -3496, + -3229, + -2889, + -2478, + -2000, + -1460, + -864, + -218, + 468, + 1188, + 1931, + 2689, + 3452, + 4209, + 4951, + 5668, + 6350, + 6990, + 7577, + 8106, + 8569, + 8960, + 9275, + 9509, + 9662, + 9730, + 9714, + 9615, + 9434, + 9176, + 8845, + 8445, + 7982, + 7463, + 6897, + 6289, + 5649, + 4985, + 4305, + 3618, + 2931, + 2253, + 1591, + 952, + 342, + -234, + -771, + -1266, + -1716, + -2120, + -2475, + -2782, + -3042, + -3258, + -3430, + -3563, + -3660, + -3725, + -3763, + -3780, + -3779, + -3767, + -3748, + -3726, + -3707, + -3695, + -3692, + -3703, + -3728, + -3771, + -3831, + -3910, + -4005, + -4115, + -4240, + -4374, + -4515, + -4659, + -4801, + -4936, + -5059, + -5163, + -5245, + -5298, + -5317, + -5298, + -5235, + -5125, + -4964, + -4750, + -4482, + -4157, + -3777, + -3342, + -2855, + -2317, + -1733, + -1109, + -448, + 241, + 953, + 1679, + 2412, + 3143, + 3864, + 4565, + 5238, + 5874, + 6465, + 7005, + 7484, + 7898, + 8241, + 8509, + 8697, + 8803, + 8827, + 8768, + 8628, + 8408, + 8111, + 7744, + 7310, + 6818, + 6273, + 5684, + 5060, + 4410, + 3743, + 3070, + 2399, + 1741, + 1104, + 498, + -68, + -589, + -1057, + -1466, + -1811, + -2088, + -2296, + -2432, + -2496, + -2491, + -2416, + -2277, + -2077, + -1822, + -1518, + -1172, + -793, + -387, + 35, + 467, + 897, + 1319, + 1722, + 2099, + 2441, + 2743, + 2996, + 3196, + 3338, + 3418, + 3434, + 3384, + 3267, + 3085, + 2840, + 2534, + 2170, + 1754, + 1292, + 789, + 252, + -310, + -892, + -1484, + -2079, + -2669, + -3246, + -3803, + -4333, + -4830, + -5287, + -5701, + -6067, + -6381, + -6642, + -6848, + -6999, + -7096, + -7140, + -7134, + -7080, + -6983, + -6847, + -6677, + -6480, + -6261, + -6025, + -5780, + -5531, + -5284, + -5045, + -4818, + -4610, + -4424, + -4263, + -4130, + -4027, + -3956, + -3916, + -3907, + -3928, + -3976, + -4049, + -4143, + -4254, + -4378, + -4509, + -4642, + -4772, + -4894, + -5001, + -5088, + -5151, + -5185, + -5186, + -5151, + -5077, + -4962, + -4805, + -4607, + -4367, + -4087, + -3771, + -3421, + -3042, + -2639, + -2217, + -1783, + -1344, + -907, + -480, + -70, + 315, + 669, + 983, + 1251, + 1468, + 1626, + 1723, + 1753, + 1715, + 1605, + 1424, + 1172, + 851, + 462, + 11, + -497, + -1059, + -1665, + -2310, + -2983, + -3677, + -4381, + -5086, + -5782, + -6458, + -7106, + -7714, + -8275, + -8778, + -9217, + -9585, + -9875, + -10081, + -10202, + -10233, + -10173, + -10021, + -9780, + -9452, + -9039, + -8546, + -7981, + -7348, + -6656, + -5913, + -5128, + -4312, + -3473, + -2622, + -1770, + -925, + -98, + 700, + 1464, + 2184, + 2852, + 3462, + 4009, + 4488, + 4896, + 5231, + 5491, + 5677, + 5790, + 5832, + 5806, + 5716, + 5567, + 5364, + 5115, + 4824, + 4500, + 4149, + 3778, + 3395, + 3007, + 2619, + 2239, + 1871, + 1521, + 1192, + 889, + 613, + 367, + 151, + -34, + -191, + -321, + -425, + -508, + -574, + -626, + -669, + -708, + -750, + -798, + -859, + -937, + -1037, + -1164, + -1321, + -1513, + -1741, + -2007, + -2313, + -2659, + -3044, + -3467, + -3926, + -4417, + -4937, + -5481, + -6044, + -6620, + -7204, + -7788, + -8367, + -8933, + -9479, + -10000, + -10488, + -10939, + -11346, + -11706, + -12013, + -12266, + -12461, + -12598, + -12675, + -12694, + -12656, + -12564, + -12421, + -12231, + -11999, + -11732, + -11435, + -11115, + -10781, + -10438, + -10096, + -9761, + -9442, + -9145, + -8877, + -8645, + -8453, + -8307, + -8211, + -8167, + -8177, + -8243, + -8364, + -8539, + -8765, + -9038, + -9355, + -9709, + -10095, + -10505, + -10932, + -11367, + -11802, + -12227, + -12634, + -13014, + -13358, + -13657, + -13904, + -14092, + -14214, + -14264, + -14237, + -14132, + -13943, + -13672, + -13317, + -12880, + -12363, + -11769, + -11105, + -10374, + -9585, + -8745, + -7862, + -6945, + -6005, + -5050, + -4092, + -3139, + -2204, + -1294, + -420, + 408, + 1185, + 1901, + 2551, + 3129, + 3631, + 4052, + 4391, + 4648, + 4821, + 4914, + 4927, + 4864, + 4730, + 4531, + 4272, + 3960, + 3602, + 3207, + 2781, + 2334, + 1873, + 1407, + 942, + 486, + 46, + -370, + -761, + -1119, + -1442, + -1726, + -1969, + -2170, + -2330, + -2448, + -2527, + -2569, + -2577, + -2554, + -2505, + -2435, + -2348, + -2249, + -2144, + -2038, + -1936, + -1842, + -1761, + -1696, + -1651, + -1628, + -1630, + -1656, + -1709, + -1786, + -1888, + -2011, + -2154, + -2312, + -2482, + -2660, + -2839, + -3015, + -3182, + -3335, + -3468, + -3575, + -3652, + -3693, + -3693, + -3650, + -3560, + -3421, + -3231, + -2989, + -2697, + -2354, + -1964, + -1530, + -1056, + -547, + -8, + 552, + 1129, + 1714, + 2299, + 2876, + 3436, + 3971, + 4473, + 4933, + 5343, + 5698, + 5991, + 6216, + 6368, + 6444, + 6441, + 6359, + 6196, + 5953, + 5634, + 5240, + 4776, + 4248, + 3662, + 3024, + 2345, + 1631, + 892, + 138, + -621, + -1377, + -2118, + -2836, + -3520, + -4164, + -4758, + -5295, + -5769, + -6175, + -6509, + -6767, + -6947, + -7050, + -7075, + -7024, + -6901, + -6708, + -6452, + -6138, + -5773, + -5364, + -4920, + -4450, + -3961, + -3464, + -2967, + -2479, + -2008, + -1564, + -1153, + -783, + -459, + -188, + 27, + 184, + 279, + 311, + 281, + 189, + 39, + -167, + -425, + -731, + -1077, + -1458, + -1868, + -2297, + -2740, + -3189, + -3635, + -4071, + -4490, + -4886, + -5251, + -5581, + -5870, + -6114, + -6310, + -6456, + -6549, + -6591, + -6581, + -6520, + -6412, + -6259, + -6064, + -5834, + -5572, + -5284, + -4977, + -4656, + -4329, + -4000, + -3677, + -3366, + -3071, + -2798, + -2552, + -2336, + -2154, + -2008, + -1899, + -1828, + -1795, + -1799, + -1838, + -1911, + -2012, + -2139, + -2287, + -2452, + -2627, + -2808, + -2989, + -3164, + -3328, + -3476, + -3603, + -3704, + -3777, + -3817, + -3822, + -3791, + -3723, + -3619, + -3479, + -3305, + -3101, + -2870, + -2616, + -2345, + -2063, + -1775, + -1490, + -1213, + -952, + -715, + -508, + -339, + -214, + -139, + -120, + -161, + -266, + -438, + -680, + -990, + -1371, + -1819, + -2333, + -2908, + -3540, + -4223, + -4950, + -5714, + -6505, + -7315, + -8134, + -8953, + -9760, + -10545, + -11298, + -12010, + -12669, + -13268, + -13798, + -14251, + -14619, + -14899, + -15084, + -15172, + -15160, + -15048, + -14835, + -14524, + -14117, + -13619, + -13034, + -12369, + -11632, + -10829, + -9971, + -9066, + -8124, + -7155, + -6169, + -5176, + -4187, + -3210, + -2255, + -1330, + -443, + 398, + 1189, + 1925, + 2601, + 3214, + 3764, + 4248, + 4669, + 5027, + 5324, + 5566, + 5754, + 5896, + 5996, + 6060, + 6095, + 6108, + 6106, + 6095, + 6082, + 6074, + 6076, + 6093, + 6131, + 6194, + 6285, + 6407, + 6560, + 6747, + 6966, + 7216, + 7497, + 7804, + 8136, + 8487, + 8853, + 9230, + 9611, + 9990, + 10364, + 10724, + 11067, + 11386, + 11676, + 11934, + 12154, + 12334, + 12470, + 12562, + 12607, + 12607, + 12561, + 12471, + 12340, + 12170, + 11966, + 11732, + 11473, + 11196, + 10905, + 10607, + 10309, + 10017, + 9738, + 9477, + 9241, + 9034, + 8861, + 8727, + 8635, + 8587, + 8585, + 8629, + 8719, + 8854, + 9032, + 9249, + 9502, + 9786, + 10095, + 10422, + 10762, + 11107, + 11450, + 11783, + 12099, + 12389, + 12648, + 12867, + 13041, + 13163, + 13230, + 13237, + 13181, + 13059, + 12871, + 12617, + 12297, + 11915, + 11473, + 10976, + 10430, + 9839, + 9213, + 8558, + 7883, + 7197, + 6509, + 5829, + 5165, + 4527, + 3923, + 3364, + 2855, + 2405, + 2020, + 1705, + 1464, + 1302, + 1219, + 1218, + 1297, + 1456, + 1691, + 1998, + 2373, + 2810, + 3301, + 3838, + 4415, + 5020, + 5645, + 6281, + 6917, + 7543, + 8151, + 8730, + 9272, + 9769, + 10213, + 10598, + 10918, + 11169, + 11347, + 11450, + 11477, + 11427, + 11302, + 11104, + 10836, + 10502, + 10108, + 9660, + 9165, + 8628, + 8059, + 7466, + 6856, + 6237, + 5619, + 5007, + 4411, + 3837, + 3292, + 2781, + 2308, + 1879, + 1497, + 1163, + 879, + 645, + 462, + 327, + 238, + 193, + 188, + 219, + 281, + 368, + 477, + 601, + 735, + 874, + 1013, + 1147, + 1272, + 1384, + 1480, + 1558, + 1615, + 1652, + 1667, + 1662, + 1638, + 1597, + 1541, + 1475, + 1403, + 1329, + 1257, + 1194, + 1144, + 1112, + 1105, + 1127, + 1182, + 1276, + 1411, + 1592, + 1819, + 2095, + 2421, + 2796, + 3219, + 3688, + 4199, + 4749, + 5333, + 5945, + 6579, + 7227, + 7882, + 8536, + 9180, + 9805, + 10404, + 10967, + 11486, + 11954, + 12363, + 12706, + 12977, + 13172, + 13285, + 13315, + 13258, + 13115, + 12886, + 12572, + 12175, + 11701, + 11154, + 10539, + 9865, + 9138, + 8367, + 7561, + 6730, + 5883, + 5031, + 4183, + 3350, + 2540, + 1763, + 1027, + 340, + -290, + -860, + -1364, + -1797, + -2158, + -2445, + -2657, + -2797, + -2865, + -2866, + -2804, + -2683, + -2511, + -2295, + -2041, + -1759, + -1456, + -1142, + -825, + -514, + -217, + 56, + 300, + 507, + 671, + 787, + 849, + 855, + 803, + 691, + 519, + 288, + 0, + -341, + -733, + -1171, + -1647, + -2157, + -2693, + -3247, + -3813, + -4382, + -4947, + -5499, + -6032, + -6538, + -7010, + -7443, + -7831, + -8169, + -8454, + -8683, + -8854, + -8967, + -9021, + -9017, + -8958, + -8845, + -8684, + -8477, + -8231, + -7950, + -7641, + -7309, + -6961, + -6604, + -6243, + -5885, + -5536, + -5202, + -4886, + -4594, + -4329, + -4093, + -3889, + -3719, + -3582, + -3478, + -3406, + -3364, + -3349, + -3357, + -3386, + -3429, + -3483, + -3542, + -3601, + -3655, + -3698, + -3726, + -3733, + -3716, + -3671, + -3594, + -3484, + -3339, + -3158, + -2941, + -2689, + -2404, + -2090, + -1749, + -1386, + -1007, + -618, + -224, + 166, + 548, + 911, + 1250, + 1556, + 1822, + 2042, + 2208, + 2314, + 2356, + 2330, + 2230, + 2056, + 1806, + 1479, + 1076, + 599, + 51, + -561, + -1236, + -1966, + -2743, + -3560, + -4406, + -5274, + -6154, + -7034, + -7904, + -8755, + -9577, + -10358, + -11090, + -11765, + -12373, + -12908, + -13363, + -13734, + -14016, + -14206, + -14304, + -14308, + -14219, + -14041, + -13776, + -13428, + -13004, + -12510, + -11954, + -11343, + -10688, + -9996, + -9278, + -8543, + -7802, + -7064, + -6338, + -5633, + -4958, + -4321, + -3728, + -3185, + -2698, + -2269, + -1903, + -1601, + -1364, + -1191, + -1080, + -1030, + -1036, + -1095, + -1200, + -1348, + -1530, + -1741, + -1973, + -2219, + -2473, + -2726, + -2972, + -3205, + -3418, + -3607, + -3766, + -3892, + -3982, + -4032, + -4043, + -4013, + -3942, + -3833, + -3687, + -3507, + -3297, + -3061, + -2803, + -2528, + -2243, + -1952, + -1662, + -1377, + -1104, + -847, + -610, + -399, + -217, + -66, + 50, + 132, + 179, + 190, + 168, + 113, + 29, + -80, + -211, + -358, + -518, + -682, + -847, + -1004, + -1149, + -1274, + -1375, + -1444, + -1477, + -1469, + -1417, + -1316, + -1164, + -960, + -702, + -392, + -29, + 382, + 840, + 1341, + 1880, + 2450, + 3047, + 3662, + 4289, + 4919, + 5546, + 6160, + 6754, + 7320, + 7850, + 8339, + 8779, + 9164, + 9491, + 9754, + 9952, + 10082, + 10143, + 10136, + 10062, + 9924, + 9724, + 9469, + 9164, + 8814, + 8427, + 8012, + 7575, + 7127, + 6676, + 6231, + 5801, + 5394, + 5020, + 4687, + 4400, + 4167, + 3994, + 3885, + 3843, + 3872, + 3971, + 4142, + 4382, + 4690, + 5062, + 5494, + 5979, + 6511, + 7082, + 7685, + 8309, + 8947, + 9589, + 10223, + 10842, + 11435, + 11992, + 12506, + 12967, + 13368, + 13702, + 13963, + 14147, + 14250, + 14269, + 14202, + 14050, + 13813, + 13493, + 13094, + 12619, + 12073, + 11463, + 10796, + 10077, + 9317, + 8522, + 7700, + 6862, + 6015, + 5167, + 4327, + 3501, + 2698, + 1923, + 1182, + 480, + -178, + -792, + -1357, + -1874, + -2340, + -2758, + -3129, + -3454, + -3738, + -3982, + -4192, + -4372, + -4526, + -4660, + -4779, + -4887, + -4989, + -5091, + -5195, + -5305, + -5425, + -5557, + -5702, + -5861, + -6035, + -6223, + -6423, + -6633, + -6851, + -7073, + -7295, + -7511, + -7719, + -7911, + -8082, + -8228, + -8342, + -8419, + -8455, + -8443, + -8382, + -8266, + -8094, + -7862, + -7571, + -7220, + -6810, + -6343, + -5821, + -5248, + -4628, + -3968, + -3272, + -2549, + -1806, + -1051, + -292, + 462, + 1202, + 1920, + 2607, + 3255, + 3856, + 4402, + 4888, + 5307, + 5656, + 5929, + 6125, + 6241, + 6278, + 6237, + 6119, + 5928, + 5667, + 5342, + 4960, + 4527, + 4051, + 3542, + 3007, + 2456, + 1899, + 1346, + 805, + 287, + -199, + -647, + -1047, + -1394, + -1681, + -1903, + -2057, + -2140, + -2149, + -2086, + -1951, + -1745, + -1473, + -1138, + -746, + -303, + 184, + 707, + 1259, + 1830, + 2411, + 2994, + 3569, + 4128, + 4662, + 5163, + 5624, + 6038, + 6399, + 6702, + 6943, + 7119, + 7230, + 7272, + 7249, + 7159, + 7007, + 6796, + 6530, + 6215, + 5856, + 5461, + 5036, + 4589, + 4127, + 3660, + 3194, + 2737, + 2297, + 1880, + 1492, + 1141, + 830, + 563, + 345, + 177, + 61, + -2, + -15, + 22, + 109, + 240, + 412, + 620, + 861, + 1127, + 1413, + 1713, + 2021, + 2330, + 2636, + 2931, + 3210, + 3470, + 3705, + 3911, + 4087, + 4229, + 4337, + 4409, + 4448, + 4452, + 4425, + 4370, + 4289, + 4186, + 4067, + 3936, + 3798, + 3659, + 3525, + 3400, + 3291, + 3202, + 3137, + 3102, + 3099, + 3132, + 3202, + 3311, + 3458, + 3644, + 3867, + 4125, + 4415, + 4731, + 5070, + 5426, + 5793, + 6164, + 6532, + 6889, + 7229, + 7543, + 7825, + 8066, + 8261, + 8402, + 8486, + 8506, + 8458, + 8341, + 8152, + 7889, + 7554, + 7147, + 6672, + 6132, + 5532, + 4877, + 4174, + 3431, + 2657, + 1860, + 1049, + 236, + -570, + -1360, + -2123, + -2850, + -3530, + -4155, + -4717, + -5209, + -5624, + -5957, + -6204, + -6361, + -6427, + -6402, + -6285, + -6080, + -5789, + -5417, + -4968, + -4451, + -3872, + -3239, + -2562, + -1849, + -1111, + -358, + 400, + 1154, + 1894, + 2610, + 3293, + 3936, + 4530, + 5069, + 5548, + 5962, + 6307, + 6581, + 6783, + 6912, + 6970, + 6959, + 6881, + 6740, + 6542, + 6291, + 5994, + 5657, + 5287, + 4892, + 4477, + 4052, + 3621, + 3193, + 2773, + 2367, + 1980, + 1616, + 1279, + 972, + 696, + 453, + 242, + 62, + -86, + -208, + -305, + -381, + -441, + -489, + -530, + -570, + -614, + -667, + -735, + -821, + -932, + -1071, + -1241, + -1446, + -1687, + -1966, + -2283, + -2638, + -3029, + -3456, + -3914, + -4400, + -4910, + -5439, + -5981, + -6531, + -7081, + -7626, + -8159, + -8673, + -9162, + -9619, + -10038, + -10415, + -10744, + -11022, + -11245, + -11411, + -11518, + -11566, + -11555, + -11487, + -11363, + -11189, + -10967, + -10702, + -10401, + -10070, + -9715, + -9344, + -8965, + -8585, + -8212, + -7854, + -7517, + -7210, + -6937, + -6706, + -6521, + -6386, + -6305, + -6279, + -6309, + -6397, + -6540, + -6737, + -6984, + -7276, + -7610, + -7978, + -8374, + -8790, + -9219, + -9650, + -10077, + -10489, + -10878, + -11234, + -11551, + -11819, + -12031, + -12181, + -12263, + -12272, + -12205, + -12058, + -11830, + -11522, + -11133, + -10667, + -10127, + -9517, + -8842, + -8110, + -7328, + -6504, + -5648, + -4768, + -3875, + -2979, + -2090, + -1217, + -372, + 436, + 1199, + 1908, + 2557, + 3137, + 3644, + 4072, + 4419, + 4681, + 4859, + 4951, + 4959, + 4885, + 4732, + 4505, + 4209, + 3850, + 3435, + 2971, + 2466, + 1927, + 1363, + 782, + 192, + -398, + -983, + -1555, + -2107, + -2634, + -3131, + -3594, + -4020, + -4407, + -4753, + -5057, + -5322, + -5546, + -5734, + -5887, + -6010, + -6106, + -6179, + -6235, + -6278, + -6314, + -6347, + -6383, + -6426, + -6480, + -6549, + -6637, + -6746, + -6878, + -7035, + -7215, + -7420, + -7648, + -7896, + -8163, + -8445, + -8738, + -9037, + -9337, + -9633, + -9919, + -10190, + -10440, + -10663, + -10854, + -11007, + -11118, + -11184, + -11200, + -11164, + -11075, + -10932, + -10734, + -10483, + -10181, + -9830, + -9435, + -9000, + -8531, + -8034, + -7516, + -6985, + -6448, + -5914, + -5391, + -4888, + -4412, + -3972, + -3576, + -3230, + -2940, + -2713, + -2554, + -2465, + -2450, + -2511, + -2647, + -2859, + -3144, + -3499, + -3920, + -4402, + -4939, + -5523, + -6147, + -6803, + -7480, + -8170, + -8863, + -9549, + -10218, + -10860, + -11467, + -12029, + -12539, + -12989, + -13372, + -13684, + -13919, + -14075, + -14150, + -14142, + -14052, + -13882, + -13633, + -13311, + -12920, + -12466, + -11955, + -11396, + -10795, + -10163, + -9506, + -8836, + -8161, + -7489, + -6830, + -6193, + -5584, + -5011, + -4480, + -3998, + -3568, + -3194, + -2878, + -2623, + -2427, + -2291, + -2212, + -2188, + -2215, + -2288, + -2401, + -2549, + -2724, + -2921, + -3130, + -3345, + -3559, + -3763, + -3951, + -4116, + -4251, + -4351, + -4412, + -4428, + -4396, + -4315, + -4182, + -3998, + -3762, + -3476, + -3142, + -2764, + -2345, + -1890, + -1403, + -892, + -361, + 181, + 731, + 1281, + 1825, + 2356, + 2869, + 3359, + 3820, + 4249, + 4642, + 4997, + 5311, + 5584, + 5815, + 6006, + 6157, + 6272, + 6352, + 6403, + 6427, + 6430, + 6416, + 6392, + 6362, + 6332, + 6308, + 6294, + 6295, + 6317, + 6361, + 6433, + 6533, + 6664, + 6827, + 7021, + 7245, + 7498, + 7777, + 8078, + 8397, + 8728, + 9066, + 9405, + 9737, + 10056, + 10354, + 10625, + 10860, + 11053, + 11197, + 11286, + 11315, + 11277, + 11171, + 10991, + 10737, + 10407, + 10001, + 9521, + 8968, + 8347, + 7662, + 6919, + 6125, + 5286, + 4412, + 3511, + 2593, + 1668, + 747, + -159, + -1043, + -1892, + -2697, + -3448, + -4137, + -4756, + -5298, + -5757, + -6128, + -6407, + -6592, + -6681, + -6675, + -6574, + -6382, + -6103, + -5740, + -5300, + -4791, + -4219, + -3593, + -2923, + -2218, + -1488, + -743, + 7, + 753, + 1485, + 2193, + 2870, + 3507, + 4098, + 4637, + 5118, + 5538, + 5894, + 6183, + 6406, + 6563, + 6655, + 6684, + 6654, + 6570, + 6437, + 6259, + 6044, + 5798, + 5527, + 5239, + 4941, + 4640, + 4341, + 4052, + 3778, + 3524, + 3294, + 3092, + 2921, + 2783, + 2678, + 2608, + 2571, + 2565, + 2589, + 2638, + 2711, + 2801, + 2905, + 3016, + 3130, + 3241, + 3343, + 3431, + 3499, + 3542, + 3556, + 3537, + 3482, + 3387, + 3251, + 3073, + 2852, + 2590, + 2287, + 1946, + 1570, + 1164, + 730, + 275, + -194, + -674, + -1158, + -1638, + -2109, + -2564, + -2997, + -3401, + -3772, + -4104, + -4393, + -4636, + -4830, + -4973, + -5064, + -5103, + -5092, + -5033, + -4927, + -4780, + -4596, + -4379, + -4137, + -3876, + -3602, + -3324, + -3048, + -2783, + -2535, + -2313, + -2123, + -1972, + -1865, + -1807, + -1803, + -1856, + -1969, + -2143, + -2377, + -2671, + -3024, + -3431, + -3889, + -4393, + -4936, + -5512, + -6113, + -6731, + -7356, + -7980, + -8594, + -9189, + -9754, + -10282, + -10763, + -11190, + -11555, + -11853, + -12076, + -12222, + -12286, + -12267, + -12162, + -11973, + -11700, + -11347, + -10917, + -10414, + -9846, + -9218, + -8538, + -7815, + -7058, + -6276, + -5480, + -4678, + -3881, + -3099, + -2341, + -1616, + -933, + -298, + 279, + 796, + 1246, + 1626, + 1932, + 2164, + 2320, + 2402, + 2412, + 2352, + 2227, + 2041, + 1801, + 1512, + 1181, + 817, + 427, + 19, + -398, + -817, + -1231, + -1631, + -2010, + -2363, + -2683, + -2965, + -3205, + -3400, + -3548, + -3647, + -3696, + -3696, + -3648, + -3554, + -3418, + -3242, + -3031, + -2789, + -2522, + -2234, + -1932, + -1620, + -1304, + -990, + -681, + -382, + -97, + 169, + 416, + 641, + 843, + 1022, + 1177, + 1311, + 1426, + 1523, + 1606, + 1680, + 1748, + 1816, + 1889, + 1971, + 2068, + 2186, + 2330, + 2504, + 2712, + 2959, + 3248, + 3582, + 3961, + 4387, + 4860, + 5379, + 5942, + 6545, + 7186, + 7859, + 8559, + 9279, + 10014, + 10754, + 11492, + 12220, + 12929, + 13610, + 14256, + 14857, + 15406, + 15896, + 16319, + 16669, + 16942, + 17132, + 17237, + 17255, + 17185, + 17026, + 16780, + 16451, + 16041, + 15555, + 14999, + 14381, + 13707, + 12987, + 12228, + 11441, + 10636, + 9823, + 9010, + 8210, + 7430, + 6681, + 5970, + 5307, + 4697, + 4147, + 3662, + 3247, + 2903, + 2633, + 2437, + 2314, + 2263, + 2280, + 2362, + 2503, + 2697, + 2937, + 3216, + 3526, + 3858, + 4204, + 4555, + 4903, + 5238, + 5554, + 5841, + 6093, + 6305, + 6469, + 6583, + 6642, + 6643, + 6586, + 6470, + 6296, + 6066, + 5782, + 5448, + 5070, + 4652, + 4201, + 3724, + 3229, + 2721, + 2211, + 1704, + 1210, + 735, + 288, + -125, + -499, + -827, + -1106, + -1330, + -1497, + -1606, + -1654, + -1642, + -1571, + -1442, + -1258, + -1023, + -740, + -416, + -54, + 338, + 755, + 1192, + 1640, + 2094, + 2547, + 2994, + 3429, + 3847, + 4243, + 4614, + 4956, + 5268, + 5547, + 5794, + 6009, + 6192, + 6345, + 6471, + 6573, + 6655, + 6722, + 6777, + 6827, + 6875, + 6928, + 6990, + 7067, + 7164, + 7283, + 7430, + 7608, + 7818, + 8063, + 8343, + 8658, + 9008, + 9390, + 9802, + 10240, + 10700, + 11176, + 11663, + 12155, + 12643, + 13122, + 13583, + 14020, + 14423, + 14786, + 15102, + 15364, + 15566, + 15702, + 15768, + 15760, + 15675, + 15512, + 15269, + 14948, + 14551, + 14079, + 13537, + 12930, + 12264, + 11546, + 10785, + 9988, + 9165, + 8325, + 7479, + 6638, + 5810, + 5007, + 4239, + 3514, + 2842, + 2231, + 1688, + 1220, + 832, + 528, + 311, + 183, + 144, + 195, + 332, + 552, + 852, + 1225, + 1666, + 2166, + 2718, + 3313, + 3941, + 4594, + 5261, + 5932, + 6598, + 7249, + 7877, + 8472, + 9027, + 9534, + 9989, + 10384, + 10718, + 10985, + 11184, + 11315, + 11377, + 11373, + 11303, + 11172, + 10984, + 10744, + 10457, + 10131, + 9770, + 9383, + 8977, + 8560, + 8137, + 7716, + 7304, + 6907, + 6531, + 6179, + 5858, + 5569, + 5315, + 5099, + 4920, + 4779, + 4675, + 4605, + 4567, + 4558, + 4573, + 4609, + 4660, + 4721, + 4787, + 4852, + 4910, + 4957, + 4986, + 4994, + 4977, + 4930, + 4851, + 4737, + 4588, + 4403, + 4181, + 3925, + 3636, + 3316, + 2970, + 2601, + 2214, + 1815, + 1410, + 1004, + 604, + 216, + -152, + -496, + -810, + -1087, + -1324, + -1514, + -1656, + -1746, + -1783, + -1764, + -1691, + -1563, + -1384, + -1155, + -880, + -565, + -214, + 166, + 569, + 988, + 1415, + 1842, + 2262, + 2666, + 3047, + 3398, + 3711, + 3979, + 4198, + 4363, + 4469, + 4513, + 4493, + 4409, + 4260, + 4048, + 3775, + 3444, + 3061, + 2630, + 2159, + 1653, + 1121, + 571, + 12, + -547, + -1097, + -1630, + -2136, + -2606, + -3033, + -3410, + -3729, + -3985, + -4173, + -4290, + -4332, + -4298, + -4188, + -4004, + -3746, + -3419, + -3027, + -2575, + -2070, + -1519, + -931, + -314, + 321, + 967, + 1614, + 2250, + 2867, + 3455, + 4005, + 4509, + 4959, + 5347, + 5667, + 5915, + 6087, + 6179, + 6190, + 6119, + 5966, + 5735, + 5426, + 5044, + 4595, + 4083, + 3515, + 2899, + 2241, + 1551, + 836, + 104, + -634, + -1373, + -2103, + -2817, + -3509, + -4171, + -4798, + -5384, + -5927, + -6423, + -6870, + -7266, + -7611, + -7905, + -8151, + -8350, + -8506, + -8621, + -8699, + -8747, + -8767, + -8766, + -8748, + -8718, + -8682, + -8644, + -8608, + -8579, + -8559, + -8550, + -8556, + -8577, + -8613, + -8664, + -8730, + -8807, + -8895, + -8988, + -9084, + -9177, + -9264, + -9339, + -9397, + -9432, + -9439, + -9412, + -9347, + -9239, + -9085, + -8879, + -8621, + -8307, + -7936, + -7509, + -7026, + -6488, + -5899, + -5261, + -4580, + -3860, + -3108, + -2331, + -1536, + -731, + 74, + 873, + 1655, + 2413, + 3137, + 3819, + 4451, + 5025, + 5536, + 5976, + 6342, + 6629, + 6834, + 6956, + 6993, + 6947, + 6819, + 6612, + 6331, + 5979, + 5564, + 5091, + 4570, + 4008, + 3415, + 2799, + 2170, + 1538, + 913, + 303, + -281, + -833, + -1343, + -1806, + -2214, + -2563, + -2849, + -3068, + -3219, + -3301, + -3314, + -3262, + -3146, + -2970, + -2740, + -2461, + -2141, + -1786, + -1405, + -1007, + -600, + -193, + 204, + 584, + 938, + 1257, + 1535, + 1764, + 1938, + 2054, + 2105, + 2090, + 2007, + 1854, + 1632, + 1343, + 989, + 573, + 99, + -425, + -996, + -1607, + -2249, + -2916, + -3599, + -4291, + -4984, + -5670, + -6340, + -6989, + -7609, + -8194, + -8740, + -9241, + -9695, + -10098, + -10448, + -10746, + -10990, + -11183, + -11326, + -11421, + -11474, + -11487, + -11466, + -11416, + -11343, + -11252, + -11150, + -11043, + -10936, + -10836, + -10748, + -10676, + -10624, + -10598, + -10598, + -10628, + -10689, + -10782, + -10905, + -11059, + -11241, + -11448, + -11677, + -11924, + -12185, + -12454, + -12726, + -12997, + -13259, + -13508, + -13738, + -13944, + -14121, + -14265, + -14372, + -14440, + -14464, + -14446, + -14383, + -14276, + -14126, + -13936, + -13708, + -13446, + -13155, + -12841, + -12509, + -12166, + -11819, + -11475, + -11142, + -10827, + -10537, + -10281, + -10064, + -9894, + -9775, + -9712, + -9711, + -9773, + -9902, + -10097, + -10360, + -10689, + -11082, + -11534, + -12043, + -12602, + -13204, + -13842, + -14509, + -15195, + -15890, + -16585, + -17271, + -17936, + -18571, + -19167, + -19713, + -20201, + -20622, + -20970, + -21238, + -21419, + -21511, + -21509, + -21412, + -21219, + -20931, + -20549, + -20077, + -19518, + -18879, + -18165, + -17384, + -16545, + -15656, + -14726, + -13765, + -12784, + -11792, + -10801, + -9818, + -8856, + -7921, + -7023, + -6170, + -5369, + -4624, + -3942, + -3326, + -2778, + -2301, + -1895, + -1559, + -1292, + -1091, + -952, + -871, + -842, + -861, + -919, + -1012, + -1131, + -1270, + -1422, + -1580, + -1737, + -1887, + -2024, + -2144, + -2242, + -2314, + -2358, + -2371, + -2353, + -2304, + -2223, + -2114, + -1978, + -1818, + -1638, + -1442, + -1235, + -1022, + -808, + -600, + -401, + -219, + -56, + 79, + 187, + 260, + 298, + 297, + 255, + 173, + 49, + -113, + -314, + -551, + -819, + -1116, + -1435, + -1773, + -2122, + -2476, + -2830, + -3176, + -3508, + -3820, + -4104, + -4356, + -4569, + -4740, + -4863, + -4935, + -4955, + -4919, + -4828, + -4682, + -4482, + -4230, + -3929, + -3584, + -3199, + -2780, + -2332, + -1864, + -1382, + -893, + -406, + 71, + 533, + 970, + 1377, + 1746, + 2071, + 2348, + 2572, + 2740, + 2849, + 2899, + 2888, + 2819, + 2692, + 2511, + 2280, + 2005, + 1690, + 1344, + 973, + 585, + 190, + -203, + -588, + -954, + -1291, + -1593, + -1850, + -2054, + -2200, + -2282, + -2293, + -2230, + -2090, + -1872, + -1575, + -1199, + -746, + -220, + 374, + 1034, + 1750, + 2517, + 3327, + 4169, + 5036, + 5917, + 6802, + 7681, + 8545, + 9382, + 10184, + 10942, + 11647, + 12292, + 12870, + 13375, + 13802, + 14147, + 14409, + 14586, + 14677, + 14683, + 14607, + 14452, + 14223, + 13923, + 13559, + 13138, + 12667, + 12153, + 11605, + 11030, + 10438, + 9835, + 9231, + 8632, + 8046, + 7478, + 6936, + 6423, + 5945, + 5504, + 5103, + 4744, + 4426, + 4150, + 3915, + 3719, + 3558, + 3430, + 3331, + 3256, + 3200, + 3159, + 3128, + 3101, + 3074, + 3041, + 2999, + 2944, + 2871, + 2780, + 2666, + 2529, + 2369, + 2186, + 1980, + 1754, + 1509, + 1250, + 981, + 704, + 426, + 152, + -112, + -362, + -591, + -794, + -965, + -1100, + -1193, + -1240, + -1238, + -1185, + -1078, + -917, + -702, + -432, + -111, + 258, + 673, + 1129, + 1620, + 2140, + 2682, + 3238, + 3801, + 4362, + 4913, + 5446, + 5952, + 6423, + 6852, + 7230, + 7552, + 7811, + 8002, + 8123, + 8168, + 8137, + 8029, + 7844, + 7584, + 7252, + 6850, + 6385, + 5862, + 5289, + 4672, + 4020, + 3342, + 2647, + 1946, + 1248, + 562, + -100, + -732, + -1323, + -1866, + -2353, + -2778, + -3134, + -3417, + -3625, + -3753, + -3803, + -3773, + -3665, + -3481, + -3226, + -2903, + -2519, + -2081, + -1595, + -1069, + -513, + 64, + 655, + 1250, + 1839, + 2414, + 2967, + 3489, + 3973, + 4413, + 4802, + 5136, + 5412, + 5627, + 5778, + 5867, + 5892, + 5856, + 5762, + 5613, + 5414, + 5170, + 4887, + 4572, + 4232, + 3874, + 3506, + 3136, + 2770, + 2416, + 2082, + 1772, + 1495, + 1253, + 1053, + 897, + 787, + 727, + 716, + 755, + 841, + 974, + 1150, + 1365, + 1616, + 1897, + 2202, + 2526, + 2863, + 3206, + 3549, + 3886, + 4210, + 4516, + 4798, + 5052, + 5274, + 5459, + 5606, + 5712, + 5776, + 5799, + 5780, + 5722, + 5626, + 5496, + 5335, + 5147, + 4937, + 4710, + 4472, + 4228, + 3984, + 3745, + 3517, + 3304, + 3112, + 2943, + 2802, + 2692, + 2613, + 2568, + 2557, + 2578, + 2630, + 2711, + 2817, + 2944, + 3088, + 3242, + 3401, + 3558, + 3706, + 3837, + 3946, + 4024, + 4065, + 4061, + 4007, + 3898, + 3727, + 3491, + 3187, + 2813, + 2367, + 1850, + 1261, + 605, + -115, + -897, + -1733, + -2618, + -3544, + -4502, + -5483, + -6479, + -7479, + -8472, + -9449, + -10398, + -11310, + -12174, + -12981, + -13722, + -14390, + -14976, + -15475, + -15882, + -16191, + -16402, + -16512, + -16520, + -16429, + -16240, + -15956, + -15583, + -15127, + -14593, + -13991, + -13327, + -12611, + -11853, + -11062, + -10249, + -9424, + -8595, + -7774, + -6969, + -6188, + -5441, + -4733, + -4071, + -3461, + -2906, + -2410, + -1976, + -1602, + -1291, + -1040, + -847, + -710, + -623, + -583, + -583, + -618, + -681, + -766, + -865, + -973, + -1081, + -1184, + -1275, + -1348, + -1400, + -1424, + -1418, + -1379, + -1304, + -1192, + -1044, + -860, + -642, + -391, + -111, + 193, + 519, + 860, + 1213, + 1571, + 1928, + 2279, + 2618, + 2939, + 3237, + 3508, + 3747, + 3950, + 4115, + 4240, + 4322, + 4362, + 4360, + 4316, + 4234, + 4115, + 3964, + 3785, + 3581, + 3360, + 3127, + 2887, + 2648, + 2415, + 2196, + 1995, + 1819, + 1674, + 1564, + 1494, + 1466, + 1485, + 1551, + 1666, + 1830, + 2041, + 2298, + 2598, + 2937, + 3310, + 3713, + 4139, + 4581, + 5033, + 5487, + 5936, + 6371, + 6785, + 7171, + 7522, + 7830, + 8090, + 8297, + 8446, + 8533, + 8556, + 8514, + 8405, + 8230, + 7992, + 7692, + 7336, + 6927, + 6471, + 5976, + 5449, + 4898, + 4331, + 3758, + 3188, + 2630, + 2093, + 1586, + 1118, + 696, + 329, + 24, + -215, + -383, + -475, + -491, + -427, + -284, + -64, + 232, + 600, + 1036, + 1533, + 2086, + 2686, + 3325, + 3995, + 4686, + 5389, + 6093, + 6789, + 7466, + 8117, + 8731, + 9300, + 9816, + 10273, + 10664, + 10985, + 11231, + 11400, + 11489, + 11500, + 11431, + 11285, + 11065, + 10775, + 10419, + 10003, + 9534, + 9018, + 8464, + 7878, + 7270, + 6648, + 6019, + 5391, + 4773, + 4171, + 3592, + 3043, + 2528, + 2052, + 1618, + 1229, + 888, + 594, + 348, + 148, + -5, + -117, + -190, + -228, + -236, + -217, + -177, + -122, + -57, + 12, + 82, + 147, + 204, + 246, + 273, + 281, + 267, + 232, + 174, + 95, + -5, + -124, + -260, + -408, + -565, + -727, + -889, + -1044, + -1189, + -1318, + -1424, + -1504, + -1552, + -1563, + -1533, + -1460, + -1339, + -1170, + -951, + -682, + -363, + 2, + 413, + 866, + 1356, + 1877, + 2424, + 2990, + 3567, + 4148, + 4725, + 5288, + 5829, + 6340, + 6813, + 7240, + 7612, + 7924, + 8168, + 8340, + 8435, + 8450, + 8382, + 8231, + 7996, + 7678, + 7280, + 6805, + 6258, + 5644, + 4971, + 4245, + 3475, + 2671, + 1840, + 994, + 141, + -706, + -1540, + -2351, + -3129, + -3865, + -4552, + -5182, + -5748, + -6247, + -6673, + -7023, + -7296, + -7490, + -7607, + -7648, + -7617, + -7516, + -7351, + -7128, + -6854, + -6536, + -6183, + -5801, + -5401, + -4991, + -4579, + -4175, + -3787, + -3422, + -3087, + -2790, + -2536, + -2330, + -2176, + -2075, + -2031, + -2044, + -2113, + -2237, + -2413, + -2637, + -2906, + -3213, + -3553, + -3920, + -4305, + -4703, + -5104, + -5501, + -5887, + -6253, + -6593, + -6900, + -7168, + -7391, + -7565, + -7685, + -7748, + -7752, + -7697, + -7581, + -7406, + -7174, + -6886, + -6547, + -6160, + -5730, + -5263, + -4765, + -4242, + -3699, + -3145, + -2585, + -2025, + -1472, + -932, + -409, + 91, + 565, + 1010, + 1422, + 1801, + 2145, + 2455, + 2731, + 2974, + 3188, + 3375, + 3539, + 3684, + 3815, + 3936, + 4053, + 4171, + 4295, + 4429, + 4580, + 4751, + 4945, + 5167, + 5418, + 5701, + 6017, + 6365, + 6745, + 7155, + 7592, + 8054, + 8535, + 9032, + 9537, + 10045, + 10550, + 11042, + 11517, + 11964, + 12378, + 12750, + 13074, + 13342, + 13549, + 13688, + 13755, + 13746, + 13659, + 13490, + 13240, + 12909, + 12499, + 12011, + 11449, + 10820, + 10128, + 9381, + 8586, + 7751, + 6887, + 6002, + 5108, + 4213, + 3329, + 2465, + 1633, + 841, + 98, + -586, + -1205, + -1753, + -2222, + -2609, + -2911, + -3125, + -3250, + -3288, + -3238, + -3106, + -2894, + -2608, + -2253, + -1838, + -1370, + -857, + -309, + 263, + 854, + 1450, + 2043, + 2624, + 3183, + 3711, + 4201, + 4646, + 5039, + 5376, + 5651, + 5861, + 6005, + 6082, + 6091, + 6033, + 5912, + 5730, + 5490, + 5200, + 4863, + 4486, + 4075, + 3639, + 3184, + 2717, + 2246, + 1777, + 1318, + 875, + 453, + 57, + -306, + -636, + -929, + -1183, + -1397, + -1570, + -1705, + -1801, + -1863, + -1893, + -1895, + -1872, + -1831, + -1777, + -1714, + -1648, + -1585, + -1530, + -1488, + -1464, + -1462, + -1487, + -1540, + -1624, + -1741, + -1891, + -2075, + -2292, + -2539, + -2814, + -3115, + -3435, + -3772, + -4120, + -4473, + -4824, + -5169, + -5500, + -5811, + -6096, + -6350, + -6565, + -6738, + -6864, + -6940, + -6962, + -6928, + -6837, + -6690, + -6486, + -6227, + -5917, + -5558, + -5156, + -4715, + -4242, + -3743, + -3225, + -2696, + -2164, + -1637, + -1122, + -627, + -161, + 269, + 658, + 1000, + 1289, + 1520, + 1691, + 1800, + 1844, + 1825, + 1742, + 1598, + 1396, + 1140, + 836, + 490, + 108, + -301, + -731, + -1172, + -1616, + -2052, + -2474, + -2870, + -3234, + -3557, + -3831, + -4051, + -4209, + -4301, + -4323, + -4273, + -4148, + -3948, + -3675, + -3329, + -2915, + -2437, + -1899, + -1309, + -673, + 0, + 700, + 1421, + 2152, + 2882, + 3603, + 4304, + 4975, + 5608, + 6194, + 6724, + 7193, + 7592, + 7917, + 8164, + 8329, + 8411, + 8408, + 8321, + 8152, + 7902, + 7576, + 7178, + 6714, + 6190, + 5613, + 4990, + 4330, + 3641, + 2931, + 2209, + 1483, + 761, + 51, + -640, + -1306, + -1940, + -2539, + -3096, + -3610, + -4078, + -4498, + -4870, + -5193, + -5470, + -5702, + -5893, + -6044, + -6162, + -6248, + -6310, + -6351, + -6376, + -6391, + -6401, + -6410, + -6422, + -6441, + -6472, + -6515, + -6574, + -6649, + -6742, + -6851, + -6976, + -7115, + -7265, + -7423, + -7586, + -7748, + -7906, + -8053, + -8186, + -8297, + -8382, + -8435, + -8451, + -8425, + -8353, + -8232, + -8058, + -7828, + -7543, + -7200, + -6801, + -6347, + -5839, + -5282, + -4680, + -4038, + -3361, + -2656, + -1931, + -1194, + -452, + 284, + 1009, + 1711, + 2384, + 3018, + 3605, + 4138, + 4610, + 5015, + 5349, + 5607, + 5786, + 5884, + 5900, + 5836, + 5691, + 5470, + 5176, + 4813, + 4389, + 3909, + 3382, + 2816, + 2220, + 1602, + 974, + 343, + -278, + -883, + -1461, + -2004, + -2504, + -2953, + -3346, + -3676, + -3939, + -4133, + -4255, + -4304, + -4280, + -4186, + -4023, + -3796, + -3509, + -3169, + -2781, + -2353, + -1894, + -1411, + -913, + -409, + 90, + 578, + 1046, + 1485, + 1888, + 2247, + 2557, + 2813, + 3010, + 3144, + 3215, + 3220, + 3160, + 3035, + 2849, + 2604, + 2305, + 1956, + 1563, + 1134, + 674, + 191, + -305, + -809, + -1313, + -1807, + -2285, + -2740, + -3164, + -3553, + -3900, + -4200, + -4452, + -4650, + -4795, + -4884, + -4918, + -4898, + -4825, + -4704, + -4536, + -4327, + -4082, + -3805, + -3502, + -3180, + -2844, + -2501, + -2157, + -1817, + -1488, + -1174, + -880, + -609, + -366, + -151, + 31, + 182, + 302, + 390, + 449, + 482, + 490, + 478, + 451, + 412, + 367, + 322, + 281, + 251, + 237, + 243, + 275, + 337, + 432, + 563, + 734, + 945, + 1197, + 1490, + 1822, + 2192, + 2597, + 3032, + 3493, + 3976, + 4472, + 4977, + 5483, + 5983, + 6469, + 6934, + 7369, + 7768, + 8124, + 8430, + 8680, + 8869, + 8992, + 9047, + 9030, + 8941, + 8779, + 8544, + 8240, + 7869, + 7435, + 6943, + 6401, + 5814, + 5192, + 4542, + 3875, + 3199, + 2525, + 1862, + 1221, + 611, + 43, + -475, + -936, + -1330, + -1653, + -1897, + -2058, + -2134, + -2121, + -2019, + -1828, + -1549, + -1186, + -743, + -224, + 363, + 1013, + 1716, + 2465, + 3250, + 4062, + 4889, + 5722, + 6552, + 7367, + 8159, + 8918, + 9636, + 10305, + 10917, + 11468, + 11951, + 12364, + 12702, + 12965, + 13151, + 13261, + 13298, + 13262, + 13158, + 12991, + 12765, + 12486, + 12160, + 11795, + 11398, + 10974, + 10533, + 10080, + 9622, + 9167, + 8719, + 8284, + 7867, + 7472, + 7101, + 6757, + 6442, + 6155, + 5896, + 5664, + 5458, + 5273, + 5107, + 4956, + 4815, + 4679, + 4544, + 4403, + 4251, + 4084, + 3896, + 3683, + 3440, + 3164, + 2852, + 2502, + 2111, + 1679, + 1207, + 694, + 144, + -441, + -1059, + -1705, + -2373, + -3060, + -3758, + -4461, + -5163, + -5858, + -6537, + -7196, + -7826, + -8423, + -8980, + -9492, + -9956, + -10366, + -10721, + -11019, + -11258, + -11438, + -11561, + -11627, + -11641, + -11606, + -11527, + -11408, + -11256, + -11077, + -10879, + -10669, + -10454, + -10242, + -10042, + -9859, + -9701, + -9574, + -9486, + -9440, + -9441, + -9492, + -9597, + -9756, + -9970, + -10239, + -10559, + -10929, + -11345, + -11801, + -12291, + -12810, + -13349, + -13901, + -14456, + -15007, + -15545, + -16059, + -16542, + -16984, + -17378, + -17716, + -17990, + -18195, + -18325, + -18376, + -18346, + -18231, + -18032, + -17748, + -17382, + -16936, + -16414, + -15822, + -15166, + -14452, + -13689, + -12886, + -12052, + -11196, + -10329, + -9460, + -8601, + -7760, + -6948, + -6174, + -5446, + -4772, + -4159, + -3614, + -3141, + -2744, + -2427, + -2190, + -2035, + -1960, + -1964, + -2044, + -2196, + -2415, + -2696, + -3032, + -3416, + -3840, + -4298, + -4779, + -5278, + -5785, + -6292, + -6793, + -7280, + -7746, + -8186, + -8595, + -8968, + -9301, + -9594, + -9843, + -10047, + -10209, + -10327, + -10405, + -10445, + -10450, + -10425, + -10372, + -10299, + -10208, + -10106, + -9998, + -9889, + -9783, + -9685, + -9600, + -9531, + -9480, + -9450, + -9444, + -9460, + -9500, + -9563, + -9647, + -9750, + -9869, + -10000, + -10139, + -10281, + -10421, + -10554, + -10674, + -10775, + -10852, + -10899, + -10912, + -10885, + -10815, + -10698, + -10530, + -10311, + -10039, + -9715, + -9337, + -8909, + -8433, + -7913, + -7353, + -6758, + -6136, + -5491, + -4832, + -4167, + -3504, + -2851, + -2217, + -1610, + -1038, + -509, + -31, + 388, + 746, + 1034, + 1250, + 1390, + 1452, + 1434, + 1338, + 1164, + 915, + 594, + 207, + -241, + -743, + -1292, + -1880, + -2497, + -3134, + -3782, + -4430, + -5070, + -5691, + -6283, + -6839, + -7349, + -7805, + -8202, + -8534, + -8794, + -8980, + -9090, + -9121, + -9074, + -8950, + -8750, + -8479, + -8141, + -7741, + -7286, + -6782, + -6238, + -5663, + -5064, + -4451, + -3832, + -3218, + -2617, + -2037, + -1486, + -972, + -501, + -79, + 288, + 598, + 847, + 1034, + 1158, + 1219, + 1219, + 1161, + 1047, + 883, + 674, + 426, + 145, + -161, + -486, + -822, + -1161, + -1496, + -1818, + -2122, + -2400, + -2647, + -2856, + -3025, + -3148, + -3222, + -3247, + -3221, + -3144, + -3017, + -2841, + -2620, + -2357, + -2056, + -1721, + -1359, + -976, + -576, + -167, + 244, + 653, + 1053, + 1438, + 1802, + 2140, + 2449, + 2725, + 2965, + 3166, + 3328, + 3451, + 3533, + 3578, + 3587, + 3563, + 3509, + 3430, + 3330, + 3214, + 3088, + 2957, + 2826, + 2701, + 2588, + 2491, + 2416, + 2366, + 2344, + 2354, + 2398, + 2476, + 2589, + 2737, + 2918, + 3130, + 3369, + 3631, + 3913, + 4207, + 4508, + 4810, + 5105, + 5387, + 5648, + 5880, + 6077, + 6233, + 6339, + 6392, + 6385, + 6314, + 6176, + 5968, + 5690, + 5339, + 4918, + 4428, + 3873, + 3255, + 2582, + 1859, + 1092, + 292, + -534, + -1377, + -2227, + -3074, + -3906, + -4715, + -5489, + -6218, + -6894, + -7506, + -8048, + -8511, + -8890, + -9178, + -9373, + -9470, + -9469, + -9368, + -9169, + -8874, + -8486, + -8010, + -7451, + -6816, + -6113, + -5349, + -4535, + -3679, + -2791, + -1882, + -960, + -38, + 876, + 1773, + 2644, + 3481, + 4276, + 5022, + 5715, + 6349, + 6922, + 7431, + 7874, + 8252, + 8566, + 8817, + 9009, + 9145, + 9230, + 9270, + 9270, + 9236, + 9176, + 9096, + 9003, + 8903, + 8804, + 8712, + 8632, + 8569, + 8529, + 8515, + 8529, + 8575, + 8653, + 8764, + 8907, + 9081, + 9284, + 9513, + 9764, + 10033, + 10316, + 10606, + 10899, + 11189, + 11471, + 11737, + 11984, + 12205, + 12396, + 12553, + 12672, + 12749, + 12783, + 12773, + 12716, + 12614, + 12468, + 12280, + 12052, + 11788, + 11491, + 11168, + 10823, + 10462, + 10092, + 9718, + 9348, + 8987, + 8642, + 8318, + 8023, + 7760, + 7534, + 7349, + 7209, + 7114, + 7066, + 7066, + 7113, + 7206, + 7341, + 7515, + 7724, + 7963, + 8226, + 8506, + 8798, + 9093, + 9383, + 9663, + 9923, + 10156, + 10356, + 10515, + 10629, + 10690, + 10696, + 10641, + 10524, + 10342, + 10096, + 9785, + 9411, + 8977, + 8487, + 7946, + 7359, + 6733, + 6075, + 5394, + 4698, + 3996, + 3297, + 2611, + 1948, + 1316, + 723, + 179, + -308, + -733, + -1089, + -1372, + -1577, + -1701, + -1743, + -1702, + -1579, + -1377, + -1098, + -746, + -328, + 149, + 681, + 1258, + 1871, + 2511, + 3169, + 3834, + 4497, + 5149, + 5779, + 6379, + 6940, + 7454, + 7915, + 8315, + 8650, + 8915, + 9109, + 9227, + 9271, + 9240, + 9136, + 8961, + 8720, + 8417, + 8057, + 7646, + 7192, + 6702, + 6184, + 5646, + 5095, + 4541, + 3991, + 3453, + 2934, + 2441, + 1980, + 1557, + 1175, + 839, + 551, + 313, + 127, + -7, + -91, + -127, + -116, + -63, + 29, + 156, + 313, + 495, + 696, + 911, + 1135, + 1361, + 1587, + 1806, + 2015, + 2211, + 2390, + 2550, + 2690, + 2809, + 2908, + 2987, + 3048, + 3093, + 3126, + 3150, + 3169, + 3189, + 3214, + 3249, + 3300, + 3371, + 3469, + 3598, + 3762, + 3966, + 4213, + 4505, + 4846, + 5235, + 5674, + 6161, + 6695, + 7274, + 7893, + 8549, + 9235, + 9947, + 10678, + 11419, + 12163, + 12902, + 13627, + 14330, + 15002, + 15634, + 16218, + 16747, + 17213, + 17610, + 17933, + 18176, + 18336, + 18410, + 18397, + 18296, + 18108, + 17836, + 17482, + 17051, + 16548, + 15979, + 15353, + 14676, + 13958, + 13207, + 12434, + 11648, + 10860, + 10079, + 9315, + 8576, + 7873, + 7213, + 6603, + 6050, + 5559, + 5134, + 4780, + 4497, + 4288, + 4150, + 4084, + 4086, + 4152, + 4278, + 4457, + 4684, + 4951, + 5250, + 5573, + 5911, + 6256, + 6598, + 6928, + 7240, + 7524, + 7773, + 7981, + 8142, + 8251, + 8304, + 8298, + 8231, + 8102, + 7911, + 7661, + 7353, + 6990, + 6578, + 6121, + 5626, + 5099, + 4546, + 3976, + 3397, + 2815, + 2239, + 1677, + 1136, + 623, + 144, + -293, + -687, + -1031, + -1323, + -1559, + -1738, + -1861, + -1927, + -1937, + -1895, + -1803, + -1665, + -1485, + -1270, + -1024, + -753, + -464, + -164, + 141, + 446, + 745, + 1030, + 1298, + 1544, + 1763, + 1952, + 2110, + 2233, + 2322, + 2375, + 2395, + 2382, + 2339, + 2269, + 2176, + 2063, + 1936, + 1800, + 1659, + 1519, + 1385, + 1263, + 1157, + 1072, + 1012, + 981, + 981, + 1014, + 1082, + 1185, + 1322, + 1492, + 1694, + 1923, + 2176, + 2448, + 2733, + 3025, + 3319, + 3606, + 3879, + 4131, + 4354, + 4541, + 4685, + 4779, + 4816, + 4791, + 4700, + 4537, + 4301, + 3988, + 3599, + 3133, + 2592, + 1977, + 1293, + 545, + -261, + -1120, + -2023, + -2962, + -3928, + -4911, + -5901, + -6888, + -7861, + -8810, + -9725, + -10596, + -11414, + -12171, + -12858, + -13469, + -13998, + -14440, + -14792, + -15051, + -15216, + -15288, + -15268, + -15158, + -14963, + -14687, + -14337, + -13919, + -13441, + -12912, + -12341, + -11737, + -11110, + -10470, + -9826, + -9189, + -8566, + -7968, + -7402, + -6875, + -6394, + -5965, + -5591, + -5278, + -5026, + -4838, + -4713, + -4651, + -4650, + -4706, + -4817, + -4976, + -5180, + -5421, + -5693, + -5990, + -6304, + -6627, + -6954, + -7277, + -7588, + -7883, + -8154, + -8398, + -8609, + -8784, + -8920, + -9015, + -9068, + -9080, + -9050, + -8981, + -8875, + -8734, + -8564, + -8367, + -8150, + -7917, + -7674, + -7427, + -7180, + -6940, + -6712, + -6501, + -6311, + -6146, + -6009, + -5904, + -5831, + -5792, + -5788, + -5816, + -5877, + -5966, + -6083, + -6222, + -6379, + -6549, + -6726, + -6906, + -7081, + -7245, + -7392, + -7516, + -7611, + -7672, + -7693, + -7670, + -7599, + -7477, + -7302, + -7073, + -6790, + -6452, + -6062, + -5622, + -5136, + -4608, + -4043, + -3447, + -2828, + -2190, + -1544, + -895, + -253, + 374, + 980, + 1556, + 2094, + 2590, + 3035, + 3425, + 3755, + 4022, + 4223, + 4357, + 4423, + 4423, + 4357, + 4230, + 4044, + 3805, + 3519, + 3193, + 2834, + 2450, + 2049, + 1641, + 1235, + 839, + 462, + 114, + -198, + -467, + -685, + -846, + -945, + -979, + -943, + -836, + -657, + -407, + -88, + 297, + 746, + 1252, + 1809, + 2410, + 3048, + 3714, + 4398, + 5092, + 5785, + 6468, + 7131, + 7764, + 8358, + 8905, + 9396, + 9824, + 10182, + 10466, + 10671, + 10792, + 10829, + 10780, + 10646, + 10427, + 10126, + 9746, + 9293, + 8771, + 8187, + 7548, + 6860, + 6134, + 5375, + 4594, + 3798, + 2997, + 2197, + 1408, + 635, + -112, + -830, + -1513, + -2156, + -2755, + -3309, + -3814, + -4272, + -4680, + -5041, + -5357, + -5629, + -5861, + -6058, + -6222, + -6359, + -6474, + -6571, + -6656, + -6734, + -6809, + -6885, + -6967, + -7057, + -7160, + -7275, + -7406, + -7553, + -7715, + -7892, + -8081, + -8281, + -8488, + -8699, + -8909, + -9113, + -9307, + -9485, + -9642, + -9771, + -9868, + -9928, + -9945, + -9915, + -9834, + -9700, + -9509, + -9260, + -8952, + -8587, + -8164, + -7686, + -7156, + -6578, + -5957, + -5299, + -4610, + -3898, + -3171, + -2436, + -1702, + -978, + -272, + 405, + 1047, + 1646, + 2193, + 2682, + 3107, + 3461, + 3742, + 3945, + 4069, + 4112, + 4074, + 3958, + 3764, + 3498, + 3163, + 2765, + 2311, + 1809, + 1266, + 692, + 95, + -514, + -1128, + -1735, + -2326, + -2893, + -3426, + -3917, + -4360, + -4747, + -5073, + -5334, + -5526, + -5646, + -5695, + -5672, + -5578, + -5416, + -5190, + -4904, + -4563, + -4176, + -3748, + -3288, + -2803, + -2304, + -1799, + -1296, + -805, + -335, + 106, + 511, + 873, + 1184, + 1441, + 1637, + 1770, + 1837, + 1837, + 1769, + 1635, + 1436, + 1175, + 857, + 486, + 68, + -389, + -882, + -1401, + -1939, + -2488, + -3040, + -3588, + -4123, + -4638, + -5127, + -5584, + -6002, + -6378, + -6708, + -6988, + -7217, + -7393, + -7517, + -7588, + -7610, + -7585, + -7515, + -7405, + -7261, + -7086, + -6887, + -6670, + -6440, + -6205, + -5969, + -5739, + -5521, + -5320, + -5139, + -4984, + -4857, + -4761, + -4698, + -4669, + -4674, + -4711, + -4781, + -4879, + -5004, + -5152, + -5317, + -5497, + -5685, + -5875, + -6064, + -6244, + -6411, + -6559, + -6683, + -6780, + -6844, + -6873, + -6864, + -6815, + -6726, + -6597, + -6428, + -6221, + -5978, + -5705, + -5404, + -5080, + -4741, + -4392, + -4039, + -3691, + -3355, + -3037, + -2747, + -2490, + -2273, + -2105, + -1989, + -1933, + -1939, + -2012, + -2154, + -2366, + -2650, + -3003, + -3425, + -3913, + -4461, + -5066, + -5720, + -6417, + -7149, + -7906, + -8681, + -9462, + -10241, + -11007, + -11749, + -12459, + -13125, + -13740, + -14294, + -14781, + -15191, + -15521, + -15765, + -15919, + -15980, + -15948, + -15822, + -15604, + -15296, + -14902, + -14427, + -13876, + -13257, + -12578, + -11846, + -11072, + -10264, + -9433, + -8588, + -7740, + -6899, + -6074, + -5275, + -4509, + -3786, + -3112, + -2494, + -1936, + -1442, + -1017, + -661, + -376, + -162, + -16, + 62, + 78, + 35, + -61, + -207, + -394, + -617, + -869, + -1141, + -1428, + -1722, + -2016, + -2304, + -2580, + -2839, + -3075, + -3285, + -3465, + -3614, + -3729, + -3811, + -3859, + -3875, + -3860, + -3818, + -3752, + -3665, + -3563, + -3449, + -3331, + -3212, + -3098, + -2994, + -2907, + -2839, + -2797, + -2783, + -2801, + -2854, + -2943, + -3069, + -3234, + -3435, + -3671, + -3941, + -4240, + -4565, + -4912, + -5276, + -5650, + -6028, + -6404, + -6772, + -7125, + -7456, + -7760, + -8029, + -8258, + -8442, + -8578, + -8660, + -8686, + -8655, + -8565, + -8416, + -8209, + -7946, + -7630, + -7264, + -6852, + -6402, + -5917, + -5406, + -4874, + -4330, + -3782, + -3236, + -2702, + -2185, + -1695, + -1236, + -817, + -441, + -114, + 159, + 378, + 540, + 644, + 691, + 682, + 619, + 506, + 348, + 151, + -79, + -335, + -610, + -895, + -1181, + -1459, + -1721, + -1958, + -2160, + -2321, + -2431, + -2485, + -2475, + -2397, + -2246, + -2019, + -1713, + -1329, + -865, + -324, + 291, + 977, + 1730, + 2542, + 3406, + 4316, + 5262, + 6234, + 7224, + 8221, + 9216, + 10197, + 11155, + 12080, + 12962, + 13794, + 14567, + 15273, + 15907, + 16463, + 16937, + 17326, + 17628, + 17843, + 17970, + 18012, + 17971, + 17850, + 17656, + 17392, + 17066, + 16684, + 16254, + 15783, + 15280, + 14753, + 14210, + 13659, + 13108, + 12563, + 12032, + 11521, + 11034, + 10577, + 10153, + 9765, + 9414, + 9102, + 8829, + 8594, + 8395, + 8230, + 8095, + 7988, + 7903, + 7836, + 7783, + 7738, + 7696, + 7653, + 7602, + 7541, + 7464, + 7369, + 7252, + 7111, + 6944, + 6751, + 6531, + 6285, + 6015, + 5723, + 5411, + 5085, + 4747, + 4404, + 4059, + 3718, + 3388, + 3073, + 2780, + 2515, + 2282, + 2086, + 1932, + 1823, + 1764, + 1755, + 1798, + 1894, + 2043, + 2242, + 2490, + 2783, + 3118, + 3488, + 3888, + 4313, + 4753, + 5202, + 5653, + 6095, + 6522, + 6924, + 7295, + 7625, + 7907, + 8135, + 8303, + 8405, + 8437, + 8396, + 8279, + 8086, + 7816, + 7470, + 7051, + 6563, + 6009, + 5396, + 4731, + 4020, + 3272, + 2496, + 1701, + 897, + 93, + -699, + -1472, + -2215, + -2919, + -3576, + -4177, + -4716, + -5187, + -5585, + -5905, + -6145, + -6303, + -6379, + -6374, + -6289, + -6128, + -5894, + -5595, + -5234, + -4820, + -4361, + -3863, + -3337, + -2791, + -2235, + -1677, + -1126, + -591, + -80, + 399, + 840, + 1237, + 1585, + 1878, + 2116, + 2294, + 2413, + 2473, + 2474, + 2420, + 2313, + 2159, + 1960, + 1725, + 1458, + 1168, + 860, + 543, + 224, + -88, + -388, + -667, + -920, + -1141, + -1323, + -1462, + -1554, + -1597, + -1588, + -1527, + -1412, + -1246, + -1029, + -764, + -455, + -106, + 278, + 693, + 1131, + 1588, + 2056, + 2530, + 3002, + 3467, + 3918, + 4350, + 4758, + 5137, + 5484, + 5795, + 6068, + 6302, + 6496, + 6650, + 6765, + 6843, + 6887, + 6900, + 6886, + 6849, + 6794, + 6727, + 6652, + 6576, + 6503, + 6439, + 6390, + 6359, + 6351, + 6369, + 6416, + 6495, + 6607, + 6751, + 6928, + 7137, + 7374, + 7638, + 7923, + 8225, + 8539, + 8859, + 9179, + 9490, + 9787, + 10061, + 10306, + 10515, + 10680, + 10794, + 10853, + 10850, + 10781, + 10642, + 10431, + 10147, + 9787, + 9354, + 8848, + 8272, + 7631, + 6930, + 6174, + 5370, + 4528, + 3654, + 2759, + 1852, + 943, + 43, + -837, + -1689, + -2501, + -3264, + -3969, + -4607, + -5171, + -5655, + -6053, + -6360, + -6574, + -6691, + -6712, + -6638, + -6469, + -6209, + -5863, + -5435, + -4933, + -4363, + -3733, + -3053, + -2332, + -1579, + -804, + -18, + 769, + 1548, + 2310, + 3046, + 3747, + 4406, + 5017, + 5573, + 6070, + 6505, + 6875, + 7179, + 7416, + 7587, + 7695, + 7742, + 7731, + 7668, + 7557, + 7405, + 7218, + 7003, + 6766, + 6514, + 6255, + 5995, + 5740, + 5497, + 5270, + 5065, + 4886, + 4736, + 4616, + 4530, + 4478, + 4458, + 4471, + 4514, + 4585, + 4680, + 4795, + 4926, + 5067, + 5213, + 5358, + 5498, + 5626, + 5736, + 5824, + 5885, + 5914, + 5907, + 5862, + 5776, + 5647, + 5475, + 5260, + 5003, + 4705, + 4369, + 3999, + 3599, + 3173, + 2727, + 2266, + 1797, + 1326, + 860, + 405, + -31, + -445, + -829, + -1179, + -1490, + -1758, + -1979, + -2152, + -2274, + -2346, + -2368, + -2341, + -2268, + -2152, + -1997, + -1808, + -1592, + -1353, + -1099, + -837, + -575, + -320, + -80, + 137, + 325, + 477, + 587, + 649, + 658, + 611, + 504, + 336, + 105, + -187, + -540, + -952, + -1418, + -1935, + -2496, + -3095, + -3725, + -4378, + -5046, + -5719, + -6389, + -7046, + -7680, + -8284, + -8847, + -9362, + -9821, + -10217, + -10543, + -10796, + -10970, + -11062, + -11072, + -10997, + -10840, + -10601, + -10284, + -9893, + -9433, + -8911, + -8334, + -7709, + -7046, + -6353, + -5641, + -4919, + -4197, + -3485, + -2792, + -2128, + -1502, + -921, + -392, + 75, + 480, + 814, + 1077, + 1264, + 1376, + 1413, + 1374, + 1264, + 1085, + 843, + 541, + 186, + -214, + -654, + -1124, + -1618, + -2127, + -2643, + -3158, + -3665, + -4155, + -4622, + -5060, + -5464, + -5828, + -6149, + -6425, + -6652, + -6830, + -6958, + -7038, + -7071, + -7060, + -7006, + -6915, + -6791, + -6638, + -6461, + -6266, + -6058, + -5843, + -5626, + -5411, + -5204, + -5009, + -4828, + -4666, + -4525, + -4405, + -4309, + -4235, + -4183, + -4152, + -4139, + -4141, + -4154, + -4175, + -4199, + -4220, + -4234, + -4236, + -4219, + -4179, + -4110, + -4008, + -3869, + -3690, + -3466, + -3196, + -2879, + -2514, + -2101, + -1643, + -1140, + -597, + -17, + 593, + 1230, + 1885, + 2553, + 3224, + 3891, + 4546, + 5180, + 5784, + 6350, + 6870, + 7336, + 7741, + 8078, + 8341, + 8527, + 8630, + 8649, + 8581, + 8426, + 8185, + 7860, + 7454, + 6970, + 6415, + 5794, + 5115, + 4385, + 3614, + 2810, + 1984, + 1145, + 304, + -530, + -1347, + -2138, + -2893, + -3604, + -4264, + -4866, + -5403, + -5873, + -6270, + -6592, + -6839, + -7010, + -7106, + -7131, + -7086, + -6978, + -6811, + -6592, + -6328, + -6027, + -5696, + -5345, + -4981, + -4615, + -4253, + -3906, + -3580, + -3283, + -3022, + -2803, + -2631, + -2510, + -2443, + -2432, + -2478, + -2581, + -2741, + -2954, + -3217, + -3526, + -3877, + -4262, + -4677, + -5113, + -5564, + -6021, + -6477, + -6923, + -7353, + -7759, + -8134, + -8471, + -8764, + -9008, + -9199, + -9333, + -9408, + -9422, + -9375, + -9266, + -9097, + -8871, + -8589, + -8257, + -7878, + -7457, + -7001, + -6515, + -6006, + -5480, + -4943, + -4402, + -3863, + -3332, + -2814, + -2314, + -1837, + -1385, + -961, + -569, + -208, + 120, + 418, + 686, + 925, + 1140, + 1332, + 1507, + 1668, + 1822, + 1971, + 2123, + 2281, + 2452, + 2639, + 2848, + 3082, + 3346, + 3641, + 3970, + 4334, + 4734, + 5169, + 5637, + 6138, + 6667, + 7220, + 7793, + 8380, + 8976, + 9572, + 10164, + 10742, + 11299, + 11828, + 12321, + 12770, + 13170, + 13512, + 13791, + 14003, + 14142, + 14206, + 14191, + 14097, + 13924, + 13672, + 13344, + 12943, + 12472, + 11939, + 11349, + 10709, + 10028, + 9315, + 8578, + 7829, + 7077, + 6332, + 5604, + 4905, + 4242, + 3626, + 3066, + 2568, + 2140, + 1788, + 1517, + 1331, + 1231, + 1219, + 1296, + 1460, + 1708, + 2036, + 2440, + 2914, + 3451, + 4044, + 4683, + 5360, + 6066, + 6790, + 7523, + 8255, + 8977, + 9678, + 10351, + 10987, + 11578, + 12117, + 12600, + 13021, + 13376, + 13663, + 13879, + 14026, + 14103, + 14112, + 14057, + 13939, + 13765, + 13540, + 13268, + 12958, + 12615, + 12248, + 11862, + 11466, + 11066, + 10669, + 10282, + 9910, + 9559, + 9234, + 8938, + 8675, + 8446, + 8252, + 8095, + 7973, + 7886, + 7831, + 7805, + 7804, + 7824, + 7862, + 7910, + 7965, + 8021, + 8072, + 8112, + 8137, + 8142, + 8122, + 8073, + 7992, + 7876, + 7724, + 7534, + 7306, + 7041, + 6740, + 6406, + 6042, + 5651, + 5238, + 4808, + 4367, + 3920, + 3474, + 3035, + 2610, + 2204, + 1825, + 1477, + 1166, + 897, + 673, + 499, + 376, + 307, + 291, + 329, + 419, + 560, + 747, + 976, + 1244, + 1544, + 1870, + 2215, + 2572, + 2933, + 3290, + 3635, + 3961, + 4260, + 4524, + 4748, + 4925, + 5049, + 5116, + 5122, + 5066, + 4944, + 4757, + 4506, + 4192, + 3818, + 3388, + 2906, + 2380, + 1814, + 1218, + 598, + -35, + -675, + -1311, + -1935, + -2538, + -3110, + -3644, + -4131, + -4565, + -4939, + -5248, + -5487, + -5652, + -5743, + -5757, + -5696, + -5559, + -5351, + -5075, + -4735, + -4338, + -3890, + -3399, + -2874, + -2323, + -1756, + -1183, + -613, + -56, + 478, + 980, + 1441, + 1854, + 2210, + 2503, + 2727, + 2878, + 2951, + 2945, + 2859, + 2692, + 2445, + 2120, + 1721, + 1252, + 719, + 127, + -516, + -1205, + -1930, + -2684, + -3457, + -4243, + -5031, + -5814, + -6585, + -7335, + -8058, + -8748, + -9400, + -10008, + -10569, + -11081, + -11542, + -11950, + -12306, + -12611, + -12866, + -13074, + -13238, + -13362, + -13450, + -13506, + -13536, + -13545, + -13538, + -13519, + -13495, + -13468, + -13444, + -13425, + -13416, + -13417, + -13432, + -13460, + -13501, + -13556, + -13622, + -13698, + -13781, + -13866, + -13950, + -14029, + -14097, + -14149, + -14180, + -14184, + -14157, + -14092, + -13985, + -13832, + -13628, + -13371, + -13058, + -12688, + -12259, + -11771, + -11227, + -10627, + -9975, + -9275, + -8532, + -7751, + -6939, + -6103, + -5251, + -4391, + -3532, + -2681, + -1849, + -1044, + -275, + 450, + 1124, + 1740, + 2291, + 2771, + 3175, + 3502, + 3747, + 3909, + 3989, + 3987, + 3906, + 3748, + 3519, + 3224, + 2869, + 2462, + 2010, + 1522, + 1008, + 476, + -62, + -600, + -1126, + -1632, + -2108, + -2547, + -2941, + -3283, + -3568, + -3791, + -3948, + -4037, + -4056, + -4006, + -3887, + -3703, + -3455, + -3149, + -2791, + -2386, + -1942, + -1466, + -967, + -453, + 65, + 581, + 1085, + 1567, + 2021, + 2437, + 2809, + 3130, + 3395, + 3598, + 3737, + 3809, + 3811, + 3745, + 3610, + 3408, + 3143, + 2817, + 2436, + 2005, + 1531, + 1021, + 481, + -80, + -655, + -1235, + -1814, + -2382, + -2933, + -3460, + -3957, + -4417, + -4835, + -5209, + -5534, + -5808, + -6030, + -6200, + -6318, + -6386, + -6405, + -6380, + -6314, + -6212, + -6078, + -5919, + -5740, + -5546, + -5346, + -5143, + -4944, + -4756, + -4582, + -4427, + -4297, + -4193, + -4118, + -4076, + -4066, + -4088, + -4143, + -4229, + -4343, + -4482, + -4644, + -4823, + -5015, + -5216, + -5419, + -5619, + -5811, + -5988, + -6146, + -6280, + -6385, + -6456, + -6491, + -6487, + -6442, + -6355, + -6225, + -6053, + -5841, + -5592, + -5308, + -4995, + -4656, + -4298, + -3926, + -3549, + -3172, + -2804, + -2451, + -2122, + -1823, + -1562, + -1345, + -1178, + -1068, + -1018, + -1032, + -1113, + -1263, + -1482, + -1770, + -2125, + -2545, + -3025, + -3561, + -4147, + -4775, + -5439, + -6129, + -6836, + -7551, + -8265, + -8966, + -9645, + -10292, + -10897, + -11451, + -11946, + -12373, + -12726, + -12998, + -13184, + -13281, + -13285, + -13196, + -13013, + -12737, + -12370, + -11917, + -11381, + -10769, + -10087, + -9344, + -8547, + -7705, + -6829, + -5928, + -5013, + -4093, + -3178, + -2279, + -1405, + -564, + 234, + 984, + 1678, + 2311, + 2879, + 3378, + 3806, + 4162, + 4445, + 4657, + 4800, + 4877, + 4893, + 4851, + 4757, + 4618, + 4439, + 4229, + 3993, + 3739, + 3474, + 3205, + 2938, + 2679, + 2434, + 2207, + 2003, + 1825, + 1675, + 1556, + 1466, + 1408, + 1378, + 1377, + 1400, + 1444, + 1507, + 1583, + 1667, + 1754, + 1839, + 1917, + 1981, + 2028, + 2051, + 2047, + 2011, + 1940, + 1832, + 1684, + 1495, + 1265, + 994, + 684, + 337, + -44, + -456, + -894, + -1352, + -1826, + -2310, + -2796, + -3278, + -3750, + -4204, + -4636, + -5037, + -5403, + -5728, + -6008, + -6239, + -6418, + -6542, + -6611, + -6623, + -6580, + -6483, + -6334, + -6138, + -5898, + -5620, + -5310, + -4973, + -4617, + -4250, + -3878, + -3510, + -3153, + -2814, + -2502, + -2222, + -1981, + -1785, + -1638, + -1544, + -1506, + -1526, + -1605, + -1742, + -1937, + -2186, + -2486, + -2833, + -3221, + -3643, + -4093, + -4563, + -5045, + -5529, + -6007, + -6470, + -6909, + -7315, + -7679, + -7995, + -8253, + -8449, + -8576, + -8629, + -8605, + -8502, + -8318, + -8053, + -7709, + -7287, + -6792, + -6227, + -5599, + -4915, + -4182, + -3408, + -2602, + -1775, + -936, + -94, + 738, + 1554, + 2342, + 3092, + 3797, + 4447, + 5037, + 5559, + 6007, + 6379, + 6669, + 6877, + 7002, + 7043, + 7003, + 6884, + 6689, + 6422, + 6091, + 5699, + 5256, + 4767, + 4241, + 3686, + 3110, + 2521, + 1927, + 1337, + 756, + 193, + -345, + -856, + -1333, + -1773, + -2172, + -2529, + -2842, + -3111, + -3337, + -3522, + -3666, + -3775, + -3851, + -3898, + -3920, + -3924, + -3913, + -3893, + -3870, + -3846, + -3829, + -3821, + -3826, + -3847, + -3888, + -3949, + -4032, + -4138, + -4264, + -4412, + -4577, + -4757, + -4950, + -5150, + -5353, + -5555, + -5749, + -5931, + -6093, + -6232, + -6341, + -6415, + -6449, + -6439, + -6381, + -6271, + -6108, + -5890, + -5617, + -5288, + -4905, + -4471, + -3988, + -3462, + -2895, + -2296, + -1669, + -1023, + -365, + 296, + 954, + 1598, + 2222, + 2816, + 3372, + 3883, + 4341, + 4741, + 5077, + 5343, + 5537, + 5656, + 5698, + 5664, + 5553, + 5368, + 5112, + 4789, + 4405, + 3966, + 3479, + 2953, + 2394, + 1814, + 1221, + 625, + 35, + -537, + -1084, + -1596, + -2065, + -2482, + -2841, + -3135, + -3359, + -3510, + -3583, + -3579, + -3495, + -3332, + -3093, + -2781, + -2399, + -1953, + -1449, + -893, + -294, + 339, + 1000, + 1678, + 2364, + 3050, + 3726, + 4383, + 5014, + 5609, + 6164, + 6670, + 7123, + 7519, + 7854, + 8125, + 8332, + 8475, + 8555, + 8573, + 8533, + 8439, + 8296, + 8109, + 7885, + 7630, + 7352, + 7058, + 6755, + 6452, + 6155, + 5872, + 5610, + 5374, + 5170, + 5003, + 4878, + 4796, + 4761, + 4774, + 4835, + 4943, + 5098, + 5296, + 5534, + 5809, + 6116, + 6449, + 6803, + 7172, + 7550, + 7930, + 8306, + 8671, + 9020, + 9347, + 9647, + 9916, + 10148, + 10343, + 10496, + 10607, + 10674, + 10699, + 10681, + 10623, + 10527, + 10396, + 10235, + 10048, + 9839, + 9615, + 9380, + 9140, + 8900, + 8667, + 8445, + 8239, + 8053, + 7892, + 7759, + 7655, + 7583, + 7543, + 7535, + 7557, + 7609, + 7687, + 7788, + 7906, + 8037, + 8176, + 8315, + 8449, + 8569, + 8670, + 8743, + 8781, + 8779, + 8728, + 8624, + 8461, + 8234, + 7940, + 7576, + 7140, + 6631, + 6050, + 5398, + 4679, + 3895, + 3053, + 2157, + 1215, + 235, + -773, + -1803, + -2844, + -3885, + -4916, + -5926, + -6906, + -7844, + -8732, + -9559, + -10318, + -11000, + -11598, + -12108, + -12523, + -12841, + -13059, + -13177, + -13193, + -13111, + -12933, + -12662, + -12304, + -11865, + -11353, + -10774, + -10139, + -9455, + -8733, + -7982, + -7213, + -6435, + -5658, + -4892, + -4146, + -3428, + -2745, + -2105, + -1512, + -973, + -491, + -68, + 293, + 594, + 833, + 1013, + 1137, + 1207, + 1229, + 1208, + 1148, + 1057, + 941, + 807, + 661, + 511, + 364, + 225, + 101, + -2, + -81, + -130, + -147, + -129, + -74, + 17, + 146, + 312, + 513, + 745, + 1006, + 1291, + 1596, + 1916, + 2246, + 2579, + 2910, + 3234, + 3544, + 3836, + 4104, + 4343, + 4550, + 4722, + 4855, + 4948, + 5000, + 5010, + 4980, + 4910, + 4804, + 4664, + 4494, + 4299, + 4083, + 3853, + 3615, + 3374, + 3137, + 2911, + 2701, + 2514, + 2355, + 2230, + 2144, + 2100, + 2101, + 2150, + 2249, + 2397, + 2595, + 2841, + 3134, + 3468, + 3842, + 4249, + 4684, + 5141, + 5613, + 6092, + 6572, + 7044, + 7500, + 7934, + 8338, + 8705, + 9028, + 9302, + 9521, + 9682, + 9782, + 9817, + 9788, + 9693, + 9534, + 9314, + 9034, + 8701, + 8319, + 7893, + 7432, + 6943, + 6435, + 5915, + 5394, + 4879, + 4382, + 3910, + 3473, + 3079, + 2735, + 2450, + 2228, + 2076, + 1998, + 1996, + 2074, + 2231, + 2468, + 2782, + 3171, + 3631, + 4156, + 4741, + 5379, + 6062, + 6781, + 7526, + 8290, + 9061, + 9830, + 10587, + 11323, + 12027, + 12692, + 13309, + 13870, + 14370, + 14801, + 15161, + 15445, + 15650, + 15776, + 15823, + 15792, + 15684, + 15503, + 15254, + 14941, + 14571, + 14150, + 13685, + 13184, + 12656, + 12107, + 11548, + 10984, + 10425, + 9878, + 9349, + 8846, + 8373, + 7936, + 7539, + 7186, + 6877, + 6616, + 6401, + 6233, + 6111, + 6031, + 5992, + 5990, + 6020, + 6078, + 6159, + 6258, + 6369, + 6487, + 6608, + 6725, + 6834, + 6931, + 7013, + 7076, + 7118, + 7138, + 7134, + 7106, + 7055, + 6984, + 6893, + 6785, + 6666, + 6537, + 6405, + 6274, + 6149, + 6036, + 5940, + 5867, + 5821, + 5807, + 5830, + 5894, + 6002, + 6155, + 6357, + 6607, + 6905, + 7250, + 7640, + 8073, + 8543, + 9047, + 9578, + 10131, + 10698, + 11271, + 11842, + 12404, + 12948, + 13464, + 13946, + 14383, + 14769, + 15097, + 15359, + 15550, + 15665, + 15700, + 15651, + 15518, + 15298, + 14993, + 14605, + 14136, + 13590, + 12972, + 12288, + 11546, + 10753, + 9917, + 9049, + 8156, + 7250, + 6341, + 5437, + 4550, + 3688, + 2861, + 2077, + 1344, + 668, + 56, + -486, + -957, + -1354, + -1674, + -1918, + -2087, + -2183, + -2209, + -2170, + -2070, + -1917, + -1717, + -1479, + -1209, + -917, + -611, + -300, + 5, + 300, + 574, + 820, + 1030, + 1200, + 1324, + 1396, + 1414, + 1376, + 1279, + 1125, + 913, + 647, + 328, + -38, + -448, + -896, + -1375, + -1879, + -2400, + -2930, + -3462, + -3989, + -4501, + -4993, + -5456, + -5885, + -6273, + -6615, + -6906, + -7144, + -7324, + -7446, + -7509, + -7512, + -7457, + -7346, + -7182, + -6968, + -6709, + -6411, + -6077, + -5716, + -5332, + -4932, + -4523, + -4111, + -3703, + -3304, + -2920, + -2556, + -2215, + -1903, + -1621, + -1373, + -1158, + -978, + -833, + -720, + -639, + -586, + -558, + -552, + -562, + -585, + -614, + -646, + -674, + -693, + -699, + -687, + -653, + -593, + -503, + -383, + -230, + -44, + 175, + 426, + 708, + 1016, + 1348, + 1699, + 2063, + 2435, + 2808, + 3175, + 3529, + 3861, + 4166, + 4435, + 4660, + 4835, + 4954, + 5009, + 4997, + 4912, + 4751, + 4512, + 4193, + 3794, + 3316, + 2760, + 2131, + 1431, + 667, + -154, + -1027, + -1942, + -2892, + -3866, + -4854, + -5847, + -6833, + -7803, + -8747, + -9653, + -10514, + -11320, + -12063, + -12736, + -13332, + -13847, + -14276, + -14616, + -14866, + -15026, + -15096, + -15078, + -14977, + -14796, + -14542, + -14220, + -13838, + -13404, + -12928, + -12418, + -11883, + -11335, + -10782, + -10233, + -9700, + -9189, + -8709, + -8269, + -7875, + -7532, + -7246, + -7020, + -6858, + -6760, + -6729, + -6762, + -6858, + -7015, + -7229, + -7496, + -7810, + -8165, + -8556, + -8975, + -9415, + -9868, + -10328, + -10788, + -11240, + -11677, + -12094, + -12486, + -12847, + -13173, + -13462, + -13710, + -13917, + -14082, + -14204, + -14286, + -14329, + -14336, + -14311, + -14258, + -14180, + -14084, + -13974, + -13857, + -13737, + -13620, + -13511, + -13416, + -13338, + -13282, + -13252, + -13250, + -13278, + -13338, + -13429, + -13552, + -13705, + -13886, + -14093, + -14321, + -14566, + -14824, + -15089, + -15355, + -15616, + -15866, + -16098, + -16307, + -16485, + -16628, + -16731, + -16787, + -16794, + -16747, + -16645, + -16485, + -16267, + -15991, + -15659, + -15272, + -14833, + -14347, + -13818, + -13252, + -12656, + -12035, + -11399, + -10753, + -10107, + -9468, + -8844, + -8243, + -7672, + -7139, + -6650, + -6210, + -5824, + -5496, + -5230, + -5026, + -4887, + -4811, + -4797, + -4842, + -4944, + -5097, + -5297, + -5536, + -5807, + -6103, + -6415, + -6735, + -7054, + -7362, + -7652, + -7914, + -8139, + -8321, + -8451, + -8525, + -8535, + -8478, + -8350, + -8149, + -7874, + -7525, + -7103, + -6611, + -6052, + -5432, + -4755, + -4030, + -3263, + -2463, + -1638, + -799, + 44, + 883, + 1707, + 2507, + 3272, + 3995, + 4666, + 5278, + 5823, + 6297, + 6693, + 7009, + 7241, + 7387, + 7448, + 7424, + 7318, + 7131, + 6868, + 6534, + 6136, + 5678, + 5170, + 4618, + 4030, + 3416, + 2782, + 2139, + 1493, + 853, + 227, + -379, + -959, + -1507, + -2019, + -2490, + -2918, + -3300, + -3636, + -3925, + -4168, + -4367, + -4524, + -4642, + -4724, + -4775, + -4800, + -4803, + -4789, + -4763, + -4731, + -4696, + -4665, + -4640, + -4626, + -4625, + -4640, + -4672, + -4724, + -4794, + -4882, + -4987, + -5106, + -5238, + -5377, + -5521, + -5665, + -5803, + -5931, + -6043, + -6134, + -6197, + -6228, + -6222, + -6174, + -6080, + -5937, + -5741, + -5492, + -5187, + -4827, + -4412, + -3944, + -3427, + -2863, + -2257, + -1614, + -942, + -246, + 465, + 1184, + 1903, + 2613, + 3304, + 3970, + 4599, + 5186, + 5722, + 6199, + 6612, + 6954, + 7222, + 7411, + 7520, + 7545, + 7488, + 7349, + 7131, + 6836, + 6468, + 6034, + 5540, + 4992, + 4400, + 3771, + 3114, + 2439, + 1756, + 1075, + 405, + -244, + -864, + -1447, + -1984, + -2468, + -2894, + -3256, + -3551, + -3775, + -3928, + -4008, + -4017, + -3956, + -3829, + -3639, + -3393, + -3096, + -2754, + -2376, + -1970, + -1545, + -1108, + -669, + -238, + 177, + 569, + 930, + 1251, + 1526, + 1750, + 1917, + 2024, + 2069, + 2048, + 1963, + 1813, + 1599, + 1325, + 995, + 612, + 183, + -287, + -791, + -1321, + -1871, + -2432, + -2995, + -3554, + -4101, + -4628, + -5127, + -5594, + -6021, + -6404, + -6738, + -7021, + -7249, + -7422, + -7539, + -7600, + -7607, + -7561, + -7467, + -7327, + -7147, + -6931, + -6685, + -6414, + -6125, + -5825, + -5518, + -5211, + -4911, + -4621, + -4347, + -4093, + -3863, + -3660, + -3486, + -3341, + -3228, + -3144, + -3090, + -3062, + -3059, + -3077, + -3112, + -3159, + -3214, + -3272, + -3326, + -3371, + -3403, + -3415, + -3403, + -3362, + -3288, + -3177, + -3027, + -2836, + -2603, + -2327, + -2009, + -1651, + -1254, + -823, + -361, + 126, + 634, + 1155, + 1683, + 2211, + 2732, + 3237, + 3719, + 4171, + 4586, + 4955, + 5275, + 5537, + 5739, + 5875, + 5943, + 5940, + 5867, + 5722, + 5507, + 5225, + 4879, + 4475, + 4017, + 3512, + 2968, + 2393, + 1796, + 1187, + 575, + -29, + -616, + -1177, + -1701, + -2178, + -2601, + -2961, + -3251, + -3464, + -3596, + -3643, + -3601, + -3468, + -3246, + -2933, + -2533, + -2048, + -1484, + -845, + -140, + 625, + 1443, + 2303, + 3197, + 4113, + 5043, + 5976, + 6901, + 7810, + 8692, + 9539, + 10343, + 11095, + 11789, + 12421, + 12984, + 13475, + 13892, + 14234, + 14501, + 14693, + 14812, + 14861, + 14845, + 14767, + 14634, + 14450, + 14224, + 13961, + 13669, + 13355, + 13025, + 12688, + 12348, + 12014, + 11690, + 11381, + 11091, + 10825, + 10585, + 10372, + 10188, + 10032, + 9905, + 9803, + 9726, + 9669, + 9629, + 9602, + 9583, + 9567, + 9549, + 9523, + 9484, + 9427, + 9347, + 9239, + 9100, + 8926, + 8714, + 8463, + 8170, + 7836, + 7461, + 7046, + 6593, + 6106, + 5587, + 5041, + 4474, + 3891, + 3298, + 2701, + 2108, + 1524, + 956, + 412, + -102, + -582, + -1021, + -1415, + -1759, + -2050, + -2286, + -2465, + -2586, + -2651, + -2659, + -2614, + -2519, + -2378, + -2196, + -1978, + -1731, + -1462, + -1178, + -886, + -594, + -310, + -41, + 205, + 422, + 604, + 744, + 838, + 882, + 873, + 808, + 686, + 509, + 276, + -9, + -344, + -725, + -1146, + -1600, + -2081, + -2582, + -3093, + -3606, + -4113, + -4604, + -5071, + -5504, + -5895, + -6236, + -6520, + -6740, + -6890, + -6965, + -6962, + -6878, + -6711, + -6461, + -6130, + -5718, + -5231, + -4671, + -4045, + -3360, + -2622, + -1841, + -1025, + -183, + 673, + 1535, + 2393, + 3236, + 4054, + 4838, + 5579, + 6269, + 6899, + 7464, + 7958, + 8376, + 8714, + 8971, + 9145, + 9236, + 9245, + 9174, + 9028, + 8810, + 8525, + 8179, + 7780, + 7333, + 6848, + 6332, + 5792, + 5238, + 4677, + 4117, + 3566, + 3029, + 2514, + 2026, + 1570, + 1149, + 768, + 427, + 129, + -126, + -340, + -513, + -647, + -746, + -813, + -852, + -868, + -865, + -849, + -825, + -798, + -772, + -753, + -745, + -751, + -776, + -822, + -890, + -982, + -1099, + -1240, + -1404, + -1589, + -1792, + -2011, + -2240, + -2477, + -2715, + -2950, + -3176, + -3387, + -3577, + -3742, + -3875, + -3972, + -4028, + -4040, + -4004, + -3917, + -3779, + -3587, + -3343, + -3047, + -2702, + -2310, + -1876, + -1404, + -900, + -371, + 176, + 735, + 1298, + 1855, + 2398, + 2920, + 3411, + 3864, + 4270, + 4624, + 4917, + 5146, + 5304, + 5389, + 5397, + 5326, + 5177, + 4950, + 4646, + 4269, + 3823, + 3313, + 2746, + 2127, + 1466, + 771, + 51, + -684, + -1426, + -2164, + -2888, + -3588, + -4256, + -4883, + -5459, + -5980, + -6436, + -6824, + -7139, + -7378, + -7538, + -7618, + -7619, + -7543, + -7392, + -7170, + -6882, + -6534, + -6132, + -5684, + -5198, + -4682, + -4146, + -3597, + -3047, + -2502, + -1973, + -1467, + -993, + -556, + -164, + 177, + 464, + 694, + 863, + 971, + 1018, + 1003, + 930, + 800, + 619, + 391, + 121, + -184, + -518, + -873, + -1242, + -1617, + -1991, + -2356, + -2705, + -3031, + -3328, + -3589, + -3810, + -3987, + -4116, + -4195, + -4221, + -4196, + -4118, + -3989, + -3812, + -3589, + -3324, + -3022, + -2688, + -2327, + -1946, + -1550, + -1145, + -740, + -338, + 52, + 427, + 780, + 1107, + 1405, + 1669, + 1897, + 2087, + 2239, + 2352, + 2428, + 2467, + 2472, + 2447, + 2395, + 2320, + 2228, + 2122, + 2009, + 1895, + 1784, + 1683, + 1596, + 1528, + 1484, + 1468, + 1482, + 1530, + 1612, + 1730, + 1884, + 2073, + 2294, + 2546, + 2824, + 3124, + 3442, + 3770, + 4104, + 4435, + 4758, + 5065, + 5348, + 5601, + 5816, + 5986, + 6106, + 6170, + 6172, + 6110, + 5980, + 5779, + 5507, + 5164, + 4751, + 4270, + 3726, + 3122, + 2464, + 1759, + 1014, + 238, + -559, + -1370, + -2183, + -2989, + -3777, + -4537, + -5258, + -5932, + -6548, + -7098, + -7574, + -7969, + -8278, + -8495, + -8618, + -8643, + -8569, + -8397, + -8128, + -7764, + -7310, + -6770, + -6151, + -5460, + -4704, + -3892, + -3034, + -2139, + -1217, + -278, + 667, + 1609, + 2539, + 3446, + 4323, + 5162, + 5955, + 6697, + 7381, + 8005, + 8566, + 9060, + 9488, + 9850, + 10147, + 10381, + 10557, + 10677, + 10748, + 10774, + 10762, + 10718, + 10648, + 10561, + 10462, + 10358, + 10256, + 10161, + 10080, + 10017, + 9977, + 9962, + 9976, + 10020, + 10096, + 10203, + 10341, + 10507, + 10700, + 10916, + 11151, + 11401, + 11661, + 11925, + 12188, + 12445, + 12688, + 12914, + 13115, + 13288, + 13428, + 13530, + 13592, + 13610, + 13582, + 13507, + 13386, + 13218, + 13005, + 12749, + 12454, + 12122, + 11760, + 11370, + 10961, + 10536, + 10103, + 9668, + 9237, + 8817, + 8415, + 8035, + 7684, + 7366, + 7085, + 6845, + 6649, + 6499, + 6395, + 6337, + 6324, + 6354, + 6424, + 6531, + 6670, + 6835, + 7020, + 7219, + 7425, + 7630, + 7828, + 8009, + 8167, + 8295, + 8385, + 8432, + 8429, + 8371, + 8255, + 8077, + 7834, + 7526, + 7153, + 6714, + 6213, + 5653, + 5038, + 4372, + 3664, + 2918, + 2143, + 1348, + 541, + -267, + -1070, + -1857, + -2618, + -3344, + -4028, + -4660, + -5234, + -5743, + -6181, + -6544, + -6828, + -7030, + -7150, + -7188, + -7145, + -7023, + -6826, + -6559, + -6228, + -5839, + -5399, + -4919, + -4405, + -3868, + -3317, + -2762, + -2213, + -1680, + -1171, + -695, + -261, + 122, + 450, + 717, + 917, + 1046, + 1103, + 1086, + 995, + 830, + 594, + 289, + -79, + -507, + -989, + -1517, + -2084, + -2684, + -3308, + -3947, + -4594, + -5241, + -5879, + -6501, + -7100, + -7669, + -8203, + -8696, + -9145, + -9545, + -9894, + -10192, + -10437, + -10629, + -10770, + -10862, + -10907, + -10910, + -10873, + -10802, + -10702, + -10578, + -10435, + -10279, + -10114, + -9947, + -9781, + -9621, + -9472, + -9335, + -9214, + -9111, + -9026, + -8961, + -8914, + -8884, + -8869, + -8867, + -8873, + -8885, + -8898, + -8907, + -8906, + -8891, + -8856, + -8796, + -8706, + -8581, + -8417, + -8209, + -7955, + -7652, + -7299, + -6895, + -6439, + -5933, + -5380, + -4780, + -4140, + -3463, + -2755, + -2023, + -1273, + -513, + 248, + 1003, + 1743, + 2460, + 3144, + 3787, + 4381, + 4919, + 5394, + 5800, + 6131, + 6383, + 6553, + 6639, + 6639, + 6554, + 6385, + 6134, + 5806, + 5404, + 4935, + 4406, + 3824, + 3197, + 2535, + 1846, + 1141, + 429, + -279, + -974, + -1647, + -2288, + -2888, + -3441, + -3939, + -4375, + -4746, + -5047, + -5275, + -5429, + -5508, + -5513, + -5447, + -5313, + -5114, + -4855, + -4544, + -4187, + -3792, + -3366, + -2918, + -2457, + -1992, + -1532, + -1084, + -658, + -261, + 100, + 419, + 689, + 908, + 1070, + 1173, + 1217, + 1199, + 1122, + 987, + 796, + 554, + 265, + -64, + -429, + -822, + -1237, + -1665, + -2099, + -2530, + -2952, + -3357, + -3737, + -4085, + -4397, + -4665, + -4886, + -5055, + -5171, + -5229, + -5231, + -5175, + -5063, + -4895, + -4676, + -4408, + -4096, + -3745, + -3359, + -2945, + -2509, + -2058, + -1598, + -1134, + -674, + -224, + 211, + 626, + 1018, + 1381, + 1713, + 2012, + 2276, + 2505, + 2699, + 2858, + 2986, + 3084, + 3156, + 3205, + 3237, + 3255, + 3265, + 3272, + 3281, + 3298, + 3328, + 3375, + 3444, + 3538, + 3662, + 3816, + 4003, + 4224, + 4479, + 4766, + 5085, + 5433, + 5805, + 6198, + 6606, + 7024, + 7446, + 7864, + 8271, + 8660, + 9023, + 9353, + 9642, + 9884, + 10071, + 10198, + 10259, + 10250, + 10168, + 10008, + 9770, + 9454, + 9060, + 8589, + 8045, + 7431, + 6753, + 6018, + 5232, + 4402, + 3539, + 2651, + 1748, + 840, + -62, + -948, + -1809, + -2633, + -3412, + -4136, + -4797, + -5388, + -5903, + -6335, + -6681, + -6938, + -7104, + -7177, + -7160, + -7054, + -6862, + -6588, + -6239, + -5820, + -5338, + -4802, + -4221, + -3604, + -2960, + -2299, + -1630, + -965, + -311, + 320, + 923, + 1489, + 2010, + 2481, + 2896, + 3251, + 3544, + 3771, + 3933, + 4030, + 4062, + 4033, + 3945, + 3803, + 3612, + 3377, + 3106, + 2804, + 2478, + 2136, + 1785, + 1432, + 1084, + 748, + 429, + 134, + -133, + -368, + -568, + -730, + -852, + -935, + -977, + -981, + -947, + -880, + -781, + -656, + -509, + -345, + -169, + 13, + 196, + 375, + 543, + 695, + 828, + 936, + 1016, + 1066, + 1082, + 1063, + 1009, + 920, + 797, + 641, + 456, + 245, + 12, + -238, + -500, + -769, + -1037, + -1300, + -1551, + -1783, + -1990, + -2167, + -2308, + -2409, + -2464, + -2472, + -2428, + -2331, + -2180, + -1975, + -1718, + -1409, + -1053, + -653, + -213, + 260, + 762, + 1285, + 1821, + 2364, + 2905, + 3436, + 3950, + 4438, + 4893, + 5308, + 5677, + 5993, + 6253, + 6451, + 6584, + 6652, + 6651, + 6584, + 6450, + 6253, + 5995, + 5682, + 5318, + 4910, + 4465, + 3990, + 3495, + 2987, + 2476, + 1970, + 1480, + 1012, + 577, + 181, + -166, + -460, + -694, + -864, + -966, + -996, + -955, + -841, + -655, + -400, + -79, + 302, + 741, + 1229, + 1759, + 2323, + 2912, + 3518, + 4130, + 4738, + 5333, + 5906, + 6446, + 6945, + 7394, + 7786, + 8113, + 8370, + 8552, + 8653, + 8673, + 8608, + 8459, + 8226, + 7911, + 7516, + 7047, + 6507, + 5902, + 5239, + 4526, + 3769, + 2978, + 2160, + 1324, + 479, + -366, + -1206, + -2031, + -2834, + -3609, + -4350, + -5053, + -5712, + -6325, + -6890, + -7405, + -7869, + -8284, + -8650, + -8970, + -9247, + -9483, + -9684, + -9853, + -9995, + -10115, + -10218, + -10309, + -10393, + -10474, + -10558, + -10646, + -10743, + -10851, + -10971, + -11106, + -11254, + -11416, + -11591, + -11776, + -11969, + -12166, + -12364, + -12558, + -12742, + -12913, + -13063, + -13189, + -13284, + -13343, + -13361, + -13333, + -13255, + -13124, + -12937, + -12691, + -12385, + -12020, + -11596, + -11114, + -10576, + -9987, + -9351, + -8673, + -7960, + -7217, + -6453, + -5676, + -4894, + -4115, + -3349, + -2604, + -1889, + -1211, + -580, + -3, + 514, + 966, + 1347, + 1653, + 1881, + 2030, + 2099, + 2089, + 2001, + 1838, + 1605, + 1306, + 947, + 536, + 80, + -411, + -931, + -1470, + -2017, + -2562, + -3098, + -3614, + -4100, + -4550, + -4955, + -5308, + -5603, + -5835, + -6000, + -6094, + -6117, + -6068, + -5947, + -5757, + -5500, + -5180, + -4803, + -4374, + -3901, + -3391, + -2852, + -2293, + -1723, + -1150, + -585, + -35, + 490, + 984, + 1437, + 1844, + 2198, + 2494, + 2729, + 2898, + 3000, + 3034, + 3000, + 2900, + 2736, + 2510, + 2229, + 1896, + 1518, + 1100, + 652, + 179, + -310, + -808, + -1307, + -1799, + -2276, + -2732, + -3160, + -3554, + -3909, + -4221, + -4486, + -4702, + -4867, + -4980, + -5042, + -5054, + -5018, + -4937, + -4815, + -4656, + -4465, + -4247, + -4009, + -3756, + -3495, + -3231, + -2971, + -2720, + -2485, + -2269, + -2077, + -1913, + -1780, + -1681, + -1616, + -1586, + -1591, + -1630, + -1701, + -1802, + -1929, + -2078, + -2245, + -2425, + -2612, + -2802, + -2988, + -3166, + -3329, + -3473, + -3592, + -3683, + -3742, + -3766, + -3753, + -3701, + -3610, + -3480, + -3312, + -3109, + -2873, + -2608, + -2320, + -2014, + -1694, + -1369, + -1046, + -730, + -431, + -155, + 89, + 296, + 458, + 569, + 623, + 616, + 542, + 400, + 187, + -97, + -454, + -882, + -1379, + -1940, + -2561, + -3237, + -3961, + -4726, + -5523, + -6343, + -7177, + -8015, + -8847, + -9663, + -10452, + -11205, + -11913, + -12566, + -13156, + -13676, + -14119, + -14479, + -14752, + -14935, + -15025, + -15023, + -14927, + -14741, + -14467, + -14110, + -13674, + -13166, + -12593, + -11963, + -11286, + -10569, + -9824, + -9060, + -8287, + -7515, + -6754, + -6014, + -5302, + -4629, + -4001, + -3424, + -2906, + -2450, + -2060, + -1739, + -1488, + -1308, + -1198, + -1156, + -1179, + -1263, + -1405, + -1598, + -1837, + -2115, + -2425, + -2760, + -3114, + -3478, + -3847, + -4212, + -4569, + -4911, + -5232, + -5530, + -5799, + -6037, + -6241, + -6412, + -6549, + -6651, + -6721, + -6762, + -6775, + -6764, + -6735, + -6691, + -6637, + -6580, + -6523, + -6472, + -6434, + -6412, + -6411, + -6436, + -6490, + -6576, + -6696, + -6852, + -7044, + -7273, + -7538, + -7835, + -8163, + -8519, + -8897, + -9294, + -9704, + -10120, + -10537, + -10948, + -11347, + -11726, + -12080, + -12402, + -12686, + -12927, + -13119, + -13259, + -13344, + -13371, + -13337, + -13244, + -13090, + -12877, + -12608, + -12285, + -11913, + -11496, + -11041, + -10552, + -10039, + -9506, + -8963, + -8417, + -7875, + -7345, + -6836, + -6353, + -5903, + -5493, + -5127, + -4810, + -4545, + -4335, + -4181, + -4083, + -4040, + -4051, + -4112, + -4219, + -4368, + -4553, + -4766, + -5000, + -5248, + -5501, + -5749, + -5985, + -6199, + -6383, + -6528, + -6625, + -6669, + -6651, + -6566, + -6409, + -6177, + -5865, + -5474, + -5001, + -4449, + -3819, + -3114, + -2339, + -1499, + -601, + 348, + 1340, + 2366, + 3416, + 4481, + 5550, + 6614, + 7661, + 8683, + 9669, + 10610, + 11498, + 12325, + 13084, + 13770, + 14377, + 14902, + 15342, + 15696, + 15963, + 16144, + 16242, + 16259, + 16200, + 16070, + 15874, + 15618, + 15312, + 14960, + 14573, + 14157, + 13721, + 13273, + 12821, + 12372, + 11933, + 11511, + 11112, + 10739, + 10399, + 10093, + 9824, + 9594, + 9403, + 9251, + 9136, + 9057, + 9011, + 8995, + 9004, + 9034, + 9081, + 9139, + 9203, + 9268, + 9330, + 9383, + 9423, + 9447, + 9450, + 9431, + 9386, + 9315, + 9217, + 9093, + 8943, + 8770, + 8575, + 8362, + 8135, + 7899, + 7658, + 7417, + 7183, + 6961, + 6756, + 6575, + 6422, + 6304, + 6223, + 6186, + 6195, + 6253, + 6361, + 6521, + 6733, + 6996, + 7309, + 7667, + 8069, + 8508, + 8981, + 9479, + 9998, + 10529, + 11064, + 11595, + 12115, + 12614, + 13084, + 13518, + 13907, + 14244, + 14523, + 14739, + 14885, + 14958, + 14956, + 14876, + 14718, + 14482, + 14170, + 13785, + 13331, + 12812, + 12235, + 11606, + 10934, + 10227, + 9494, + 8744, + 7987, + 7233, + 6492, + 5774, + 5088, + 4442, + 3846, + 3305, + 2828, + 2420, + 2086, + 1828, + 1649, + 1551, + 1533, + 1594, + 1732, + 1942, + 2221, + 2562, + 2959, + 3405, + 3892, + 4410, + 4952, + 5509, + 6070, + 6628, + 7173, + 7698, + 8193, + 8652, + 9068, + 9436, + 9751, + 10009, + 10208, + 10346, + 10423, + 10438, + 10395, + 10296, + 10144, + 9944, + 9701, + 9421, + 9112, + 8780, + 8432, + 8076, + 7720, + 7371, + 7037, + 6724, + 6438, + 6186, + 5972, + 5802, + 5677, + 5602, + 5578, + 5605, + 5683, + 5812, + 5988, + 6209, + 6472, + 6772, + 7103, + 7461, + 7839, + 8231, + 8631, + 9032, + 9428, + 9813, + 10181, + 10526, + 10845, + 11132, + 11383, + 11598, + 11772, + 11906, + 11999, + 12051, + 12064, + 12040, + 11983, + 11895, + 11780, + 11645, + 11492, + 11329, + 11159, + 10990, + 10826, + 10672, + 10534, + 10415, + 10320, + 10253, + 10215, + 10209, + 10235, + 10294, + 10384, + 10505, + 10653, + 10825, + 11018, + 11225, + 11441, + 11660, + 11876, + 12081, + 12268, + 12430, + 12559, + 12649, + 12693, + 12684, + 12617, + 12487, + 12289, + 12021, + 11680, + 11264, + 10775, + 10212, + 9579, + 8877, + 8113, + 7291, + 6417, + 5500, + 4548, + 3569, + 2572, + 1569, + 569, + -416, + -1379, + -2307, + -3191, + -4021, + -4789, + -5486, + -6105, + -6641, + -7088, + -7442, + -7700, + -7860, + -7924, + -7891, + -7764, + -7546, + -7243, + -6860, + -6404, + -5882, + -5303, + -4676, + -4010, + -3316, + -2602, + -1880, + -1159, + -448, + 241, + 903, + 1529, + 2112, + 2645, + 3123, + 3542, + 3899, + 4192, + 4420, + 4584, + 4683, + 4722, + 4702, + 4629, + 4507, + 4341, + 4138, + 3904, + 3647, + 3372, + 3087, + 2799, + 2514, + 2239, + 1979, + 1740, + 1526, + 1340, + 1187, + 1066, + 981, + 932, + 916, + 935, + 984, + 1061, + 1162, + 1284, + 1420, + 1567, + 1718, + 1868, + 2011, + 2142, + 2256, + 2346, + 2409, + 2440, + 2436, + 2394, + 2312, + 2189, + 2024, + 1817, + 1571, + 1286, + 967, + 616, + 239, + -160, + -576, + -1002, + -1432, + -1860, + -2280, + -2684, + -3067, + -3422, + -3745, + -4029, + -4271, + -4468, + -4615, + -4713, + -4758, + -4752, + -4694, + -4588, + -4436, + -4241, + -4008, + -3742, + -3449, + -3137, + -2810, + -2479, + -2148, + -1828, + -1524, + -1244, + -996, + -785, + -619, + -501, + -437, + -431, + -484, + -598, + -774, + -1011, + -1308, + -1660, + -2065, + -2518, + -3012, + -3540, + -4097, + -4672, + -5258, + -5845, + -6425, + -6988, + -7524, + -8026, + -8484, + -8890, + -9237, + -9518, + -9728, + -9862, + -9916, + -9888, + -9776, + -9580, + -9303, + -8945, + -8511, + -8005, + -7433, + -6802, + -6119, + -5392, + -4632, + -3846, + -3045, + -2238, + -1436, + -649, + 114, + 845, + 1534, + 2174, + 2758, + 3279, + 3733, + 4115, + 4423, + 4655, + 4810, + 4889, + 4893, + 4826, + 4691, + 4492, + 4236, + 3929, + 3577, + 3189, + 2771, + 2333, + 1881, + 1425, + 971, + 528, + 103, + -298, + -669, + -1005, + -1302, + -1555, + -1763, + -1924, + -2038, + -2103, + -2122, + -2096, + -2029, + -1923, + -1782, + -1612, + -1416, + -1201, + -972, + -733, + -492, + -251, + -17, + 204, + 412, + 602, + 770, + 916, + 1037, + 1133, + 1205, + 1253, + 1280, + 1289, + 1281, + 1262, + 1235, + 1205, + 1178, + 1159, + 1152, + 1164, + 1199, + 1263, + 1360, + 1493, + 1667, + 1884, + 2145, + 2452, + 2805, + 3204, + 3645, + 4128, + 4647, + 5199, + 5778, + 6378, + 6992, + 7613, + 8233, + 8844, + 9436, + 10002, + 10533, + 11021, + 11458, + 11835, + 12147, + 12387, + 12550, + 12631, + 12627, + 12535, + 12355, + 12087, + 11731, + 11290, + 10767, + 10168, + 9498, + 8764, + 7972, + 7133, + 6253, + 5344, + 4415, + 3475, + 2535, + 1605, + 694, + -187, + -1031, + -1829, + -2575, + -3261, + -3883, + -4436, + -4917, + -5324, + -5656, + -5914, + -6100, + -6216, + -6267, + -6257, + -6191, + -6077, + -5923, + -5735, + -5522, + -5293, + -5057, + -4822, + -4596, + -4389, + -4206, + -4057, + -3946, + -3881, + -3864, + -3901, + -3993, + -4143, + -4350, + -4615, + -4935, + -5308, + -5730, + -6197, + -6703, + -7242, + -7807, + -8391, + -8986, + -9585, + -10180, + -10762, + -11325, + -11860, + -12362, + -12823, + -13238, + -13603, + -13912, + -14163, + -14355, + -14484, + -14552, + -14558, + -14505, + -14395, + -14231, + -14017, + -13758, + -13460, + -13128, + -12767, + -12386, + -11989, + -11584, + -11176, + -10773, + -10378, + -9998, + -9637, + -9298, + -8986, + -8702, + -8449, + -8226, + -8034, + -7872, + -7738, + -7630, + -7545, + -7479, + -7427, + -7386, + -7350, + -7313, + -7272, + -7220, + -7152, + -7065, + -6953, + -6812, + -6640, + -6433, + -6190, + -5911, + -5594, + -5241, + -4853, + -4433, + -3984, + -3512, + -3019, + -2514, + -2001, + -1488, + -981, + -489, + -19, + 420, + 823, + 1182, + 1490, + 1740, + 1927, + 2046, + 2093, + 2066, + 1962, + 1780, + 1521, + 1186, + 778, + 301, + -240, + -841, + -1494, + -2190, + -2923, + -3681, + -4457, + -5240, + -6019, + -6785, + -7527, + -8235, + -8899, + -9512, + -10064, + -10548, + -10957, + -11286, + -11530, + -11687, + -11754, + -11731, + -11618, + -11416, + -11130, + -10763, + -10320, + -9808, + -9234, + -8605, + -7932, + -7222, + -6486, + -5733, + -4973, + -4217, + -3472, + -2749, + -2057, + -1402, + -793, + -236, + 262, + 700, + 1074, + 1380, + 1617, + 1787, + 1889, + 1926, + 1902, + 1820, + 1684, + 1501, + 1277, + 1019, + 732, + 425, + 105, + -220, + -546, + -864, + -1168, + -1453, + -1713, + -1945, + -2145, + -2310, + -2439, + -2530, + -2584, + -2601, + -2583, + -2533, + -2454, + -2350, + -2226, + -2085, + -1934, + -1778, + -1622, + -1473, + -1334, + -1212, + -1112, + -1037, + -991, + -978, + -999, + -1056, + -1150, + -1282, + -1449, + -1650, + -1883, + -2144, + -2429, + -2733, + -3052, + -3379, + -3709, + -4035, + -4350, + -4649, + -4925, + -5173, + -5386, + -5560, + -5690, + -5772, + -5805, + -5784, + -5710, + -5582, + -5401, + -5168, + -4886, + -4559, + -4191, + -3787, + -3354, + -2898, + -2425, + -1944, + -1463, + -988, + -529, + -93, + 312, + 681, + 1006, + 1281, + 1501, + 1662, + 1761, + 1795, + 1764, + 1667, + 1506, + 1282, + 999, + 661, + 274, + -156, + -623, + -1118, + -1635, + -2163, + -2694, + -3218, + -3728, + -4213, + -4665, + -5077, + -5440, + -5747, + -5994, + -6174, + -6284, + -6321, + -6283, + -6170, + -5983, + -5723, + -5393, + -4998, + -4543, + -4035, + -3481, + -2888, + -2265, + -1621, + -967, + -312, + 334, + 963, + 1564, + 2128, + 2646, + 3111, + 3516, + 3853, + 4119, + 4308, + 4417, + 4445, + 4391, + 4255, + 4039, + 3745, + 3377, + 2940, + 2439, + 1880, + 1272, + 620, + -65, + -777, + -1508, + -2248, + -2989, + -3723, + -4442, + -5140, + -5810, + -6445, + -7042, + -7595, + -8101, + -8558, + -8965, + -9321, + -9626, + -9881, + -10089, + -10253, + -10375, + -10460, + -10512, + -10536, + -10538, + -10521, + -10491, + -10453, + -10412, + -10372, + -10338, + -10311, + -10295, + -10293, + -10305, + -10331, + -10373, + -10428, + -10494, + -10571, + -10653, + -10738, + -10821, + -10897, + -10961, + -11008, + -11033, + -11030, + -10994, + -10919, + -10801, + -10636, + -10420, + -10151, + -9825, + -9442, + -9001, + -8503, + -7949, + -7342, + -6685, + -5982, + -5238, + -4460, + -3654, + -2828, + -1990, + -1147, + -309, + 515, + 1317, + 2089, + 2821, + 3507, + 4137, + 4706, + 5207, + 5635, + 5986, + 6258, + 6447, + 6554, + 6578, + 6521, + 6386, + 6176, + 5897, + 5554, + 5155, + 4706, + 4216, + 3694, + 3150, + 2592, + 2031, + 1475, + 935, + 420, + -62, + -504, + -897, + -1236, + -1515, + -1730, + -1878, + -1957, + -1965, + -1904, + -1774, + -1579, + -1323, + -1010, + -646, + -237, + 207, + 681, + 1176, + 1682, + 2190, + 2693, + 3180, + 3644, + 4076, + 4469, + 4815, + 5109, + 5346, + 5520, + 5630, + 5672, + 5646, + 5552, + 5392, + 5166, + 4879, + 4535, + 4138, + 3695, + 3213, + 2698, + 2158, + 1600, + 1034, + 466, + -95, + -642, + -1168, + -1666, + -2130, + -2555, + -2935, + -3268, + -3550, + -3779, + -3955, + -4078, + -4148, + -4167, + -4139, + -4066, + -3952, + -3804, + -3625, + -3421, + -3199, + -2965, + -2724, + -2482, + -2246, + -2020, + -1811, + -1621, + -1455, + -1316, + -1207, + -1128, + -1081, + -1066, + -1081, + -1125, + -1195, + -1289, + -1401, + -1529, + -1667, + -1809, + -1950, + -2086, + -2209, + -2316, + -2400, + -2456, + -2481, + -2471, + -2421, + -2331, + -2199, + -2022, + -1803, + -1542, + -1241, + -902, + -530, + -129, + 294, + 736, + 1189, + 1647, + 2101, + 2544, + 2969, + 3369, + 3736, + 4063, + 4343, + 4572, + 4743, + 4852, + 4896, + 4873, + 4782, + 4621, + 4393, + 4098, + 3741, + 3325, + 2857, + 2342, + 1787, + 1201, + 592, + -30, + -656, + -1276, + -1880, + -2457, + -2999, + -3494, + -3936, + -4314, + -4623, + -4854, + -5002, + -5064, + -5034, + -4912, + -4697, + -4387, + -3987, + -3497, + -2922, + -2268, + -1541, + -748, + 103, + 1004, + 1944, + 2915, + 3906, + 4906, + 5907, + 6897, + 7867, + 8808, + 9711, + 10569, + 11373, + 12119, + 12802, + 13416, + 13959, + 14430, + 14828, + 15152, + 15405, + 15589, + 15707, + 15764, + 15765, + 15716, + 15622, + 15491, + 15329, + 15144, + 14942, + 14730, + 14516, + 14304, + 14102, + 13915, + 13746, + 13600, + 13479, + 13386, + 13321, + 13286, + 13279, + 13300, + 13345, + 13413, + 13499, + 13599, + 13709, + 13823, + 13937, + 14045, + 14141, + 14220, + 14277, + 14308, + 14308, + 14272, + 14199, + 14085, + 13930, + 13731, + 13489, + 13205, + 12881, + 12518, + 12121, + 11694, + 11240, + 10766, + 10277, + 9780, + 9280, + 8785, + 8302, + 7836, + 7394, + 6982, + 6606, + 6270, + 5979, + 5737, + 5547, + 5409, + 5325, + 5296, + 5319, + 5393, + 5515, + 5682, + 5888, + 6128, + 6396, + 6685, + 6988, + 7299, + 7608, + 7909, + 8193, + 8454, + 8684, + 8878, + 9027, + 9129, + 9177, + 9170, + 9103, + 8977, + 8789, + 8542, + 8237, + 7876, + 7465, + 7007, + 6509, + 5977, + 5419, + 4843, + 4257, + 3671, + 3092, + 2531, + 1996, + 1496, + 1039, + 632, + 284, + 0, + -214, + -356, + -421, + -407, + -313, + -140, + 109, + 434, + 830, + 1291, + 1812, + 2385, + 3002, + 3655, + 4335, + 5032, + 5736, + 6437, + 7124, + 7789, + 8421, + 9011, + 9551, + 10034, + 10451, + 10798, + 11069, + 11260, + 11370, + 11395, + 11337, + 11195, + 10971, + 10670, + 10294, + 9848, + 9339, + 8773, + 8157, + 7499, + 6807, + 6088, + 5352, + 4606, + 3858, + 3116, + 2388, + 1679, + 996, + 344, + -272, + -850, + -1387, + -1880, + -2329, + -2734, + -3096, + -3418, + -3700, + -3947, + -4163, + -4351, + -4516, + -4664, + -4799, + -4927, + -5052, + -5178, + -5312, + -5456, + -5613, + -5788, + -5981, + -6195, + -6430, + -6687, + -6963, + -7258, + -7569, + -7893, + -8226, + -8564, + -8902, + -9236, + -9558, + -9864, + -10148, + -10404, + -10627, + -10812, + -10953, + -11048, + -11091, + -11081, + -11015, + -10893, + -10713, + -10477, + -10187, + -9844, + -9453, + -9018, + -8545, + -8039, + -7507, + -6958, + -6397, + -5835, + -5278, + -4736, + -4217, + -3729, + -3280, + -2878, + -2529, + -2238, + -2013, + -1856, + -1770, + -1759, + -1823, + -1961, + -2173, + -2457, + -2807, + -3220, + -3690, + -4210, + -4773, + -5370, + -5993, + -6632, + -7278, + -7921, + -8551, + -9159, + -9735, + -10271, + -10757, + -11188, + -11555, + -11853, + -12077, + -12224, + -12292, + -12278, + -12183, + -12009, + -11756, + -11430, + -11034, + -10575, + -10058, + -9490, + -8881, + -8238, + -7569, + -6885, + -6195, + -5506, + -4830, + -4173, + -3544, + -2951, + -2401, + -1898, + -1449, + -1056, + -724, + -454, + -246, + -100, + -16, + 10, + -17, + -96, + -220, + -384, + -580, + -802, + -1043, + -1295, + -1551, + -1803, + -2044, + -2266, + -2465, + -2632, + -2764, + -2855, + -2903, + -2904, + -2856, + -2759, + -2613, + -2418, + -2177, + -1891, + -1566, + -1205, + -813, + -396, + 41, + 491, + 949, + 1407, + 1860, + 2301, + 2724, + 3124, + 3496, + 3836, + 4140, + 4405, + 4629, + 4810, + 4950, + 5047, + 5103, + 5120, + 5102, + 5051, + 4972, + 4869, + 4747, + 4612, + 4469, + 4324, + 4182, + 4048, + 3929, + 3827, + 3748, + 3695, + 3670, + 3676, + 3714, + 3785, + 3887, + 4019, + 4179, + 4364, + 4570, + 4791, + 5023, + 5259, + 5493, + 5718, + 5927, + 6113, + 6268, + 6385, + 6458, + 6481, + 6446, + 6351, + 6189, + 5958, + 5656, + 5281, + 4832, + 4311, + 3720, + 3061, + 2340, + 1561, + 731, + -142, + -1052, + -1988, + -2942, + -3904, + -4862, + -5808, + -6729, + -7617, + -8460, + -9250, + -9978, + -10634, + -11212, + -11706, + -12109, + -12418, + -12630, + -12742, + -12755, + -12670, + -12488, + -12212, + -11848, + -11400, + -10875, + -10281, + -9627, + -8920, + -8170, + -7388, + -6582, + -5764, + -4943, + -4128, + -3330, + -2556, + -1814, + -1113, + -458, + 144, + 690, + 1177, + 1602, + 1964, + 2263, + 2500, + 2677, + 2796, + 2863, + 2882, + 2857, + 2796, + 2704, + 2588, + 2454, + 2311, + 2165, + 2021, + 1888, + 1769, + 1671, + 1599, + 1555, + 1543, + 1566, + 1623, + 1717, + 1846, + 2009, + 2204, + 2428, + 2678, + 2948, + 3235, + 3532, + 3836, + 4139, + 4436, + 4722, + 4990, + 5236, + 5455, + 5643, + 5795, + 5909, + 5982, + 6013, + 6001, + 5947, + 5851, + 5715, + 5542, + 5336, + 5100, + 4840, + 4560, + 4268, + 3967, + 3666, + 3370, + 3086, + 2820, + 2578, + 2366, + 2188, + 2049, + 1953, + 1902, + 1899, + 1945, + 2039, + 2182, + 2372, + 2605, + 2878, + 3188, + 3527, + 3892, + 4275, + 4670, + 5068, + 5462, + 5846, + 6210, + 6548, + 6853, + 7117, + 7334, + 7500, + 7610, + 7659, + 7644, + 7566, + 7421, + 7212, + 6939, + 6605, + 6214, + 5771, + 5281, + 4751, + 4188, + 3601, + 2997, + 2386, + 1777, + 1180, + 602, + 55, + -453, + -916, + -1325, + -1673, + -1955, + -2164, + -2298, + -2354, + -2330, + -2226, + -2043, + -1782, + -1447, + -1043, + -575, + -50, + 525, + 1143, + 1794, + 2469, + 3158, + 3852, + 4541, + 5215, + 5864, + 6479, + 7053, + 7576, + 8042, + 8444, + 8778, + 9040, + 9225, + 9333, + 9362, + 9314, + 9189, + 8990, + 8721, + 8387, + 7993, + 7546, + 7052, + 6519, + 5954, + 5366, + 4764, + 4154, + 3545, + 2946, + 2362, + 1802, + 1271, + 774, + 316, + -98, + -467, + -788, + -1061, + -1286, + -1462, + -1592, + -1678, + -1724, + -1733, + -1710, + -1659, + -1586, + -1495, + -1392, + -1282, + -1171, + -1064, + -964, + -876, + -803, + -747, + -712, + -698, + -706, + -736, + -786, + -855, + -940, + -1038, + -1146, + -1258, + -1371, + -1478, + -1575, + -1657, + -1717, + -1751, + -1754, + -1720, + -1647, + -1530, + -1366, + -1154, + -892, + -579, + -217, + 192, + 648, + 1145, + 1681, + 2250, + 2845, + 3460, + 4088, + 4721, + 5351, + 5969, + 6566, + 7135, + 7667, + 8153, + 8586, + 8959, + 9266, + 9501, + 9660, + 9738, + 9734, + 9645, + 9473, + 9216, + 8878, + 8463, + 7973, + 7416, + 6796, + 6122, + 5402, + 4645, + 3859, + 3055, + 2242, + 1430, + 630, + -148, + -897, + -1607, + -2270, + -2877, + -3424, + -3905, + -4314, + -4649, + -4908, + -5090, + -5195, + -5225, + -5183, + -5072, + -4897, + -4664, + -4379, + -4050, + -3685, + -3293, + -2880, + -2458, + -2034, + -1617, + -1215, + -837, + -489, + -179, + 87, + 306, + 472, + 583, + 637, + 633, + 571, + 452, + 280, + 56, + -212, + -523, + -870, + -1245, + -1642, + -2054, + -2472, + -2889, + -3298, + -3690, + -4059, + -4397, + -4698, + -4957, + -5169, + -5329, + -5434, + -5483, + -5473, + -5404, + -5278, + -5094, + -4856, + -4568, + -4232, + -3854, + -3440, + -2994, + -2523, + -2033, + -1532, + -1024, + -518, + -18, + 467, + 936, + 1382, + 1801, + 2190, + 2546, + 2867, + 3152, + 3402, + 3616, + 3796, + 3945, + 4066, + 4161, + 4236, + 4294, + 4341, + 4381, + 4421, + 4464, + 4516, + 4583, + 4667, + 4774, + 4907, + 5068, + 5259, + 5482, + 5737, + 6022, + 6338, + 6680, + 7047, + 7434, + 7836, + 8247, + 8661, + 9073, + 9473, + 9856, + 10213, + 10537, + 10820, + 11055, + 11236, + 11356, + 11409, + 11390, + 11296, + 11123, + 10869, + 10534, + 10116, + 9619, + 9043, + 8394, + 7675, + 6892, + 6052, + 5163, + 4233, + 3271, + 2287, + 1292, + 294, + -694, + -1664, + -2605, + -3507, + -4360, + -5158, + -5890, + -6552, + -7136, + -7639, + -8056, + -8385, + -8626, + -8777, + -8841, + -8821, + -8720, + -8543, + -8296, + -7986, + -7621, + -7209, + -6760, + -6282, + -5785, + -5279, + -4774, + -4279, + -3803, + -3355, + -2942, + -2573, + -2254, + -1989, + -1784, + -1642, + -1565, + -1555, + -1611, + -1732, + -1917, + -2162, + -2463, + -2816, + -3215, + -3653, + -4125, + -4623, + -5140, + -5669, + -6201, + -6731, + -7252, + -7756, + -8238, + -8693, + -9117, + -9505, + -9855, + -10164, + -10432, + -10658, + -10843, + -10988, + -11097, + -11170, + -11214, + -11231, + -11227, + -11206, + -11174, + -11137, + -11099, + -11067, + -11046, + -11040, + -11053, + -11090, + -11153, + -11246, + -11369, + -11524, + -11710, + -11928, + -12175, + -12448, + -12745, + -13062, + -13394, + -13736, + -14083, + -14427, + -14764, + -15087, + -15389, + -15664, + -15907, + -16111, + -16271, + -16384, + -16445, + -16451, + -16400, + -16290, + -16121, + -15894, + -15611, + -15273, + -14884, + -14449, + -13973, + -13462, + -12921, + -12359, + -11783, + -11200, + -10618, + -10047, + -9492, + -8963, + -8466, + -8008, + -7595, + -7232, + -6924, + -6675, + -6486, + -6360, + -6297, + -6295, + -6354, + -6470, + -6639, + -6856, + -7115, + -7410, + -7733, + -8076, + -8430, + -8787, + -9138, + -9474, + -9786, + -10066, + -10304, + -10495, + -10630, + -10704, + -10712, + -10650, + -10515, + -10304, + -10018, + -9657, + -9222, + -8718, + -8147, + -7515, + -6828, + -6094, + -5321, + -4516, + -3690, + -2852, + -2011, + -1178, + -362, + 425, + 1177, + 1884, + 2538, + 3130, + 3656, + 4108, + 4483, + 4778, + 4989, + 5116, + 5159, + 5118, + 4998, + 4800, + 4529, + 4191, + 3792, + 3338, + 2838, + 2298, + 1727, + 1134, + 527, + -85, + -695, + -1296, + -1879, + -2439, + -2968, + -3463, + -3918, + -4331, + -4698, + -5018, + -5291, + -5516, + -5695, + -5829, + -5922, + -5976, + -5996, + -5985, + -5949, + -5892, + -5820, + -5738, + -5650, + -5561, + -5476, + -5399, + -5333, + -5281, + -5245, + -5226, + -5226, + -5244, + -5279, + -5329, + -5393, + -5467, + -5547, + -5629, + -5709, + -5781, + -5840, + -5880, + -5897, + -5884, + -5836, + -5750, + -5619, + -5441, + -5212, + -4930, + -4594, + -4202, + -3755, + -3254, + -2702, + -2101, + -1455, + -770, + -51, + 695, + 1461, + 2240, + 3023, + 3801, + 4566, + 5309, + 6022, + 6696, + 7323, + 7895, + 8406, + 8849, + 9220, + 9514, + 9727, + 9858, + 9905, + 9870, + 9752, + 9555, + 9283, + 8939, + 8531, + 8064, + 7547, + 6986, + 6393, + 5774, + 5141, + 4502, + 3868, + 3248, + 2651, + 2085, + 1560, + 1083, + 659, + 295, + -4, + -236, + -399, + -490, + -511, + -461, + -345, + -165, + 73, + 365, + 704, + 1083, + 1493, + 1927, + 2376, + 2831, + 3283, + 3723, + 4142, + 4533, + 4887, + 5198, + 5460, + 5666, + 5813, + 5897, + 5916, + 5868, + 5754, + 5574, + 5330, + 5026, + 4665, + 4253, + 3795, + 3298, + 2768, + 2213, + 1640, + 1059, + 476, + -100, + -663, + -1204, + -1717, + -2195, + -2634, + -3028, + -3374, + -3669, + -3910, + -4096, + -4228, + -4306, + -4332, + -4309, + -4239, + -4127, + -3978, + -3797, + -3590, + -3362, + -3120, + -2869, + -2617, + -2368, + -2128, + -1903, + -1697, + -1514, + -1357, + -1229, + -1132, + -1066, + -1032, + -1029, + -1055, + -1109, + -1187, + -1285, + -1400, + -1526, + -1659, + -1792, + -1922, + -2041, + -2146, + -2229, + -2288, + -2316, + -2311, + -2270, + -2188, + -2066, + -1902, + -1697, + -1450, + -1164, + -843, + -489, + -106, + 298, + 720, + 1153, + 1589, + 2022, + 2443, + 2846, + 3222, + 3565, + 3867, + 4121, + 4322, + 4465, + 4544, + 4557, + 4500, + 4372, + 4172, + 3902, + 3563, + 3158, + 2691, + 2167, + 1593, + 975, + 321, + -359, + -1057, + -1764, + -2470, + -3164, + -3836, + -4476, + -5076, + -5625, + -6116, + -6540, + -6891, + -7163, + -7352, + -7452, + -7463, + -7382, + -7210, + -6948, + -6599, + -6167, + -5656, + -5073, + -4425, + -3718, + -2963, + -2168, + -1343, + -498, + 357, + 1212, + 2058, + 2884, + 3680, + 4439, + 5153, + 5814, + 6416, + 6954, + 7424, + 7822, + 8147, + 8398, + 8575, + 8680, + 8714, + 8682, + 8587, + 8434, + 8230, + 7980, + 7691, + 7371, + 7025, + 6662, + 6289, + 5911, + 5537, + 5171, + 4820, + 4487, + 4177, + 3893, + 3638, + 3413, + 3219, + 3054, + 2919, + 2811, + 2728, + 2666, + 2621, + 2589, + 2565, + 2544, + 2520, + 2489, + 2444, + 2381, + 2295, + 2182, + 2038, + 1860, + 1646, + 1393, + 1100, + 768, + 398, + -9, + -451, + -924, + -1425, + -1949, + -2490, + -3043, + -3601, + -4158, + -4707, + -5241, + -5755, + -6241, + -6693, + -7105, + -7473, + -7791, + -8057, + -8266, + -8418, + -8510, + -8543, + -8517, + -8435, + -8298, + -8111, + -7878, + -7604, + -7295, + -6958, + -6600, + -6228, + -5850, + -5473, + -5105, + -4753, + -4425, + -4128, + -3866, + -3647, + -3474, + -3350, + -3280, + -3264, + -3303, + -3396, + -3542, + -3739, + -3982, + -4267, + -4588, + -4939, + -5312, + -5699, + -6093, + -6484, + -6863, + -7222, + -7552, + -7843, + -8088, + -8279, + -8409, + -8471, + -8460, + -8372, + -8203, + -7952, + -7617, + -7198, + -6697, + -6117, + -5462, + -4736, + -3946, + -3099, + -2202, + -1264, + -295, + 696, + 1699, + 2704, + 3700, + 4678, + 5628, + 6540, + 7406, + 8217, + 8967, + 9649, + 10258, + 10789, + 11240, + 11609, + 11895, + 12098, + 12220, + 12263, + 12232, + 12131, + 11966, + 11742, + 11467, + 11148, + 10793, + 10409, + 10006, + 9590, + 9170, + 8754, + 8349, + 7960, + 7595, + 7258, + 6954, + 6686, + 6458, + 6270, + 6124, + 6019, + 5955, + 5931, + 5942, + 5986, + 6060, + 6159, + 6278, + 6413, + 6557, + 6707, + 6856, + 7000, + 7135, + 7255, + 7358, + 7441, + 7500, + 7535, + 7543, + 7526, + 7484, + 7418, + 7330, + 7223, + 7101, + 6968, + 6828, + 6687, + 6550, + 6423, + 6311, + 6220, + 6155, + 6122, + 6125, + 6168, + 6256, + 6391, + 6575, + 6810, + 7095, + 7431, + 7815, + 8246, + 8720, + 9233, + 9778, + 10352, + 10946, + 11553, + 12166, + 12777, + 13377, + 13958, + 14511, + 15029, + 15502, + 15925, + 16289, + 16589, + 16819, + 16976, + 17055, + 17054, + 16973, + 16810, + 16568, + 16249, + 15855, + 15392, + 14866, + 14282, + 13648, + 12973, + 12265, + 11533, + 10788, + 10038, + 9295, + 8566, + 7863, + 7194, + 6568, + 5991, + 5473, + 5017, + 4631, + 4316, + 4077, + 3915, + 3830, + 3822, + 3888, + 4025, + 4229, + 4496, + 4817, + 5188, + 5599, + 6043, + 6511, + 6993, + 7482, + 7968, + 8442, + 8895, + 9320, + 9709, + 10055, + 10353, + 10597, + 10783, + 10908, + 10971, + 10970, + 10906, + 10780, + 10595, + 10354, + 10061, + 9721, + 9341, + 8927, + 8485, + 8024, + 7550, + 7072, + 6597, + 6133, + 5686, + 5263, + 4871, + 4516, + 4200, + 3930, + 3707, + 3535, + 3413, + 3343, + 3323, + 3353, + 3429, + 3548, + 3706, + 3899, + 4121, + 4366, + 4629, + 4903, + 5181, + 5459, + 5728, + 5984, + 6221, + 6434, + 6619, + 6772, + 6890, + 6971, + 7013, + 7017, + 6981, + 6908, + 6800, + 6659, + 6488, + 6292, + 6075, + 5842, + 5598, + 5349, + 5101, + 4859, + 4628, + 4414, + 4222, + 4054, + 3916, + 3810, + 3739, + 3703, + 3703, + 3739, + 3809, + 3911, + 4043, + 4200, + 4378, + 4571, + 4773, + 4979, + 5180, + 5370, + 5541, + 5687, + 5800, + 5874, + 5901, + 5876, + 5794, + 5650, + 5440, + 5162, + 4814, + 4396, + 3908, + 3353, + 2731, + 2049, + 1310, + 522, + -309, + -1176, + -2069, + -2979, + -3897, + -4812, + -5714, + -6593, + -7438, + -8239, + -8987, + -9673, + -10288, + -10825, + -11277, + -11639, + -11907, + -12077, + -12147, + -12117, + -11988, + -11761, + -11440, + -11028, + -10532, + -9958, + -9312, + -8605, + -7843, + -7037, + -6197, + -5333, + -4454, + -3571, + -2693, + -1830, + -992, + -185, + 580, + 1301, + 1969, + 2580, + 3131, + 3618, + 4041, + 4400, + 4694, + 4926, + 5098, + 5214, + 5279, + 5298, + 5277, + 5221, + 5138, + 5034, + 4916, + 4791, + 4666, + 4546, + 4438, + 4347, + 4277, + 4233, + 4218, + 4233, + 4281, + 4362, + 4476, + 4621, + 4795, + 4996, + 5220, + 5463, + 5720, + 5986, + 6256, + 6523, + 6783, + 7030, + 7257, + 7459, + 7633, + 7772, + 7874, + 7935, + 7952, + 7925, + 7852, + 7733, + 7570, + 7363, + 7116, + 6831, + 6513, + 6167, + 5798, + 5412, + 5014, + 4612, + 4210, + 3817, + 3438, + 3080, + 2747, + 2446, + 2181, + 1955, + 1772, + 1635, + 1543, + 1499, + 1502, + 1549, + 1639, + 1769, + 1933, + 2128, + 2347, + 2584, + 2832, + 3085, + 3334, + 3573, + 3793, + 3987, + 4148, + 4269, + 4344, + 4368, + 4335, + 4242, + 4086, + 3866, + 3579, + 3228, + 2812, + 2335, + 1800, + 1212, + 576, + -100, + -810, + -1547, + -2300, + -3062, + -3824, + -4574, + -5306, + -6008, + -6673, + -7292, + -7857, + -8361, + -8798, + -9162, + -9451, + -9660, + -9788, + -9833, + -9798, + -9682, + -9491, + -9226, + -8895, + -8502, + -8056, + -7564, + -7034, + -6476, + -5899, + -5314, + -4729, + -4155, + -3601, + -3076, + -2589, + -2148, + -1761, + -1432, + -1169, + -974, + -852, + -805, + -833, + -936, + -1113, + -1362, + -1678, + -2058, + -2496, + -2985, + -3520, + -4092, + -4694, + -5318, + -5956, + -6599, + -7239, + -7869, + -8482, + -9069, + -9626, + -10147, + -10626, + -11060, + -11446, + -11782, + -12067, + -12300, + -12483, + -12616, + -12702, + -12744, + -12747, + -12713, + -12648, + -12558, + -12446, + -12320, + -12183, + -12041, + -11900, + -11764, + -11636, + -11521, + -11422, + -11340, + -11278, + -11235, + -11213, + -11210, + -11224, + -11254, + -11296, + -11347, + -11402, + -11457, + -11507, + -11547, + -11571, + -11575, + -11552, + -11498, + -11408, + -11278, + -11105, + -10885, + -10617, + -10298, + -9930, + -9511, + -9043, + -8530, + -7973, + -7378, + -6750, + -6093, + -5416, + -4725, + -4028, + -3333, + -2649, + -1984, + -1347, + -746, + -191, + 312, + 756, + 1133, + 1438, + 1667, + 1814, + 1878, + 1857, + 1749, + 1557, + 1281, + 924, + 492, + -11, + -580, + -1206, + -1882, + -2600, + -3349, + -4120, + -4905, + -5691, + -6471, + -7233, + -7969, + -8670, + -9327, + -9933, + -10481, + -10966, + -11382, + -11728, + -12000, + -12196, + -12319, + -12367, + -12345, + -12256, + -12104, + -11894, + -11634, + -11331, + -10991, + -10625, + -10239, + -9843, + -9446, + -9056, + -8682, + -8332, + -8013, + -7732, + -7495, + -7307, + -7172, + -7094, + -7074, + -7114, + -7213, + -7371, + -7585, + -7851, + -8166, + -8525, + -8922, + -9349, + -9801, + -10270, + -10748, + -11227, + -11700, + -12159, + -12596, + -13005, + -13378, + -13710, + -13996, + -14232, + -14413, + -14538, + -14604, + -14612, + -14561, + -14453, + -14289, + -14073, + -13809, + -13501, + -13154, + -12773, + -12366, + -11937, + -11494, + -11043, + -10590, + -10141, + -9702, + -9278, + -8875, + -8496, + -8145, + -7824, + -7535, + -7280, + -7059, + -6870, + -6713, + -6585, + -6484, + -6406, + -6347, + -6302, + -6267, + -6236, + -6204, + -6166, + -6116, + -6050, + -5963, + -5851, + -5710, + -5538, + -5331, + -5090, + -4813, + -4501, + -4155, + -3777, + -3370, + -2938, + -2485, + -2018, + -1542, + -1064, + -590, + -129, + 312, + 727, + 1107, + 1445, + 1735, + 1969, + 2142, + 2249, + 2286, + 2249, + 2137, + 1947, + 1680, + 1337, + 921, + 434, + -118, + -731, + -1398, + -2111, + -2862, + -3642, + -4442, + -5251, + -6059, + -6857, + -7633, + -8378, + -9081, + -9734, + -10328, + -10854, + -11307, + -11679, + -11967, + -12166, + -12273, + -12288, + -12210, + -12041, + -11784, + -11441, + -11018, + -10520, + -9955, + -9330, + -8654, + -7935, + -7183, + -6407, + -5618, + -4825, + -4038, + -3267, + -2519, + -1804, + -1128, + -499, + 77, + 596, + 1055, + 1450, + 1780, + 2045, + 2245, + 2382, + 2459, + 2479, + 2447, + 2368, + 2248, + 2094, + 1912, + 1710, + 1494, + 1272, + 1050, + 837, + 637, + 457, + 302, + 176, + 84, + 27, + 10, + 31, + 93, + 193, + 331, + 505, + 711, + 945, + 1204, + 1482, + 1775, + 2076, + 2381, + 2684, + 2978, + 3260, + 3523, + 3764, + 3977, + 4161, + 4311, + 4427, + 4506, + 4549, + 4557, + 4529, + 4470, + 4381, + 4266, + 4131, + 3978, + 3815, + 3647, + 3480, + 3320, + 3174, + 3047, + 2946, + 2876, + 2843, + 2851, + 2904, + 3005, + 3157, + 3360, + 3616, + 3924, + 4283, + 4690, + 5142, + 5635, + 6163, + 6722, + 7304, + 7902, + 8510, + 9118, + 9721, + 10308, + 10873, + 11408, + 11905, + 12357, + 12759, + 13105, + 13391, + 13611, + 13765, + 13850, + 13866, + 13813, + 13693, + 13509, + 13264, + 12964, + 12614, + 12221, + 11793, + 11336, + 10860, + 10374, + 9886, + 9406, + 8942, + 8504, + 8099, + 7735, + 7419, + 7159, + 6958, + 6822, + 6753, + 6755, + 6827, + 6969, + 7181, + 7459, + 7800, + 8199, + 8649, + 9144, + 9677, + 10238, + 10820, + 11412, + 12004, + 12588, + 13153, + 13690, + 14189, + 14642, + 15041, + 15377, + 15645, + 15839, + 15955, + 15988, + 15936, + 15799, + 15576, + 15268, + 14878, + 14408, + 13865, + 13251, + 12575, + 11842, + 11060, + 10238, + 9383, + 8503, + 7608, + 6706, + 5805, + 4914, + 4038, + 3186, + 2364, + 1577, + 830, + 126, + -530, + -1139, + -1699, + -2209, + -2671, + -3086, + -3456, + -3784, + -4075, + -4332, + -4560, + -4764, + -4948, + -5117, + -5278, + -5433, + -5588, + -5746, + -5912, + -6087, + -6274, + -6475, + -6690, + -6920, + -7162, + -7417, + -7681, + -7951, + -8225, + -8497, + -8762, + -9017, + -9255, + -9471, + -9660, + -9816, + -9933, + -10007, + -10033, + -10008, + -9927, + -9789, + -9592, + -9334, + -9016, + -8639, + -8204, + -7716, + -7176, + -6591, + -5966, + -5308, + -4622, + -3918, + -3203, + -2486, + -1775, + -1080, + -408, + 230, + 829, + 1380, + 1875, + 2309, + 2676, + 2971, + 3191, + 3334, + 3398, + 3383, + 3290, + 3122, + 2882, + 2575, + 2205, + 1780, + 1306, + 792, + 247, + -320, + -901, + -1485, + -2063, + -2626, + -3163, + -3667, + -4130, + -4542, + -4899, + -5195, + -5424, + -5583, + -5670, + -5683, + -5622, + -5489, + -5286, + -5017, + -4685, + -4296, + -3858, + -3376, + -2859, + -2315, + -1753, + -1182, + -610, + -48, + 496, + 1015, + 1500, + 1944, + 2340, + 2683, + 2967, + 3190, + 3349, + 3441, + 3468, + 3428, + 3324, + 3159, + 2936, + 2660, + 2337, + 1973, + 1575, + 1149, + 704, + 246, + -213, + -670, + -1116, + -1542, + -1943, + -2312, + -2644, + -2933, + -3176, + -3370, + -3512, + -3601, + -3638, + -3622, + -3556, + -3441, + -3282, + -3082, + -2845, + -2578, + -2285, + -1973, + -1647, + -1314, + -981, + -652, + -334, + -31, + 250, + 507, + 735, + 933, + 1098, + 1229, + 1326, + 1389, + 1419, + 1419, + 1392, + 1341, + 1270, + 1184, + 1088, + 987, + 887, + 793, + 711, + 646, + 603, + 586, + 600, + 647, + 731, + 854, + 1015, + 1217, + 1457, + 1734, + 2046, + 2389, + 2759, + 3151, + 3559, + 3977, + 4398, + 4815, + 5221, + 5607, + 5967, + 6293, + 6578, + 6815, + 6998, + 7123, + 7183, + 7176, + 7099, + 6950, + 6728, + 6435, + 6071, + 5639, + 5144, + 4590, + 3983, + 3331, + 2641, + 1921, + 1182, + 431, + -319, + -1061, + -1783, + -2476, + -3129, + -3735, + -4283, + -4766, + -5176, + -5509, + -5758, + -5920, + -5991, + -5971, + -5859, + -5657, + -5365, + -4989, + -4532, + -4001, + -3402, + -2743, + -2032, + -1278, + -490, + 319, + 1143, + 1970, + 2791, + 3595, + 4373, + 5117, + 5819, + 6470, + 7066, + 7600, + 8068, + 8467, + 8794, + 9050, + 9233, + 9344, + 9387, + 9365, + 9281, + 9140, + 8947, + 8710, + 8435, + 8128, + 7797, + 7449, + 7090, + 6729, + 6371, + 6022, + 5689, + 5375, + 5086, + 4823, + 4591, + 4390, + 4222, + 4086, + 3981, + 3905, + 3856, + 3831, + 3825, + 3835, + 3855, + 3880, + 3906, + 3926, + 3935, + 3929, + 3901, + 3849, + 3768, + 3654, + 3504, + 3318, + 3094, + 2831, + 2529, + 2191, + 1819, + 1415, + 984, + 530, + 57, + -427, + -918, + -1410, + -1895, + -2366, + -2818, + -3243, + -3636, + -3990, + -4302, + -4565, + -4776, + -4932, + -5031, + -5072, + -5054, + -4979, + -4846, + -4661, + -4425, + -4143, + -3820, + -3463, + -3078, + -2671, + -2250, + -1824, + -1398, + -983, + -584, + -209, + 134, + 441, + 705, + 921, + 1085, + 1195, + 1249, + 1245, + 1183, + 1066, + 895, + 675, + 408, + 102, + -237, + -604, + -990, + -1387, + -1786, + -2179, + -2556, + -2908, + -3227, + -3505, + -3733, + -3905, + -4014, + -4054, + -4021, + -3911, + -3723, + -3454, + -3106, + -2678, + -2174, + -1598, + -953, + -247, + 514, + 1323, + 2172, + 3050, + 3949, + 4858, + 5767, + 6666, + 7545, + 8394, + 9204, + 9966, + 10672, + 11314, + 11886, + 12383, + 12799, + 13133, + 13381, + 13543, + 13620, + 13612, + 13521, + 13353, + 13110, + 12800, + 12426, + 11998, + 11521, + 11004, + 10454, + 9881, + 9292, + 8694, + 8097, + 7506, + 6930, + 6373, + 5842, + 5342, + 4875, + 4446, + 4055, + 3705, + 3395, + 3125, + 2892, + 2696, + 2533, + 2399, + 2290, + 2202, + 2129, + 2067, + 2011, + 1956, + 1896, + 1828, + 1746, + 1648, + 1531, + 1391, + 1227, + 1038, + 824, + 586, + 324, + 41, + -259, + -574, + -901, + -1232, + -1565, + -1893, + -2210, + -2512, + -2791, + -3043, + -3262, + -3444, + -3583, + -3675, + -3719, + -3711, + -3649, + -3534, + -3365, + -3144, + -2872, + -2553, + -2192, + -1792, + -1360, + -902, + -426, + 61, + 552, + 1039, + 1511, + 1962, + 2383, + 2766, + 3104, + 3389, + 3616, + 3778, + 3873, + 3895, + 3842, + 3713, + 3509, + 3229, + 2876, + 2453, + 1965, + 1417, + 815, + 167, + -518, + -1233, + -1969, + -2716, + -3463, + -4202, + -4922, + -5613, + -6267, + -6875, + -7429, + -7922, + -8347, + -8700, + -8976, + -9172, + -9286, + -9319, + -9269, + -9140, + -8934, + -8655, + -8309, + -7901, + -7438, + -6928, + -6379, + -5800, + -5200, + -4588, + -3973, + -3364, + -2769, + -2197, + -1656, + -1153, + -693, + -282, + 74, + 375, + 617, + 799, + 920, + 983, + 989, + 941, + 843, + 701, + 519, + 304, + 63, + -195, + -467, + -742, + -1014, + -1275, + -1518, + -1736, + -1923, + -2074, + -2184, + -2249, + -2265, + -2231, + -2145, + -2007, + -1818, + -1579, + -1293, + -963, + -592, + -187, + 248, + 707, + 1185, + 1675, + 2170, + 2663, + 3150, + 3622, + 4076, + 4505, + 4905, + 5273, + 5604, + 5896, + 6149, + 6360, + 6530, + 6660, + 6751, + 6806, + 6829, + 6823, + 6791, + 6740, + 6675, + 6599, + 6520, + 6443, + 6373, + 6314, + 6273, + 6252, + 6256, + 6288, + 6349, + 6442, + 6567, + 6724, + 6911, + 7127, + 7368, + 7631, + 7911, + 8203, + 8500, + 8797, + 9087, + 9363, + 9616, + 9841, + 10029, + 10174, + 10269, + 10308, + 10286, + 10198, + 10040, + 9809, + 9504, + 9123, + 8667, + 8138, + 7538, + 6870, + 6141, + 5355, + 4519, + 3642, + 2732, + 1798, + 850, + -102, + -1048, + -1978, + -2880, + -3746, + -4564, + -5327, + -6025, + -6651, + -7198, + -7660, + -8032, + -8312, + -8496, + -8584, + -8577, + -8475, + -8281, + -8001, + -7638, + -7199, + -6691, + -6123, + -5502, + -4838, + -4141, + -3420, + -2686, + -1948, + -1217, + -501, + 189, + 847, + 1465, + 2035, + 2552, + 3012, + 3410, + 3743, + 4011, + 4212, + 4348, + 4421, + 4432, + 4385, + 4286, + 4138, + 3949, + 3723, + 3469, + 3192, + 2901, + 2601, + 2299, + 2002, + 1717, + 1448, + 1200, + 979, + 786, + 625, + 498, + 405, + 346, + 321, + 327, + 362, + 423, + 507, + 607, + 720, + 840, + 962, + 1080, + 1188, + 1280, + 1353, + 1400, + 1417, + 1401, + 1348, + 1255, + 1122, + 946, + 728, + 469, + 171, + -164, + -533, + -933, + -1357, + -1801, + -2260, + -2726, + -3195, + -3658, + -4110, + -4545, + -4955, + -5336, + -5682, + -5988, + -6250, + -6465, + -6630, + -6743, + -6805, + -6815, + -6775, + -6686, + -6553, + -6378, + -6167, + -5925, + -5659, + -5374, + -5080, + -4782, + -4488, + -4206, + -3944, + -3708, + -3506, + -3343, + -3227, + -3160, + -3149, + -3194, + -3300, + -3466, + -3694, + -3981, + -4325, + -4724, + -5172, + -5664, + -6195, + -6756, + -7341, + -7941, + -8546, + -9149, + -9739, + -10307, + -10845, + -11342, + -11792, + -12186, + -12517, + -12779, + -12966, + -13075, + -13101, + -13043, + -12901, + -12674, + -12364, + -11975, + -11510, + -10974, + -10373, + -9715, + -9007, + -8259, + -7478, + -6675, + -5860, + -5042, + -4231, + -3437, + -2670, + -1938, + -1249, + -611, + -31, + 484, + 933, + 1311, + 1614, + 1842, + 1995, + 2073, + 2080, + 2017, + 1890, + 1703, + 1462, + 1173, + 845, + 485, + 99, + -301, + -712, + -1122, + -1525, + -1914, + -2281, + -2620, + -2925, + -3193, + -3418, + -3597, + -3730, + -3813, + -3848, + -3834, + -3773, + -3667, + -3519, + -3334, + -3115, + -2867, + -2594, + -2304, + -2000, + -1688, + -1374, + -1063, + -759, + -466, + -189, + 68, + 305, + 520, + 710, + 877, + 1021, + 1143, + 1245, + 1330, + 1401, + 1463, + 1521, + 1578, + 1641, + 1714, + 1803, + 1913, + 2049, + 2216, + 2418, + 2658, + 2941, + 3268, + 3640, + 4059, + 4524, + 5034, + 5586, + 6179, + 6806, + 7465, + 8148, + 8850, + 9563, + 10280, + 10992, + 11692, + 12370, + 13019, + 13629, + 14192, + 14701, + 15148, + 15527, + 15831, + 16055, + 16197, + 16252, + 16218, + 16096, + 15885, + 15587, + 15205, + 14743, + 14207, + 13601, + 12933, + 12211, + 11444, + 10641, + 9811, + 8964, + 8110, + 7260, + 6422, + 5608, + 4824, + 4081, + 3386, + 2746, + 2166, + 1652, + 1208, + 835, + 535, + 309, + 156, + 73, + 57, + 104, + 208, + 363, + 563, + 799, + 1064, + 1349, + 1645, + 1944, + 2237, + 2516, + 2772, + 2998, + 3187, + 3334, + 3432, + 3478, + 3468, + 3401, + 3274, + 3087, + 2843, + 2542, + 2189, + 1786, + 1339, + 854, + 337, + -204, + -764, + -1333, + -1905, + -2471, + -3023, + -3554, + -4057, + -4525, + -4952, + -5333, + -5663, + -5939, + -6157, + -6317, + -6416, + -6455, + -6436, + -6360, + -6230, + -6049, + -5823, + -5555, + -5252, + -4920, + -4564, + -4191, + -3807, + -3420, + -3034, + -2657, + -2292, + -1946, + -1623, + -1326, + -1057, + -820, + -615, + -444, + -304, + -196, + -116, + -64, + -34, + -23, + -28, + -42, + -61, + -79, + -93, + -95, + -81, + -48, + 10, + 96, + 213, + 364, + 550, + 771, + 1028, + 1319, + 1641, + 1994, + 2371, + 2769, + 3183, + 3606, + 4033, + 4455, + 4866, + 5258, + 5623, + 5955, + 6244, + 6486, + 6672, + 6797, + 6856, + 6843, + 6757, + 6593, + 6351, + 6031, + 5632, + 5158, + 4611, + 3995, + 3315, + 2579, + 1793, + 966, + 105, + -778, + -1676, + -2577, + -3471, + -4349, + -5199, + -6012, + -6779, + -7491, + -8139, + -8717, + -9219, + -9639, + -9974, + -10220, + -10377, + -10444, + -10421, + -10312, + -10120, + -9849, + -9505, + -9095, + -8626, + -8106, + -7546, + -6952, + -6337, + -5708, + -5077, + -4452, + -3843, + -3260, + -2709, + -2200, + -1739, + -1332, + -983, + -697, + -477, + -324, + -239, + -221, + -270, + -381, + -552, + -779, + -1055, + -1376, + -1735, + -2125, + -2539, + -2969, + -3409, + -3852, + -4290, + -4717, + -5127, + -5514, + -5874, + -6203, + -6498, + -6755, + -6975, + -7156, + -7298, + -7404, + -7474, + -7512, + -7521, + -7505, + -7470, + -7419, + -7358, + -7293, + -7230, + -7173, + -7127, + -7099, + -7093, + -7112, + -7160, + -7239, + -7352, + -7501, + -7684, + -7903, + -8155, + -8438, + -8750, + -9087, + -9444, + -9817, + -10200, + -10587, + -10972, + -11348, + -11710, + -12051, + -12365, + -12646, + -12888, + -13087, + -13239, + -13341, + -13388, + -13381, + -13317, + -13198, + -13024, + -12798, + -12522, + -12200, + -11838, + -11440, + -11013, + -10563, + -10099, + -9627, + -9156, + -8693, + -8246, + -7823, + -7431, + -7078, + -6768, + -6509, + -6304, + -6157, + -6072, + -6050, + -6091, + -6196, + -6362, + -6588, + -6869, + -7201, + -7578, + -7994, + -8441, + -8912, + -9397, + -9889, + -10378, + -10855, + -11312, + -11738, + -12127, + -12470, + -12759, + -12989, + -13154, + -13248, + -13270, + -13216, + -13085, + -12877, + -12594, + -12237, + -11811, + -11320, + -10770, + -10168, + -9521, + -8837, + -8126, + -7396, + -6659, + -5922, + -5196, + -4491, + -3817, + -3181, + -2593, + -2060, + -1590, + -1187, + -856, + -603, + -428, + -334, + -322, + -389, + -535, + -757, + -1049, + -1408, + -1826, + -2299, + -2818, + -3375, + -3963, + -4574, + -5197, + -5827, + -6453, + -7069, + -7666, + -8239, + -8780, + -9284, + -9747, + -10164, + -10534, + -10853, + -11121, + -11337, + -11503, + -11620, + -11691, + -11718, + -11705, + -11656, + -11577, + -11471, + -11344, + -11201, + -11048, + -10889, + -10728, + -10570, + -10419, + -10277, + -10148, + -10032, + -9932, + -9846, + -9776, + -9719, + -9673, + -9635, + -9603, + -9572, + -9538, + -9496, + -9440, + -9366, + -9268, + -9140, + -8978, + -8776, + -8530, + -8236, + -7891, + -7492, + -7037, + -6526, + -5958, + -5334, + -4656, + -3927, + -3151, + -2332, + -1476, + -590, + 320, + 1246, + 2180, + 3113, + 4037, + 4943, + 5821, + 6664, + 7463, + 8211, + 8899, + 9521, + 10072, + 10548, + 10943, + 11256, + 11485, + 11629, + 11690, + 11669, + 11570, + 11397, + 11155, + 10850, + 10490, + 10082, + 9636, + 9159, + 8661, + 8153, + 7643, + 7141, + 6657, + 6198, + 5775, + 5394, + 5061, + 4784, + 4566, + 4413, + 4325, + 4306, + 4355, + 4471, + 4653, + 4897, + 5199, + 5553, + 5954, + 6394, + 6866, + 7362, + 7873, + 8390, + 8904, + 9407, + 9889, + 10342, + 10758, + 11131, + 11453, + 11718, + 11922, + 12061, + 12133, + 12134, + 12066, + 11928, + 11723, + 11452, + 11119, + 10730, + 10289, + 9802, + 9278, + 8721, + 8142, + 7547, + 6944, + 6341, + 5746, + 5167, + 4611, + 4083, + 3591, + 3138, + 2730, + 2369, + 2058, + 1799, + 1593, + 1438, + 1333, + 1277, + 1266, + 1297, + 1364, + 1464, + 1591, + 1738, + 1901, + 2072, + 2247, + 2418, + 2581, + 2730, + 2860, + 2968, + 3049, + 3102, + 3123, + 3113, + 3069, + 2994, + 2888, + 2753, + 2593, + 2410, + 2209, + 1994, + 1771, + 1545, + 1321, + 1105, + 903, + 719, + 560, + 429, + 332, + 270, + 248, + 268, + 330, + 436, + 584, + 773, + 1001, + 1265, + 1561, + 1883, + 2226, + 2585, + 2951, + 3319, + 3682, + 4030, + 4357, + 4656, + 4920, + 5141, + 5314, + 5432, + 5492, + 5489, + 5420, + 5284, + 5080, + 4807, + 4467, + 4063, + 3599, + 3079, + 2509, + 1896, + 1248, + 572, + -121, + -824, + -1526, + -2216, + -2886, + -3524, + -4122, + -4669, + -5157, + -5579, + -5926, + -6192, + -6373, + -6464, + -6463, + -6366, + -6175, + -5890, + -5513, + -5048, + -4499, + -3871, + -3171, + -2407, + -1588, + -721, + 181, + 1113, + 2061, + 3017, + 3969, + 4909, + 5826, + 6712, + 7559, + 8358, + 9104, + 9790, + 10412, + 10966, + 11451, + 11863, + 12204, + 12474, + 12675, + 12809, + 12882, + 12897, + 12859, + 12775, + 12652, + 12495, + 12312, + 12110, + 11896, + 11676, + 11458, + 11248, + 11050, + 10871, + 10713, + 10581, + 10477, + 10403, + 10360, + 10347, + 10364, + 10409, + 10480, + 10573, + 10684, + 10809, + 10944, + 11082, + 11220, + 11351, + 11469, + 11570, + 11649, + 11701, + 11721, + 11707, + 11656, + 11565, + 11432, + 11258, + 11043, + 10788, + 10495, + 10166, + 9806, + 9418, + 9008, + 8581, + 8143, + 7701, + 7260, + 6828, + 6411, + 6016, + 5649, + 5315, + 5020, + 4769, + 4566, + 4413, + 4314, + 4269, + 4280, + 4345, + 4464, + 4634, + 4851, + 5111, + 5410, + 5741, + 6099, + 6475, + 6864, + 7257, + 7648, + 8027, + 8387, + 8722, + 9024, + 9287, + 9505, + 9673, + 9788, + 9846, + 9845, + 9783, + 9662, + 9482, + 9245, + 8955, + 8616, + 8233, + 7813, + 7363, + 6890, + 6402, + 5908, + 5417, + 4938, + 4481, + 4052, + 3663, + 3319, + 3029, + 2800, + 2637, + 2545, + 2527, + 2588, + 2727, + 2945, + 3242, + 3615, + 4061, + 4575, + 5152, + 5785, + 6467, + 7190, + 7944, + 8720, + 9509, + 10299, + 11082, + 11847, + 12585, + 13285, + 13940, + 14540, + 15079, + 15549, + 15946, + 16264, + 16501, + 16654, + 16722, + 16705, + 16604, + 16422, + 16162, + 15828, + 15426, + 14963, + 14443, + 13876, + 13269, + 12629, + 11965, + 11286, + 10599, + 9912, + 9233, + 8568, + 7924, + 7307, + 6721, + 6171, + 5659, + 5188, + 4760, + 4374, + 4030, + 3727, + 3463, + 3234, + 3038, + 2870, + 2726, + 2601, + 2490, + 2388, + 2291, + 2192, + 2087, + 1973, + 1845, + 1701, + 1537, + 1351, + 1143, + 912, + 659, + 384, + 90, + -220, + -544, + -878, + -1216, + -1553, + -1886, + -2207, + -2511, + -2792, + -3045, + -3265, + -3446, + -3584, + -3674, + -3715, + -3702, + -3636, + -3513, + -3336, + -3105, + -2822, + -2489, + -2112, + -1695, + -1243, + -763, + -262, + 251, + 771, + 1289, + 1795, + 2281, + 2740, + 3162, + 3541, + 3869, + 4140, + 4348, + 4488, + 4557, + 4551, + 4469, + 4311, + 4077, + 3769, + 3389, + 2943, + 2435, + 1872, + 1259, + 607, + -78, + -786, + -1508, + -2234, + -2954, + -3659, + -4338, + -4984, + -5586, + -6137, + -6631, + -7059, + -7418, + -7702, + -7909, + -8037, + -8084, + -8051, + -7940, + -7754, + -7496, + -7172, + -6787, + -6348, + -5863, + -5340, + -4787, + -4214, + -3629, + -3042, + -2462, + -1897, + -1356, + -846, + -376, + 48, + 423, + 742, + 1003, + 1202, + 1339, + 1413, + 1425, + 1377, + 1272, + 1113, + 906, + 656, + 369, + 52, + -287, + -643, + -1006, + -1370, + -1727, + -2070, + -2392, + -2687, + -2949, + -3172, + -3354, + -3490, + -3578, + -3617, + -3605, + -3545, + -3436, + -3281, + -3083, + -2846, + -2575, + -2274, + -1949, + -1607, + -1253, + -894, + -536, + -186, + 150, + 468, + 761, + 1025, + 1257, + 1451, + 1607, + 1723, + 1797, + 1829, + 1821, + 1773, + 1689, + 1572, + 1424, + 1252, + 1058, + 849, + 630, + 407, + 185, + -29, + -233, + -419, + -585, + -725, + -837, + -918, + -967, + -982, + -963, + -912, + -830, + -721, + -586, + -432, + -262, + -83, + 99, + 277, + 446, + 597, + 723, + 816, + 871, + 881, + 838, + 739, + 577, + 350, + 54, + -312, + -750, + -1260, + -1841, + -2489, + -3201, + -3972, + -4797, + -5669, + -6580, + -7522, + -8485, + -9460, + -10437, + -11406, + -12355, + -13275, + -14156, + -14987, + -15759, + -16464, + -17093, + -17640, + -18098, + -18463, + -18731, + -18900, + -18967, + -18934, + -18802, + -18573, + -18250, + -17840, + -17348, + -16780, + -16146, + -15452, + -14709, + -13927, + -13114, + -12281, + -11438, + -10595, + -9761, + -8946, + -8157, + -7403, + -6691, + -6027, + -5416, + -4861, + -4366, + -3933, + -3561, + -3252, + -3003, + -2812, + -2676, + -2590, + -2549, + -2549, + -2582, + -2642, + -2722, + -2816, + -2917, + -3018, + -3112, + -3193, + -3257, + -3297, + -3310, + -3292, + -3241, + -3155, + -3032, + -2873, + -2679, + -2451, + -2192, + -1905, + -1595, + -1265, + -920, + -567, + -210, + 144, + 491, + 824, + 1137, + 1426, + 1686, + 1913, + 2104, + 2255, + 2364, + 2431, + 2455, + 2437, + 2377, + 2278, + 2144, + 1977, + 1782, + 1565, + 1331, + 1085, + 833, + 583, + 341, + 113, + -95, + -277, + -429, + -545, + -621, + -653, + -640, + -579, + -469, + -312, + -108, + 140, + 431, + 759, + 1121, + 1510, + 1920, + 2345, + 2777, + 3210, + 3634, + 4044, + 4430, + 4786, + 5104, + 5379, + 5604, + 5774, + 5884, + 5932, + 5915, + 5832, + 5682, + 5467, + 5187, + 4847, + 4451, + 4003, + 3510, + 2978, + 2416, + 1831, + 1232, + 629, + 30, + -554, + -1116, + -1647, + -2137, + -2579, + -2965, + -3289, + -3546, + -3730, + -3840, + -3871, + -3824, + -3698, + -3495, + -3217, + -2868, + -2453, + -1979, + -1450, + -877, + -266, + 372, + 1030, + 1697, + 2363, + 3019, + 3654, + 4260, + 4827, + 5347, + 5813, + 6217, + 6555, + 6821, + 7012, + 7124, + 7158, + 7111, + 6986, + 6785, + 6510, + 6165, + 5756, + 5288, + 4769, + 4204, + 3603, + 2972, + 2321, + 1656, + 987, + 321, + -333, + -969, + -1582, + -2164, + -2710, + -3217, + -3680, + -4098, + -4468, + -4791, + -5066, + -5294, + -5478, + -5621, + -5725, + -5794, + -5834, + -5849, + -5844, + -5825, + -5796, + -5764, + -5733, + -5707, + -5691, + -5689, + -5704, + -5738, + -5793, + -5870, + -5969, + -6090, + -6231, + -6390, + -6564, + -6750, + -6944, + -7141, + -7336, + -7524, + -7700, + -7858, + -7993, + -8099, + -8171, + -8206, + -8200, + -8148, + -8048, + -7899, + -7700, + -7450, + -7151, + -6804, + -6413, + -5981, + -5512, + -5013, + -4489, + -3947, + -3395, + -2841, + -2294, + -1760, + -1250, + -772, + -333, + 57, + 393, + 667, + 873, + 1006, + 1062, + 1038, + 931, + 741, + 467, + 112, + -321, + -831, + -1411, + -2055, + -2757, + -3510, + -4303, + -5130, + -5979, + -6841, + -7707, + -8565, + -9407, + -10223, + -11003, + -11740, + -12424, + -13050, + -13610, + -14101, + -14517, + -14857, + -15119, + -15302, + -15406, + -15435, + -15392, + -15279, + -15103, + -14870, + -14587, + -14261, + -13900, + -13513, + -13108, + -12695, + -12281, + -11876, + -11489, + -11125, + -10793, + -10499, + -10249, + -10046, + -9895, + -9799, + -9758, + -9773, + -9843, + -9967, + -10142, + -10364, + -10628, + -10929, + -11261, + -11617, + -11989, + -12371, + -12754, + -13131, + -13494, + -13836, + -14149, + -14427, + -14663, + -14853, + -14992, + -15075, + -15101, + -15067, + -14972, + -14817, + -14602, + -14328, + -14000, + -13621, + -13194, + -12725, + -12219, + -11682, + -11121, + -10543, + -9952, + -9357, + -8763, + -8176, + -7602, + -7047, + -6514, + -6007, + -5530, + -5085, + -4673, + -4295, + -3951, + -3640, + -3360, + -3108, + -2882, + -2678, + -2490, + -2316, + -2149, + -1985, + -1818, + -1643, + -1456, + -1251, + -1025, + -774, + -494, + -183, + 159, + 535, + 945, + 1386, + 1858, + 2357, + 2879, + 3421, + 3978, + 4542, + 5108, + 5670, + 6218, + 6747, + 7248, + 7715, + 8138, + 8512, + 8829, + 9084, + 9271, + 9385, + 9424, + 9383, + 9262, + 9059, + 8776, + 8414, + 7977, + 7467, + 6891, + 6254, + 5564, + 4828, + 4055, + 3255, + 2437, + 1612, + 789, + -19, + -805, + -1558, + -2268, + -2926, + -3525, + -4056, + -4513, + -4891, + -5186, + -5395, + -5515, + -5546, + -5489, + -5346, + -5121, + -4816, + -4439, + -3995, + -3491, + -2936, + -2339, + -1708, + -1053, + -384, + 289, + 957, + 1610, + 2240, + 2838, + 3397, + 3908, + 4367, + 4767, + 5106, + 5380, + 5587, + 5726, + 5798, + 5804, + 5747, + 5629, + 5456, + 5232, + 4964, + 4657, + 4318, + 3955, + 3574, + 3183, + 2789, + 2400, + 2021, + 1659, + 1320, + 1008, + 728, + 483, + 275, + 107, + -21, + -109, + -159, + -172, + -151, + -99, + -19, + 81, + 201, + 332, + 470, + 610, + 745, + 871, + 983, + 1075, + 1144, + 1186, + 1198, + 1178, + 1125, + 1038, + 917, + 764, + 580, + 369, + 133, + -122, + -394, + -675, + -960, + -1244, + -1519, + -1780, + -2021, + -2234, + -2414, + -2556, + -2655, + -2707, + -2708, + -2655, + -2546, + -2382, + -2160, + -1884, + -1553, + -1172, + -745, + -275, + 230, + 767, + 1328, + 1905, + 2491, + 3077, + 3657, + 4222, + 4764, + 5275, + 5749, + 6180, + 6561, + 6887, + 7155, + 7361, + 7504, + 7581, + 7594, + 7544, + 7432, + 7262, + 7040, + 6769, + 6457, + 6110, + 5736, + 5344, + 4941, + 4538, + 4142, + 3763, + 3410, + 3091, + 2814, + 2587, + 2415, + 2304, + 2260, + 2286, + 2384, + 2555, + 2801, + 3120, + 3509, + 3965, + 4484, + 5059, + 5685, + 6354, + 7058, + 7787, + 8533, + 9285, + 10035, + 10772, + 11486, + 12167, + 12808, + 13398, + 13931, + 14399, + 14797, + 15118, + 15360, + 15518, + 15592, + 15580, + 15484, + 15305, + 15045, + 14710, + 14303, + 13830, + 13298, + 12713, + 12084, + 11419, + 10726, + 10013, + 9289, + 8562, + 7840, + 7131, + 6441, + 5777, + 5145, + 4550, + 3995, + 3483, + 3018, + 2600, + 2229, + 1905, + 1627, + 1393, + 1198, + 1041, + 917, + 821, + 748, + 695, + 654, + 623, + 595, + 566, + 532, + 490, + 435, + 366, + 280, + 177, + 56, + -81, + -235, + -404, + -584, + -771, + -963, + -1154, + -1341, + -1516, + -1676, + -1814, + -1925, + -2003, + -2045, + -2044, + -1997, + -1900, + -1750, + -1546, + -1285, + -968, + -596, + -169, + 308, + 835, + 1405, + 2014, + 2655, + 3322, + 4007, + 4702, + 5399, + 6089, + 6763, + 7414, + 8032, + 8609, + 9137, + 9609, + 10018, + 10359, + 10627, + 10817, + 10928, + 10957, + 10904, + 10770, + 10556, + 10266, + 9903, + 9473, + 8983, + 8438, + 7847, + 7219, + 6562, + 5886, + 5200, + 4515, + 3839, + 3183, + 2555, + 1963, + 1417, + 922, + 485, + 111, + -194, + -431, + -595, + -687, + -707, + -657, + -539, + -358, + -119, + 172, + 509, + 884, + 1289, + 1715, + 2154, + 2597, + 3034, + 3458, + 3859, + 4229, + 4561, + 4849, + 5086, + 5268, + 5390, + 5449, + 5444, + 5373, + 5237, + 5037, + 4777, + 4458, + 4086, + 3666, + 3203, + 2705, + 2179, + 1632, + 1072, + 507, + -55, + -606, + -1140, + -1648, + -2125, + -2564, + -2960, + -3310, + -3608, + -3854, + -4044, + -4179, + -4259, + -4285, + -4259, + -4184, + -4064, + -3903, + -3706, + -3479, + -3227, + -2957, + -2674, + -2385, + -2096, + -1812, + -1540, + -1283, + -1046, + -834, + -649, + -493, + -368, + -275, + -213, + -181, + -178, + -200, + -245, + -309, + -387, + -475, + -567, + -658, + -742, + -815, + -870, + -902, + -908, + -882, + -822, + -723, + -585, + -406, + -185, + 76, + 378, + 717, + 1091, + 1495, + 1925, + 2375, + 2839, + 3310, + 3781, + 4245, + 4694, + 5120, + 5517, + 5876, + 6191, + 6455, + 6663, + 6810, + 6891, + 6903, + 6844, + 6713, + 6510, + 6236, + 5893, + 5485, + 5016, + 4491, + 3918, + 3303, + 2655, + 1983, + 1295, + 602, + -85, + -759, + -1408, + -2023, + -2594, + -3113, + -3571, + -3960, + -4275, + -4511, + -4661, + -4725, + -4699, + -4583, + -4377, + -4084, + -3706, + -3248, + -2715, + -2114, + -1452, + -737, + 22, + 815, + 1634, + 2467, + 3305, + 4138, + 4955, + 5747, + 6505, + 7221, + 7887, + 8497, + 9044, + 9523, + 9932, + 10267, + 10527, + 10711, + 10820, + 10857, + 10823, + 10723, + 10561, + 10342, + 10072, + 9759, + 9408, + 9026, + 8622, + 8201, + 7772, + 7340, + 6912, + 6494, + 6091, + 5707, + 5347, + 5012, + 4706, + 4428, + 4180, + 3961, + 3769, + 3602, + 3458, + 3332, + 3220, + 3118, + 3021, + 2923, + 2820, + 2706, + 2576, + 2425, + 2248, + 2041, + 1801, + 1525, + 1210, + 856, + 461, + 27, + -446, + -956, + -1500, + -2075, + -2677, + -3299, + -3937, + -4585, + -5237, + -5885, + -6523, + -7145, + -7743, + -8311, + -8844, + -9335, + -9780, + -10175, + -10516, + -10800, + -11025, + -11192, + -11300, + -11350, + -11344, + -11286, + -11179, + -11028, + -10839, + -10617, + -10371, + -10106, + -9830, + -9551, + -9276, + -9013, + -8770, + -8553, + -8368, + -8222, + -8119, + -8064, + -8060, + -8109, + -8212, + -8370, + -8582, + -8845, + -9156, + -9512, + -9907, + -10334, + -10788, + -11261, + -11744, + -12229, + -12707, + -13169, + -13606, + -14009, + -14370, + -14681, + -14933, + -15121, + -15238, + -15280, + -15241, + -15120, + -14915, + -14625, + -14250, + -13794, + -13259, + -12649, + -11970, + -11228, + -10431, + -9586, + -8703, + -7792, + -6861, + -5921, + -4982, + -4054, + -3148, + -2272, + -1436, + -649, + 82, + 751, + 1351, + 1877, + 2327, + 2696, + 2984, + 3191, + 3317, + 3365, + 3338, + 3239, + 3073, + 2848, + 2568, + 2242, + 1876, + 1479, + 1059, + 624, + 182, + -259, + -692, + -1110, + -1507, + -1877, + -2215, + -2517, + -2779, + -3000, + -3177, + -3312, + -3403, + -3452, + -3462, + -3435, + -3374, + -3284, + -3169, + -3034, + -2885, + -2725, + -2561, + -2397, + -2239, + -2090, + -1955, + -1837, + -1739, + -1664, + -1611, + -1584, + -1580, + -1599, + -1640, + -1699, + -1775, + -1862, + -1957, + -2055, + -2150, + -2238, + -2312, + -2366, + -2396, + -2397, + -2362, + -2287, + -2169, + -2004, + -1789, + -1523, + -1205, + -834, + -413, + 57, + 575, + 1135, + 1733, + 2363, + 3019, + 3695, + 4382, + 5072, + 5759, + 6432, + 7083, + 7705, + 8289, + 8827, + 9312, + 9737, + 10097, + 10386, + 10601, + 10738, + 10796, + 10774, + 10672, + 10492, + 10236, + 9909, + 9516, + 9062, + 8555, + 8002, + 7411, + 6792, + 6154, + 5506, + 4859, + 4222, + 3606, + 3018, + 2468, + 1965, + 1515, + 1126, + 803, + 550, + 371, + 268, + 243, + 295, + 423, + 624, + 895, + 1231, + 1627, + 2075, + 2569, + 3100, + 3660, + 4240, + 4832, + 5426, + 6012, + 6583, + 7130, + 7645, + 8121, + 8551, + 8930, + 9253, + 9516, + 9717, + 9855, + 9928, + 9938, + 9887, + 9777, + 9611, + 9396, + 9135, + 8836, + 8504, + 8147, + 7773, + 7389, + 7003, + 6621, + 6253, + 5903, + 5580, + 5289, + 5034, + 4821, + 4653, + 4533, + 4462, + 4441, + 4471, + 4549, + 4674, + 4843, + 5053, + 5298, + 5575, + 5877, + 6199, + 6534, + 6877, + 7220, + 7558, + 7885, + 8194, + 8481, + 8741, + 8969, + 9163, + 9319, + 9436, + 9512, + 9548, + 9544, + 9502, + 9424, + 9312, + 9171, + 9005, + 8818, + 8616, + 8404, + 8188, + 7972, + 7763, + 7567, + 7387, + 7228, + 7095, + 6991, + 6918, + 6879, + 6874, + 6903, + 6966, + 7060, + 7185, + 7335, + 7507, + 7696, + 7897, + 8102, + 8306, + 8501, + 8681, + 8838, + 8964, + 9053, + 9098, + 9093, + 9031, + 8909, + 8722, + 8467, + 8140, + 7743, + 7273, + 6733, + 6124, + 5450, + 4715, + 3924, + 3085, + 2205, + 1291, + 354, + -598, + -1555, + -2506, + -3442, + -4351, + -5224, + -6051, + -6821, + -7527, + -8161, + -8715, + -9183, + -9560, + -9843, + -10028, + -10114, + -10101, + -9991, + -9785, + -9487, + -9102, + -8636, + -8096, + -7489, + -6823, + -6109, + -5356, + -4573, + -3770, + -2958, + -2146, + -1345, + -563, + 190, + 908, + 1582, + 2208, + 2778, + 3289, + 3739, + 4124, + 4443, + 4698, + 4889, + 5018, + 5089, + 5105, + 5072, + 4994, + 4879, + 4731, + 4559, + 4369, + 4168, + 3962, + 3758, + 3562, + 3380, + 3218, + 3078, + 2966, + 2884, + 2833, + 2815, + 2831, + 2879, + 2958, + 3066, + 3199, + 3354, + 3527, + 3712, + 3905, + 4099, + 4290, + 4471, + 4636, + 4781, + 4901, + 4989, + 5043, + 5058, + 5033, + 4964, + 4850, + 4692, + 4489, + 4243, + 3955, + 3629, + 3268, + 2878, + 2462, + 2026, + 1576, + 1119, + 661, + 207, + -233, + -656, + -1056, + -1426, + -1761, + -2058, + -2312, + -2521, + -2683, + -2797, + -2862, + -2880, + -2852, + -2782, + -2672, + -2528, + -2354, + -2157, + -1943, + -1719, + -1492, + -1271, + -1061, + -872, + -710, + -582, + -495, + -454, + -466, + -533, + -661, + -851, + -1104, + -1421, + -1802, + -2244, + -2744, + -3299, + -3903, + -4550, + -5234, + -5947, + -6680, + -7426, + -8174, + -8915, + -9641, + -10342, + -11009, + -11632, + -12205, + -12719, + -13168, + -13546, + -13848, + -14071, + -14211, + -14268, + -14242, + -14133, + -13944, + -13678, + -13340, + -12936, + -12472, + -11955, + -11394, + -10798, + -10176, + -9538, + -8893, + -8251, + -7622, + -7015, + -6440, + -5905, + -5417, + -4983, + -4610, + -4302, + -4063, + -3896, + -3803, + -3784, + -3838, + -3964, + -4159, + -4418, + -4738, + -5112, + -5534, + -5996, + -6492, + -7014, + -7553, + -8101, + -8650, + -9192, + -9720, + -10226, + -10703, + -11147, + -11551, + -11912, + -12225, + -12488, + -12700, + -12860, + -12967, + -13023, + -13031, + -12991, + -12909, + -12788, + -12632, + -12447, + -12237, + -12008, + -11765, + -11514, + -11260, + -11008, + -10762, + -10526, + -10304, + -10098, + -9910, + -9742, + -9594, + -9465, + -9355, + -9261, + -9182, + -9114, + -9053, + -8994, + -8934, + -8866, + -8786, + -8689, + -8569, + -8421, + -8240, + -8022, + -7762, + -7459, + -7108, + -6708, + -6259, + -5760, + -5212, + -4616, + -3977, + -3297, + -2580, + -1834, + -1063, + -274, + 523, + 1323, + 2116, + 2895, + 3649, + 4372, + 5053, + 5685, + 6261, + 6774, + 7216, + 7584, + 7871, + 8075, + 8193, + 8225, + 8169, + 8028, + 7802, + 7497, + 7116, + 6665, + 6150, + 5579, + 4961, + 4303, + 3616, + 2909, + 2192, + 1474, + 767, + 79, + -580, + -1203, + -1780, + -2306, + -2773, + -3176, + -3512, + -3777, + -3969, + -4089, + -4135, + -4112, + -4020, + -3865, + -3651, + -3384, + -3072, + -2721, + -2339, + -1936, + -1519, + -1097, + -680, + -276, + 107, + 461, + 780, + 1056, + 1283, + 1458, + 1576, + 1635, + 1632, + 1568, + 1442, + 1257, + 1015, + 720, + 376, + -10, + -435, + -890, + -1368, + -1862, + -2365, + -2867, + -3362, + -3841, + -4299, + -4726, + -5118, + -5469, + -5774, + -6029, + -6230, + -6376, + -6466, + -6498, + -6474, + -6396, + -6265, + -6085, + -5861, + -5596, + -5297, + -4969, + -4618, + -4250, + -3872, + -3490, + -3111, + -2740, + -2383, + -2046, + -1731, + -1445, + -1189, + -965, + -777, + -623, + -504, + -420, + -368, + -345, + -350, + -377, + -422, + -482, + -550, + -621, + -691, + -754, + -804, + -838, + -849, + -836, + -794, + -720, + -613, + -471, + -295, + -85, + 156, + 428, + 727, + 1048, + 1386, + 1736, + 2091, + 2445, + 2791, + 3120, + 3427, + 3703, + 3940, + 4132, + 4272, + 4354, + 4372, + 4322, + 4200, + 4003, + 3729, + 3378, + 2949, + 2445, + 1869, + 1223, + 514, + -252, + -1070, + -1931, + -2827, + -3747, + -4683, + -5625, + -6561, + -7482, + -8377, + -9236, + -10050, + -10809, + -11506, + -12132, + -12681, + -13148, + -13527, + -13816, + -14012, + -14115, + -14125, + -14044, + -13875, + -13622, + -13290, + -12886, + -12416, + -11889, + -11313, + -10698, + -10053, + -9387, + -8710, + -8033, + -7365, + -6714, + -6089, + -5499, + -4951, + -4450, + -4002, + -3612, + -3283, + -3017, + -2814, + -2676, + -2600, + -2585, + -2628, + -2724, + -2868, + -3056, + -3280, + -3535, + -3813, + -4107, + -4409, + -4714, + -5013, + -5301, + -5570, + -5816, + -6033, + -6217, + -6366, + -6475, + -6543, + -6570, + -6556, + -6501, + -6407, + -6278, + -6115, + -5924, + -5709, + -5474, + -5225, + -4968, + -4708, + -4450, + -4201, + -3965, + -3747, + -3552, + -3383, + -3243, + -3136, + -3062, + -3022, + -3016, + -3044, + -3104, + -3193, + -3308, + -3445, + -3599, + -3765, + -3938, + -4112, + -4280, + -4436, + -4575, + -4689, + -4773, + -4822, + -4830, + -4794, + -4709, + -4573, + -4384, + -4141, + -3844, + -3493, + -3090, + -2639, + -2142, + -1605, + -1032, + -430, + 193, + 833, + 1480, + 2127, + 2766, + 3389, + 3988, + 4555, + 5083, + 5567, + 5998, + 6374, + 6688, + 6939, + 7123, + 7240, + 7289, + 7272, + 7190, + 7046, + 6846, + 6593, + 6295, + 5958, + 5590, + 5199, + 4793, + 4382, + 3974, + 3579, + 3205, + 2861, + 2554, + 2294, + 2085, + 1934, + 1846, + 1826, + 1874, + 1995, + 2187, + 2450, + 2782, + 3180, + 3639, + 4155, + 4720, + 5329, + 5971, + 6640, + 7326, + 8019, + 8709, + 9387, + 10043, + 10667, + 11250, + 11785, + 12262, + 12674, + 13016, + 13283, + 13469, + 13573, + 13591, + 13523, + 13371, + 13134, + 12817, + 12422, + 11955, + 11420, + 10826, + 10177, + 9483, + 8752, + 7991, + 7209, + 6415, + 5617, + 4823, + 4041, + 3278, + 2541, + 1836, + 1167, + 539, + -43, + -580, + -1068, + -1507, + -1898, + -2241, + -2539, + -2794, + -3009, + -3189, + -3338, + -3460, + -3560, + -3644, + -3717, + -3782, + -3846, + -3911, + -3983, + -4064, + -4156, + -4262, + -4383, + -4519, + -4670, + -4836, + -5013, + -5199, + -5392, + -5587, + -5780, + -5966, + -6140, + -6296, + -6429, + -6534, + -6604, + -6636, + -6623, + -6563, + -6450, + -6283, + -6058, + -5775, + -5433, + -5032, + -4574, + -4062, + -3497, + -2886, + -2232, + -1543, + -823, + -82, + 672, + 1434, + 2193, + 2940, + 3667, + 4366, + 5027, + 5643, + 6207, + 6711, + 7149, + 7518, + 7811, + 8028, + 8164, + 8220, + 8197, + 8095, + 7917, + 7667, + 7351, + 6973, + 6542, + 6064, + 5548, + 5002, + 4437, + 3860, + 3283, + 2715, + 2165, + 1642, + 1155, + 711, + 318, + -17, + -291, + -498, + -635, + -701, + -694, + -615, + -465, + -248, + 31, + 371, + 764, + 1202, + 1680, + 2188, + 2719, + 3263, + 3811, + 4355, + 4885, + 5394, + 5871, + 6311, + 6707, + 7051, + 7338, + 7566, + 7729, + 7826, + 7856, + 7819, + 7716, + 7549, + 7321, + 7037, + 6701, + 6320, + 5899, + 5447, + 4969, + 4475, + 3972, + 3467, + 2969, + 2485, + 2022, + 1587, + 1186, + 824, + 506, + 235, + 13, + -155, + -272, + -336, + -349, + -312, + -228, + -102, + 63, + 262, + 490, + 742, + 1010, + 1289, + 1572, + 1855, + 2129, + 2392, + 2636, + 2859, + 3055, + 3222, + 3357, + 3459, + 3527, + 3562, + 3563, + 3533, + 3474, + 3389, + 3283, + 3159, + 3023, + 2879, + 2733, + 2590, + 2457, + 2338, + 2238, + 2163, + 2117, + 2104, + 2126, + 2186, + 2285, + 2425, + 2605, + 2825, + 3081, + 3371, + 3691, + 4038, + 4405, + 4786, + 5175, + 5566, + 5950, + 6321, + 6671, + 6991, + 7276, + 7519, + 7712, + 7850, + 7928, + 7941, + 7887, + 7763, + 7568, + 7301, + 6964, + 6559, + 6088, + 5557, + 4971, + 4336, + 3660, + 2950, + 2216, + 1467, + 712, + -38, + -774, + -1484, + -2161, + -2793, + -3372, + -3889, + -4336, + -4708, + -4998, + -5202, + -5316, + -5338, + -5266, + -5102, + -4847, + -4503, + -4075, + -3568, + -2987, + -2340, + -1635, + -881, + -87, + 737, + 1582, + 2438, + 3294, + 4140, + 4968, + 5767, + 6529, + 7247, + 7913, + 8522, + 9069, + 9549, + 9960, + 10301, + 10570, + 10768, + 10896, + 10958, + 10957, + 10897, + 10783, + 10622, + 10419, + 10182, + 9917, + 9631, + 9332, + 9026, + 8721, + 8423, + 8137, + 7869, + 7623, + 7404, + 7214, + 7055, + 6928, + 6835, + 6774, + 6744, + 6743, + 6768, + 6816, + 6882, + 6962, + 7051, + 7143, + 7233, + 7316, + 7387, + 7440, + 7471, + 7475, + 7449, + 7389, + 7294, + 7160, + 6989, + 6779, + 6532, + 6248, + 5932, + 5585, + 5212, + 4819, + 4409, + 3989, + 3565, + 3144, + 2731, + 2335, + 1960, + 1615, + 1303, + 1032, + 806, + 629, + 505, + 436, + 425, + 471, + 576, + 737, + 954, + 1222, + 1537, + 1896, + 2293, + 2721, + 3173, + 3643, + 4123, + 4605, + 5081, + 5545, + 5987, + 6401, + 6781, + 7120, + 7414, + 7656, + 7845, + 7977, + 8051, + 8067, + 8024, + 7925, + 7773, + 7571, + 7324, + 7038, + 6721, + 6377, + 6017, + 5648, + 5280, + 4919, + 4577, + 4262, + 3981, + 3744, + 3558, + 3429, + 3364, + 3369, + 3446, + 3599, + 3831, + 4141, + 4529, + 4993, + 5531, + 6138, + 6809, + 7537, + 8316, + 9138, + 9993, + 10872, + 11766, + 12665, + 13558, + 14434, + 15285, + 16101, + 16871, + 17589, + 18245, + 18833, + 19346, + 19781, + 20132, + 20397, + 20575, + 20665, + 20667, + 20584, + 20419, + 20175, + 19857, + 19471, + 19024, + 18523, + 17974, + 17387, + 16769, + 16129, + 15473, + 14812, + 14151, + 13499, + 12861, + 12244, + 11652, + 11091, + 10563, + 10071, + 9618, + 9203, + 8826, + 8487, + 8183, + 7912, + 7672, + 7457, + 7264, + 7088, + 6924, + 6767, + 6612, + 6455, + 6289, + 6112, + 5918, + 5705, + 5470, + 5210, + 4924, + 4612, + 4273, + 3909, + 3521, + 3112, + 2684, + 2243, + 1791, + 1334, + 878, + 427, + -11, + -432, + -831, + -1201, + -1537, + -1834, + -2089, + -2297, + -2456, + -2563, + -2617, + -2618, + -2567, + -2465, + -2315, + -2120, + -1885, + -1614, + -1315, + -993, + -656, + -311, + 32, + 367, + 684, + 977, + 1235, + 1452, + 1620, + 1734, + 1786, + 1771, + 1687, + 1529, + 1295, + 985, + 600, + 140, + -392, + -992, + -1655, + -2376, + -3147, + -3961, + -4810, + -5685, + -6575, + -7472, + -8365, + -9245, + -10102, + -10927, + -11710, + -12443, + -13118, + -13729, + -14270, + -14736, + -15123, + -15428, + -15651, + -15790, + -15848, + -15827, + -15729, + -15559, + -15323, + -15028, + -14679, + -14286, + -13856, + -13399, + -12923, + -12438, + -11952, + -11474, + -11013, + -10577, + -10173, + -9809, + -9488, + -9218, + -9000, + -8839, + -8736, + -8692, + -8706, + -8777, + -8901, + -9077, + -9299, + -9561, + -9859, + -10185, + -10533, + -10895, + -11264, + -11632, + -11992, + -12336, + -12657, + -12949, + -13206, + -13423, + -13594, + -13718, + -13790, + -13809, + -13775, + -13686, + -13545, + -13352, + -13112, + -12827, + -12502, + -12141, + -11751, + -11337, + -10905, + -10462, + -10015, + -9568, + -9130, + -8705, + -8300, + -7919, + -7566, + -7245, + -6960, + -6711, + -6502, + -6331, + -6199, + -6104, + -6044, + -6017, + -6020, + -6047, + -6095, + -6159, + -6232, + -6311, + -6390, + -6462, + -6523, + -6568, + -6592, + -6591, + -6563, + -6503, + -6411, + -6285, + -6124, + -5930, + -5705, + -5450, + -5168, + -4865, + -4545, + -4213, + -3876, + -3540, + -3212, + -2899, + -2610, + -2350, + -2128, + -1950, + -1822, + -1750, + -1740, + -1796, + -1922, + -2119, + -2389, + -2733, + -3149, + -3637, + -4192, + -4811, + -5488, + -6217, + -6991, + -7802, + -8641, + -9498, + -10363, + -11227, + -12079, + -12909, + -13707, + -14461, + -15164, + -15806, + -16379, + -16875, + -17289, + -17614, + -17847, + -17985, + -18027, + -17971, + -17818, + -17571, + -17234, + -16810, + -16305, + -15726, + -15081, + -14377, + -13624, + -12831, + -12008, + -11165, + -10311, + -9458, + -8614, + -7789, + -6992, + -6230, + -5511, + -4841, + -4226, + -3671, + -3177, + -2749, + -2386, + -2089, + -1857, + -1687, + -1577, + -1523, + -1519, + -1562, + -1643, + -1758, + -1899, + -2060, + -2233, + -2412, + -2590, + -2760, + -2918, + -3057, + -3173, + -3262, + -3321, + -3348, + -3342, + -3302, + -3228, + -3122, + -2985, + -2822, + -2635, + -2428, + -2207, + -1976, + -1740, + -1507, + -1280, + -1066, + -870, + -698, + -554, + -442, + -366, + -330, + -334, + -381, + -471, + -604, + -779, + -994, + -1245, + -1530, + -1845, + -2183, + -2541, + -2912, + -3289, + -3666, + -4038, + -4397, + -4737, + -5052, + -5337, + -5586, + -5795, + -5960, + -6078, + -6147, + -6166, + -6134, + -6053, + -5923, + -5748, + -5531, + -5277, + -4990, + -4676, + -4342, + -3994, + -3641, + -3289, + -2946, + -2620, + -2318, + -2047, + -1814, + -1625, + -1485, + -1399, + -1371, + -1403, + -1498, + -1654, + -1873, + -2153, + -2491, + -2882, + -3323, + -3808, + -4329, + -4880, + -5453, + -6039, + -6628, + -7213, + -7783, + -8329, + -8843, + -9314, + -9737, + -10102, + -10403, + -10634, + -10790, + -10868, + -10864, + -10778, + -10608, + -10356, + -10024, + -9615, + -9133, + -8585, + -7976, + -7315, + -6609, + -5867, + -5098, + -4312, + -3520, + -2730, + -1953, + -1198, + -474, + 209, + 844, + 1425, + 1945, + 2397, + 2780, + 3088, + 3321, + 3477, + 3556, + 3562, + 3495, + 3360, + 3160, + 2903, + 2593, + 2238, + 1845, + 1422, + 977, + 518, + 53, + -409, + -863, + -1299, + -1712, + -2096, + -2445, + -2754, + -3020, + -3241, + -3414, + -3538, + -3614, + -3643, + -3625, + -3565, + -3465, + -3328, + -3160, + -2965, + -2749, + -2517, + -2273, + -2025, + -1776, + -1532, + -1297, + -1075, + -871, + -685, + -522, + -382, + -266, + -173, + -102, + -53, + -22, + -7, + -2, + -5, + -11, + -14, + -10, + 7, + 43, + 103, + 191, + 313, + 472, + 672, + 915, + 1203, + 1539, + 1922, + 2351, + 2825, + 3341, + 3897, + 4486, + 5106, + 5748, + 6407, + 7076, + 7745, + 8408, + 9056, + 9680, + 10272, + 10823, + 11325, + 11771, + 12153, + 12466, + 12703, + 12861, + 12934, + 12922, + 12823, + 12635, + 12361, + 12003, + 11563, + 11047, + 10459, + 9807, + 9097, + 8338, + 7539, + 6709, + 5858, + 4995, + 4132, + 3277, + 2440, + 1632, + 860, + 133, + -540, + -1155, + -1707, + -2189, + -2599, + -2935, + -3195, + -3381, + -3493, + -3535, + -3509, + -3421, + -3276, + -3082, + -2844, + -2572, + -2272, + -1955, + -1627, + -1300, + -979, + -675, + -395, + -146, + 64, + 232, + 352, + 419, + 431, + 386, + 283, + 123, + -92, + -361, + -680, + -1045, + -1450, + -1889, + -2356, + -2843, + -3343, + -3849, + -4352, + -4844, + -5318, + -5767, + -6183, + -6560, + -6893, + -7176, + -7406, + -7578, + -7691, + -7743, + -7733, + -7663, + -7533, + -7346, + -7106, + -6815, + -6479, + -6104, + -5693, + -5255, + -4795, + -4319, + -3835, + -3348, + -2864, + -2389, + -1929, + -1488, + -1070, + -679, + -317, + 14, + 313, + 581, + 817, + 1024, + 1203, + 1358, + 1492, + 1609, + 1714, + 1811, + 1907, + 2005, + 2112, + 2232, + 2370, + 2530, + 2717, + 2934, + 3183, + 3467, + 3786, + 4141, + 4530, + 4954, + 5409, + 5891, + 6398, + 6923, + 7461, + 8006, + 8551, + 9090, + 9613, + 10115, + 10587, + 11021, + 11411, + 11749, + 12029, + 12245, + 12393, + 12468, + 12468, + 12389, + 12230, + 11993, + 11678, + 11288, + 10826, + 10297, + 9706, + 9060, + 8367, + 7635, + 6874, + 6091, + 5299, + 4506, + 3724, + 2961, + 2229, + 1537, + 894, + 309, + -211, + -659, + -1030, + -1319, + -1522, + -1637, + -1663, + -1601, + -1452, + -1219, + -905, + -516, + -59, + 460, + 1034, + 1653, + 2308, + 2991, + 3690, + 4397, + 5102, + 5794, + 6465, + 7106, + 7709, + 8266, + 8771, + 9219, + 9604, + 9924, + 10176, + 10358, + 10471, + 10515, + 10492, + 10406, + 10260, + 10060, + 9809, + 9515, + 9184, + 8823, + 8440, + 8040, + 7633, + 7224, + 6820, + 6428, + 6054, + 5702, + 5377, + 5084, + 4823, + 4599, + 4411, + 4260, + 4145, + 4064, + 4016, + 3997, + 4003, + 4030, + 4074, + 4128, + 4189, + 4249, + 4305, + 4349, + 4378, + 4386, + 4369, + 4323, + 4245, + 4133, + 3984, + 3799, + 3577, + 3318, + 3025, + 2700, + 2346, + 1967, + 1568, + 1154, + 730, + 303, + -120, + -535, + -934, + -1311, + -1660, + -1975, + -2252, + -2485, + -2671, + -2806, + -2889, + -2918, + -2892, + -2812, + -2680, + -2497, + -2268, + -1996, + -1687, + -1346, + -980, + -596, + -202, + 195, + 587, + 967, + 1327, + 1658, + 1955, + 2209, + 2416, + 2570, + 2666, + 2702, + 2675, + 2584, + 2428, + 2208, + 1926, + 1586, + 1192, + 748, + 260, + -262, + -815, + -1388, + -1974, + -2563, + -3145, + -3713, + -4257, + -4768, + -5239, + -5660, + -6027, + -6331, + -6569, + -6736, + -6829, + -6845, + -6785, + -6649, + -6438, + -6155, + -5805, + -5392, + -4923, + -4405, + -3845, + -3252, + -2635, + -2004, + -1368, + -738, + -122, + 468, + 1026, + 1541, + 2005, + 2412, + 2755, + 3028, + 3228, + 3349, + 3391, + 3353, + 3234, + 3036, + 2762, + 2414, + 1997, + 1518, + 981, + 394, + -234, + -899, + -1589, + -2298, + -3016, + -3735, + -4447, + -5145, + -5821, + -6468, + -7081, + -7654, + -8183, + -8664, + -9095, + -9475, + -9802, + -10077, + -10301, + -10476, + -10604, + -10689, + -10735, + -10746, + -10727, + -10683, + -10618, + -10539, + -10449, + -10354, + -10259, + -10167, + -10081, + -10005, + -9941, + -9890, + -9853, + -9829, + -9819, + -9819, + -9829, + -9845, + -9863, + -9880, + -9890, + -9888, + -9870, + -9829, + -9761, + -9659, + -9520, + -9338, + -9109, + -8829, + -8496, + -8106, + -7659, + -7154, + -6590, + -5971, + -5297, + -4572, + -3800, + -2987, + -2138, + -1259, + -359, + 555, + 1475, + 2392, + 3298, + 4183, + 5038, + 5856, + 6628, + 7346, + 8004, + 8595, + 9113, + 9555, + 9918, + 10198, + 10395, + 10509, + 10541, + 10494, + 10372, + 10178, + 9919, + 9601, + 9232, + 8820, + 8373, + 7901, + 7413, + 6919, + 6429, + 5951, + 5496, + 5071, + 4684, + 4344, + 4056, + 3826, + 3658, + 3556, + 3522, + 3556, + 3660, + 3831, + 4067, + 4364, + 4717, + 5121, + 5570, + 6055, + 6570, + 7105, + 7652, + 8202, + 8746, + 9275, + 9781, + 10255, + 10689, + 11077, + 11412, + 11688, + 11902, + 12050, + 12130, + 12139, + 12079, + 11950, + 11754, + 11494, + 11174, + 10800, + 10376, + 9910, + 9408, + 8878, + 8327, + 7763, + 7195, + 6631, + 6077, + 5541, + 5030, + 4551, + 4108, + 3707, + 3350, + 3043, + 2785, + 2579, + 2425, + 2322, + 2267, + 2260, + 2295, + 2370, + 2479, + 2618, + 2780, + 2960, + 3152, + 3350, + 3547, + 3738, + 3917, + 4080, + 4222, + 4338, + 4426, + 4484, + 4508, + 4500, + 4458, + 4383, + 4277, + 4143, + 3983, + 3801, + 3602, + 3390, + 3171, + 2950, + 2732, + 2523, + 2329, + 2154, + 2005, + 1884, + 1797, + 1747, + 1735, + 1764, + 1835, + 1948, + 2101, + 2294, + 2523, + 2784, + 3074, + 3387, + 3718, + 4059, + 4405, + 4748, + 5080, + 5394, + 5683, + 5939, + 6155, + 6324, + 6442, + 6502, + 6500, + 6433, + 6297, + 6092, + 5818, + 5474, + 5062, + 4587, + 4052, + 3461, + 2822, + 2141, + 1427, + 688, + -66, + -828, + -1585, + -2329, + -3049, + -3735, + -4378, + -4968, + -5497, + -5957, + -6342, + -6645, + -6863, + -6990, + -7025, + -6966, + -6814, + -6570, + -6236, + -5817, + -5317, + -4742, + -4100, + -3398, + -2645, + -1850, + -1022, + -173, + 688, + 1552, + 2407, + 3245, + 4056, + 4831, + 5563, + 6243, + 6867, + 7428, + 7923, + 8348, + 8702, + 8983, + 9191, + 9329, + 9398, + 9402, + 9344, + 9231, + 9067, + 8859, + 8613, + 8336, + 8036, + 7719, + 7392, + 7063, + 6737, + 6420, + 6118, + 5836, + 5577, + 5345, + 5141, + 4967, + 4824, + 4712, + 4628, + 4572, + 4540, + 4529, + 4534, + 4552, + 4577, + 4604, + 4628, + 4643, + 4644, + 4626, + 4584, + 4514, + 4411, + 4273, + 4097, + 3881, + 3624, + 3326, + 2988, + 2610, + 2197, + 1750, + 1274, + 774, + 254, + -279, + -820, + -1363, + -1900, + -2425, + -2931, + -3412, + -3861, + -4274, + -4645, + -4969, + -5243, + -5463, + -5629, + -5738, + -5792, + -5789, + -5733, + -5626, + -5472, + -5274, + -5040, + -4774, + -4483, + -4174, + -3855, + -3533, + -3215, + -2910, + -2626, + -2368, + -2144, + -1960, + -1821, + -1731, + -1695, + -1716, + -1794, + -1930, + -2125, + -2375, + -2679, + -3033, + -3432, + -3870, + -4341, + -4837, + -5351, + -5874, + -6398, + -6913, + -7410, + -7880, + -8315, + -8707, + -9047, + -9328, + -9545, + -9691, + -9762, + -9755, + -9668, + -9500, + -9250, + -8920, + -8513, + -8033, + -7485, + -6874, + -6208, + -5494, + -4741, + -3958, + -3155, + -2341, + -1527, + -723, + 61, + 816, + 1533, + 2202, + 2816, + 3368, + 3852, + 4262, + 4595, + 4846, + 5016, + 5102, + 5106, + 5030, + 4875, + 4646, + 4348, + 3986, + 3567, + 3097, + 2585, + 2037, + 1463, + 870, + 267, + -338, + -939, + -1527, + -2096, + -2640, + -3153, + -3631, + -4070, + -4468, + -4823, + -5133, + -5399, + -5622, + -5803, + -5944, + -6050, + -6123, + -6167, + -6189, + -6191, + -6180, + -6160, + -6137, + -6116, + -6100, + -6094, + -6102, + -6126, + -6170, + -6234, + -6319, + -6426, + -6554, + -6702, + -6866, + -7045, + -7235, + -7430, + -7628, + -7822, + -8007, + -8177, + -8328, + -8453, + -8546, + -8603, + -8618, + -8588, + -8509, + -8377, + -8192, + -7950, + -7653, + -7301, + -6895, + -6437, + -5931, + -5382, + -4795, + -4176, + -3530, + -2867, + -2193, + -1516, + -845, + -189, + 443, + 1045, + 1607, + 2123, + 2586, + 2988, + 3326, + 3594, + 3789, + 3908, + 3951, + 3917, + 3808, + 3625, + 3373, + 3055, + 2677, + 2245, + 1768, + 1253, + 708, + 144, + -430, + -1006, + -1573, + -2121, + -2641, + -3124, + -3562, + -3946, + -4271, + -4529, + -4717, + -4830, + -4866, + -4823, + -4701, + -4501, + -4225, + -3876, + -3459, + -2979, + -2442, + -1855, + -1227, + -566, + 119, + 820, + 1527, + 2232, + 2924, + 3596, + 4240, + 4847, + 5410, + 5925, + 6385, + 6787, + 7127, + 7404, + 7615, + 7763, + 7847, + 7871, + 7837, + 7750, + 7614, + 7436, + 7222, + 6978, + 6713, + 6433, + 6147, + 5860, + 5582, + 5319, + 5078, + 4864, + 4683, + 4540, + 4438, + 4381, + 4370, + 4407, + 4492, + 4624, + 4801, + 5021, + 5280, + 5574, + 5898, + 6248, + 6616, + 6998, + 7387, + 7776, + 8159, + 8530, + 8882, + 9212, + 9513, + 9781, + 10012, + 10204, + 10354, + 10460, + 10523, + 10543, + 10520, + 10457, + 10356, + 10221, + 10056, + 9866, + 9655, + 9428, + 9192, + 8951, + 8712, + 8480, + 8260, + 8056, + 7873, + 7715, + 7584, + 7483, + 7414, + 7376, + 7369, + 7392, + 7443, + 7520, + 7617, + 7730, + 7855, + 7985, + 8114, + 8234, + 8340, + 8423, + 8477, + 8495, + 8469, + 8393, + 8262, + 8070, + 7813, + 7488, + 7091, + 6621, + 6079, + 5464, + 4778, + 4024, + 3207, + 2332, + 1404, + 431, + -578, + -1615, + -2672, + -3738, + -4802, + -5855, + -6885, + -7883, + -8838, + -9741, + -10582, + -11353, + -12046, + -12655, + -13174, + -13600, + -13927, + -14155, + -14283, + -14311, + -14241, + -14076, + -13820, + -13480, + -13060, + -12569, + -12014, + -11405, + -10750, + -10060, + -9344, + -8612, + -7874, + -7140, + -6420, + -5721, + -5053, + -4422, + -3836, + -3299, + -2817, + -2393, + -2029, + -1728, + -1488, + -1309, + -1190, + -1127, + -1116, + -1154, + -1234, + -1352, + -1500, + -1672, + -1861, + -2060, + -2263, + -2462, + -2651, + -2825, + -2978, + -3106, + -3204, + -3269, + -3299, + -3292, + -3249, + -3168, + -3052, + -2902, + -2722, + -2514, + -2283, + -2033, + -1770, + -1500, + -1227, + -958, + -698, + -453, + -228, + -28, + 141, + 278, + 378, + 439, + 460, + 439, + 376, + 272, + 130, + -48, + -260, + -501, + -767, + -1051, + -1349, + -1655, + -1961, + -2263, + -2552, + -2824, + -3072, + -3290, + -3474, + -3618, + -3720, + -3776, + -3783, + -3741, + -3649, + -3507, + -3318, + -3084, + -2808, + -2494, + -2148, + -1775, + -1382, + -976, + -564, + -153, + 248, + 632, + 993, + 1321, + 1611, + 1857, + 2051, + 2191, + 2272, + 2290, + 2244, + 2134, + 1958, + 1719, + 1419, + 1061, + 650, + 192, + -306, + -839, + -1399, + -1975, + -2561, + -3146, + -3721, + -4277, + -4806, + -5297, + -5744, + -6137, + -6472, + -6740, + -6938, + -7061, + -7106, + -7071, + -6956, + -6762, + -6491, + -6145, + -5728, + -5247, + -4707, + -4116, + -3482, + -2813, + -2118, + -1408, + -691, + 20, + 720, + 1395, + 2039, + 2641, + 3194, + 3691, + 4125, + 4491, + 4784, + 5001, + 5141, + 5201, + 5183, + 5087, + 4917, + 4675, + 4367, + 3996, + 3570, + 3096, + 2580, + 2031, + 1457, + 865, + 264, + -337, + -932, + -1513, + -2073, + -2606, + -3106, + -3569, + -3990, + -4367, + -4697, + -4979, + -5214, + -5401, + -5543, + -5641, + -5699, + -5720, + -5709, + -5670, + -5608, + -5529, + -5438, + -5341, + -5241, + -5145, + -5057, + -4981, + -4920, + -4877, + -4855, + -4855, + -4878, + -4923, + -4990, + -5077, + -5181, + -5300, + -5430, + -5566, + -5705, + -5840, + -5966, + -6079, + -6172, + -6241, + -6280, + -6285, + -6251, + -6175, + -6054, + -5885, + -5667, + -5399, + -5082, + -4718, + -4308, + -3856, + -3366, + -2842, + -2292, + -1721, + -1136, + -545, + 42, + 620, + 1178, + 1709, + 2203, + 2653, + 3051, + 3390, + 3663, + 3865, + 3991, + 4037, + 4000, + 3879, + 3673, + 3383, + 3011, + 2560, + 2034, + 1439, + 780, + 66, + -696, + -1497, + -2329, + -3181, + -4044, + -4907, + -5761, + -6595, + -7401, + -8169, + -8891, + -9560, + -10168, + -10711, + -11184, + -11582, + -11905, + -12150, + -12318, + -12410, + -12429, + -12377, + -12261, + -12085, + -11855, + -11580, + -11266, + -10923, + -10558, + -10180, + -9799, + -9422, + -9058, + -8716, + -8402, + -8124, + -7888, + -7698, + -7559, + -7473, + -7444, + -7472, + -7557, + -7698, + -7893, + -8138, + -8429, + -8761, + -9129, + -9526, + -9945, + -10379, + -10819, + -11259, + -11691, + -12106, + -12498, + -12859, + -13183, + -13465, + -13699, + -13880, + -14006, + -14074, + -14083, + -14031, + -13919, + -13749, + -13523, + -13243, + -12915, + -12541, + -12128, + -11681, + -11207, + -10711, + -10200, + -9680, + -9159, + -8642, + -8134, + -7642, + -7171, + -6724, + -6304, + -5916, + -5560, + -5238, + -4950, + -4696, + -4474, + -4282, + -4117, + -3976, + -3855, + -3750, + -3655, + -3565, + -3476, + -3381, + -3277, + -3158, + -3019, + -2857, + -2668, + -2448, + -2197, + -1913, + -1595, + -1244, + -861, + -448, + -9, + 452, + 932, + 1425, + 1924, + 2423, + 2914, + 3391, + 3845, + 4270, + 4657, + 4999, + 5290, + 5523, + 5691, + 5791, + 5818, + 5769, + 5640, + 5432, + 5143, + 4776, + 4332, + 3815, + 3229, + 2580, + 1875, + 1120, + 324, + -502, + -1352, + -2214, + -3078, + -3934, + -4771, + -5579, + -6349, + -7071, + -7737, + -8338, + -8867, + -9319, + -9688, + -9972, + -10166, + -10270, + -10285, + -10210, + -10049, + -9805, + -9483, + -9089, + -8629, + -8112, + -7545, + -6938, + -6299, + -5639, + -4967, + -4294, + -3627, + -2978, + -2353, + -1763, + -1214, + -712, + -264, + 126, + 454, + 718, + 917, + 1049, + 1117, + 1121, + 1064, + 951, + 785, + 573, + 320, + 33, + -280, + -614, + -962, + -1314, + -1666, + -2008, + -2336, + -2643, + -2924, + -3174, + -3389, + -3567, + -3705, + -3802, + -3857, + -3871, + -3846, + -3784, + -3687, + -3559, + -3405, + -3228, + -3035, + -2831, + -2621, + -2410, + -2205, + -2009, + -1829, + -1669, + -1532, + -1423, + -1343, + -1294, + -1278, + -1295, + -1344, + -1424, + -1532, + -1666, + -1821, + -1994, + -2179, + -2371, + -2563, + -2750, + -2926, + -3084, + -3217, + -3320, + -3388, + -3415, + -3396, + -3327, + -3206, + -3029, + -2796, + -2506, + -2159, + -1757, + -1302, + -797, + -247, + 343, + 968, + 1621, + 2295, + 2983, + 3677, + 4368, + 5050, + 5713, + 6351, + 6955, + 7520, + 8038, + 8505, + 8915, + 9266, + 9553, + 9776, + 9934, + 10028, + 10059, + 10029, + 9944, + 9806, + 9623, + 9401, + 9147, + 8869, + 8575, + 8275, + 7976, + 7689, + 7421, + 7182, + 6980, + 6822, + 6715, + 6666, + 6680, + 6761, + 6912, + 7135, + 7431, + 7801, + 8241, + 8750, + 9323, + 9955, + 10641, + 11374, + 12144, + 12945, + 13767, + 14600, + 15435, + 16262, + 17070, + 17851, + 18595, + 19292, + 19935, + 20516, + 21028, + 21466, + 21825, + 22101, + 22292, + 22396, + 22414, + 22346, + 22195, + 21963, + 21655, + 21277, + 20834, + 20333, + 19781, + 19187, + 18558, + 17902, + 17229, + 16547, + 15863, + 15185, + 14522, + 13878, + 13262, + 12678, + 12130, + 11622, + 11158, + 10738, + 10364, + 10036, + 9752, + 9511, + 9311, + 9148, + 9019, + 8919, + 8843, + 8788, + 8747, + 8716, + 8690, + 8664, + 8633, + 8594, + 8543, + 8477, + 8393, + 8291, + 8170, + 8029, + 7869, + 7693, + 7501, + 7298, + 7086, + 6871, + 6656, + 6446, + 6248, + 6066, + 5906, + 5774, + 5675, + 5613, + 5593, + 5620, + 5696, + 5824, + 6006, + 6242, + 6534, + 6879, + 7275, + 7721, + 8211, + 8741, + 9307, + 9900, + 10514, + 11143, + 11776, + 12407, + 13026, + 13624, + 14194, + 14726, + 15212, + 15646, + 16019, + 16327, + 16562, + 16721, + 16801, + 16799, + 16714, + 16546, + 16296, + 15967, + 15562, + 15085, + 14543, + 13942, + 13289, + 12592, + 11861, + 11104, + 10331, + 9552, + 8776, + 8013, + 7273, + 6564, + 5894, + 5271, + 4702, + 4193, + 3748, + 3372, + 3066, + 2832, + 2670, + 2579, + 2557, + 2600, + 2705, + 2866, + 3076, + 3328, + 3615, + 3928, + 4259, + 4599, + 4939, + 5271, + 5584, + 5873, + 6127, + 6341, + 6508, + 6623, + 6680, + 6677, + 6610, + 6479, + 6282, + 6022, + 5699, + 5316, + 4878, + 4389, + 3855, + 3282, + 2676, + 2046, + 1399, + 743, + 86, + -563, + -1199, + -1813, + -2398, + -2948, + -3458, + -3922, + -4336, + -4698, + -5004, + -5255, + -5449, + -5587, + -5670, + -5702, + -5685, + -5624, + -5522, + -5386, + -5220, + -5031, + -4825, + -4607, + -4384, + -4162, + -3947, + -3744, + -3556, + -3390, + -3247, + -3131, + -3044, + -2986, + -2959, + -2961, + -2991, + -3047, + -3126, + -3225, + -3339, + -3464, + -3595, + -3726, + -3853, + -3969, + -4069, + -4148, + -4201, + -4224, + -4212, + -4162, + -4072, + -3940, + -3765, + -3546, + -3286, + -2984, + -2644, + -2270, + -1866, + -1436, + -987, + -525, + -57, + 409, + 867, + 1309, + 1727, + 2113, + 2462, + 2765, + 3016, + 3211, + 3344, + 3412, + 3412, + 3342, + 3201, + 2990, + 2711, + 2365, + 1958, + 1493, + 977, + 417, + -179, + -804, + -1449, + -2103, + -2757, + -3400, + -4024, + -4617, + -5171, + -5676, + -6124, + -6506, + -6816, + -7048, + -7197, + -7258, + -7230, + -7111, + -6900, + -6600, + -6211, + -5739, + -5187, + -4562, + -3870, + -3119, + -2318, + -1475, + -601, + 294, + 1201, + 2110, + 3011, + 3893, + 4747, + 5564, + 6337, + 7058, + 7721, + 8319, + 8850, + 9309, + 9694, + 10004, + 10240, + 10402, + 10492, + 10514, + 10472, + 10370, + 10215, + 10012, + 9767, + 9489, + 9183, + 8858, + 8519, + 8175, + 7831, + 7493, + 7168, + 6859, + 6572, + 6309, + 6072, + 5865, + 5686, + 5537, + 5416, + 5321, + 5250, + 5199, + 5165, + 5143, + 5129, + 5117, + 5102, + 5079, + 5042, + 4986, + 4907, + 4800, + 4661, + 4487, + 4275, + 4023, + 3731, + 3397, + 3024, + 2611, + 2161, + 1678, + 1165, + 626, + 68, + -504, + -1085, + -1668, + -2245, + -2812, + -3360, + -3883, + -4375, + -4830, + -5243, + -5609, + -5925, + -6186, + -6392, + -6540, + -6631, + -6664, + -6642, + -6567, + -6442, + -6272, + -6061, + -5817, + -5544, + -5250, + -4943, + -4630, + -4318, + -4015, + -3729, + -3467, + -3235, + -3040, + -2888, + -2782, + -2728, + -2727, + -2782, + -2893, + -3060, + -3282, + -3556, + -3879, + -4246, + -4652, + -5089, + -5552, + -6032, + -6521, + -7010, + -7491, + -7954, + -8390, + -8791, + -9149, + -9454, + -9701, + -9882, + -9992, + -10027, + -9983, + -9857, + -9649, + -9358, + -8985, + -8533, + -8006, + -7409, + -6746, + -6026, + -5256, + -4443, + -3599, + -2731, + -1849, + -965, + -88, + 771, + 1603, + 2400, + 3151, + 3849, + 4486, + 5056, + 5553, + 5973, + 6314, + 6571, + 6746, + 6838, + 6848, + 6779, + 6634, + 6419, + 6138, + 5797, + 5404, + 4965, + 4489, + 3983, + 3456, + 2915, + 2370, + 1826, + 1292, + 774, + 279, + -187, + -622, + -1021, + -1381, + -1699, + -1976, + -2210, + -2403, + -2556, + -2672, + -2753, + -2804, + -2828, + -2830, + -2815, + -2788, + -2754, + -2719, + -2687, + -2663, + -2651, + -2656, + -2679, + -2724, + -2793, + -2886, + -3004, + -3147, + -3312, + -3499, + -3704, + -3923, + -4153, + -4390, + -4627, + -4860, + -5083, + -5291, + -5477, + -5637, + -5765, + -5856, + -5905, + -5910, + -5866, + -5773, + -5627, + -5429, + -5179, + -4878, + -4529, + -4134, + -3699, + -3227, + -2725, + -2200, + -1658, + -1107, + -555, + -11, + 516, + 1020, + 1491, + 1922, + 2304, + 2631, + 2897, + 3096, + 3224, + 3277, + 3252, + 3148, + 2964, + 2703, + 2366, + 1955, + 1476, + 935, + 336, + -311, + -1000, + -1722, + -2468, + -3227, + -3990, + -4748, + -5490, + -6207, + -6889, + -7529, + -8118, + -8649, + -9115, + -9513, + -9836, + -10083, + -10252, + -10341, + -10352, + -10287, + -10147, + -9938, + -9665, + -9333, + -8949, + -8521, + -8057, + -7566, + -7057, + -6538, + -6019, + -5509, + -5016, + -4549, + -4114, + -3720, + -3371, + -3074, + -2833, + -2650, + -2528, + -2468, + -2470, + -2533, + -2654, + -2830, + -3058, + -3332, + -3646, + -3994, + -4370, + -4765, + -5173, + -5586, + -5996, + -6395, + -6777, + -7134, + -7461, + -7752, + -8002, + -8207, + -8363, + -8469, + -8522, + -8524, + -8473, + -8373, + -8224, + -8030, + -7796, + -7526, + -7225, + -6898, + -6552, + -6193, + -5828, + -5462, + -5102, + -4754, + -4423, + -4115, + -3833, + -3583, + -3366, + -3186, + -3044, + -2940, + -2875, + -2847, + -2855, + -2896, + -2967, + -3064, + -3182, + -3317, + -3463, + -3616, + -3769, + -3916, + -4053, + -4175, + -4276, + -4352, + -4400, + -4416, + -4398, + -4345, + -4256, + -4131, + -3972, + -3780, + -3558, + -3311, + -3042, + -2758, + -2463, + -2164, + -1869, + -1583, + -1316, + -1073, + -862, + -690, + -563, + -488, + -470, + -513, + -623, + -800, + -1048, + -1366, + -1756, + -2214, + -2739, + -3327, + -3973, + -4670, + -5413, + -6193, + -7002, + -7831, + -8670, + -9509, + -10338, + -11146, + -11923, + -12659, + -13344, + -13970, + -14527, + -15008, + -15407, + -15718, + -15935, + -16057, + -16080, + -16004, + -15829, + -15558, + -15192, + -14735, + -14195, + -13575, + -12885, + -12131, + -11324, + -10471, + -9582, + -8669, + -7740, + -6807, + -5878, + -4963, + -4072, + -3213, + -2393, + -1619, + -898, + -234, + 368, + 908, + 1382, + 1790, + 2133, + 2413, + 2631, + 2791, + 2899, + 2958, + 2974, + 2955, + 2905, + 2833, + 2744, + 2646, + 2545, + 2449, + 2361, + 2289, + 2237, + 2209, + 2208, + 2236, + 2297, + 2389, + 2513, + 2668, + 2852, + 3063, + 3296, + 3548, + 3815, + 4091, + 4371, + 4650, + 4921, + 5178, + 5417, + 5632, + 5818, + 5970, + 6085, + 6158, + 6189, + 6174, + 6113, + 6005, + 5853, + 5656, + 5418, + 5141, + 4830, + 4490, + 4125, + 3741, + 3345, + 2942, + 2540, + 2144, + 1761, + 1397, + 1057, + 749, + 475, + 240, + 47, + -100, + -202, + -256, + -264, + -227, + -146, + -25, + 131, + 319, + 533, + 767, + 1013, + 1265, + 1516, + 1757, + 1982, + 2182, + 2351, + 2481, + 2567, + 2603, + 2584, + 2506, + 2366, + 2162, + 1893, + 1559, + 1161, + 702, + 185, + -385, + -1004, + -1664, + -2359, + -3081, + -3820, + -4569, + -5318, + -6058, + -6778, + -7471, + -8127, + -8738, + -9295, + -9791, + -10221, + -10579, + -10859, + -11060, + -11179, + -11215, + -11168, + -11040, + -10834, + -10553, + -10203, + -9790, + -9320, + -8802, + -8244, + -7654, + -7043, + -6420, + -5794, + -5176, + -4576, + -4002, + -3463, + -2967, + -2522, + -2133, + -1808, + -1550, + -1362, + -1247, + -1206, + -1240, + -1346, + -1523, + -1767, + -2074, + -2438, + -2855, + -3316, + -3816, + -4345, + -4896, + -5461, + -6032, + -6600, + -7158, + -7699, + -8214, + -8699, + -9146, + -9552, + -9913, + -10224, + -10485, + -10692, + -10848, + -10950, + -11002, + -11006, + -10963, + -10879, + -10756, + -10601, + -10417, + -10210, + -9986, + -9750, + -9506, + -9261, + -9019, + -8784, + -8560, + -8349, + -8155, + -7979, + -7822, + -7684, + -7564, + -7461, + -7373, + -7297, + -7230, + -7167, + -7104, + -7036, + -6957, + -6864, + -6749, + -6609, + -6437, + -6230, + -5983, + -5692, + -5354, + -4968, + -4531, + -4043, + -3505, + -2917, + -2282, + -1602, + -883, + -129, + 654, + 1460, + 2281, + 3111, + 3940, + 4760, + 5563, + 6339, + 7081, + 7780, + 8428, + 9017, + 9542, + 9995, + 10373, + 10670, + 10884, + 11013, + 11055, + 11012, + 10885, + 10677, + 10391, + 10033, + 9609, + 9125, + 8589, + 8011, + 7398, + 6760, + 6107, + 5450, + 4797, + 4159, + 3545, + 2964, + 2425, + 1935, + 1500, + 1127, + 820, + 584, + 419, + 329, + 312, + 368, + 495, + 688, + 944, + 1258, + 1622, + 2029, + 2473, + 2944, + 3435, + 3936, + 4438, + 4934, + 5414, + 5870, + 6295, + 6681, + 7023, + 7315, + 7553, + 7734, + 7854, + 7914, + 7912, + 7850, + 7729, + 7553, + 7326, + 7053, + 6739, + 6390, + 6014, + 5618, + 5209, + 4795, + 4385, + 3985, + 3603, + 3247, + 2923, + 2636, + 2393, + 2197, + 2052, + 1962, + 1927, + 1950, + 2028, + 2162, + 2350, + 2588, + 2872, + 3200, + 3565, + 3962, + 4384, + 4827, + 5283, + 5746, + 6209, + 6667, + 7114, + 7544, + 7951, + 8333, + 8686, + 9005, + 9291, + 9540, + 9754, + 9931, + 10075, + 10186, + 10267, + 10322, + 10355, + 10370, + 10373, + 10367, + 10359, + 10354, + 10357, + 10373, + 10406, + 10462, + 10542, + 10652, + 10792, + 10965, + 11171, + 11410, + 11681, + 11982, + 12310, + 12661, + 13031, + 13414, + 13806, + 14198, + 14585, + 14958, + 15311, + 15636, + 15925, + 16172, + 16369, + 16509, + 16587, + 16598, + 16537, + 16400, + 16186, + 15893, + 15521, + 15070, + 14543, + 13943, + 13274, + 12542, + 11752, + 10913, + 10033, + 9119, + 8183, + 7233, + 6280, + 5335, + 4407, + 3507, + 2645, + 1830, + 1071, + 376, + -246, + -792, + -1256, + -1633, + -1920, + -2116, + -2222, + -2236, + -2163, + -2006, + -1768, + -1456, + -1076, + -636, + -144, + 390, + 959, + 1552, + 2159, + 2772, + 3379, + 3971, + 4541, + 5079, + 5577, + 6030, + 6431, + 6774, + 7057, + 7277, + 7430, + 7518, + 7541, + 7500, + 7397, + 7237, + 7024, + 6762, + 6459, + 6119, + 5750, + 5360, + 4954, + 4541, + 4128, + 3721, + 3327, + 2951, + 2600, + 2278, + 1989, + 1736, + 1522, + 1347, + 1212, + 1117, + 1061, + 1041, + 1054, + 1098, + 1167, + 1258, + 1364, + 1482, + 1604, + 1726, + 1842, + 1947, + 2035, + 2103, + 2145, + 2159, + 2142, + 2091, + 2005, + 1884, + 1729, + 1540, + 1319, + 1070, + 796, + 501, + 190, + -130, + -456, + -780, + -1097, + -1400, + -1682, + -1938, + -2162, + -2349, + -2494, + -2593, + -2642, + -2640, + -2583, + -2473, + -2308, + -2090, + -1822, + -1506, + -1146, + -748, + -316, + 141, + 620, + 1111, + 1606, + 2099, + 2581, + 3044, + 3480, + 3882, + 4243, + 4557, + 4818, + 5022, + 5164, + 5241, + 5253, + 5197, + 5075, + 4888, + 4639, + 4330, + 3968, + 3557, + 3104, + 2616, + 2102, + 1568, + 1026, + 482, + -52, + -570, + -1062, + -1519, + -1934, + -2300, + -2609, + -2857, + -3039, + -3151, + -3191, + -3158, + -3052, + -2874, + -2627, + -2314, + -1939, + -1510, + -1031, + -512, + 40, + 616, + 1207, + 1803, + 2395, + 2971, + 3524, + 4043, + 4519, + 4945, + 5313, + 5615, + 5847, + 6002, + 6079, + 6073, + 5984, + 5811, + 5555, + 5218, + 4804, + 4317, + 3761, + 3142, + 2468, + 1746, + 983, + 188, + -630, + -1464, + -2305, + -3145, + -3975, + -4788, + -5577, + -6336, + -7058, + -7741, + -8378, + -8968, + -9509, + -9998, + -10437, + -10825, + -11164, + -11457, + -11707, + -11916, + -12089, + -12231, + -12347, + -12441, + -12518, + -12584, + -12643, + -12699, + -12757, + -12821, + -12893, + -12975, + -13070, + -13178, + -13299, + -13433, + -13579, + -13733, + -13894, + -14058, + -14220, + -14377, + -14523, + -14652, + -14760, + -14841, + -14890, + -14900, + -14868, + -14788, + -14657, + -14472, + -14228, + -13926, + -13563, + -13139, + -12656, + -12115, + -11519, + -10872, + -10178, + -9442, + -8672, + -7874, + -7056, + -6226, + -5392, + -4563, + -3748, + -2955, + -2193, + -1471, + -796, + -176, + 383, + 876, + 1298, + 1645, + 1914, + 2104, + 2215, + 2247, + 2202, + 2084, + 1896, + 1645, + 1336, + 976, + 574, + 138, + -322, + -799, + -1282, + -1762, + -2229, + -2673, + -3087, + -3461, + -3788, + -4062, + -4276, + -4426, + -4508, + -4519, + -4457, + -4324, + -4118, + -3844, + -3503, + -3100, + -2641, + -2132, + -1580, + -993, + -378, + 254, + 896, + 1539, + 2173, + 2790, + 3380, + 3937, + 4452, + 4920, + 5333, + 5688, + 5980, + 6206, + 6365, + 6456, + 6479, + 6437, + 6330, + 6164, + 5943, + 5671, + 5356, + 5003, + 4620, + 4214, + 3794, + 3366, + 2940, + 2522, + 2120, + 1741, + 1391, + 1076, + 800, + 569, + 385, + 250, + 167, + 135, + 153, + 222, + 337, + 496, + 695, + 930, + 1195, + 1486, + 1795, + 2117, + 2446, + 2776, + 3100, + 3413, + 3710, + 3986, + 4236, + 4457, + 4646, + 4802, + 4922, + 5006, + 5055, + 5070, + 5053, + 5007, + 4935, + 4841, + 4729, + 4606, + 4476, + 4344, + 4216, + 4098, + 3994, + 3911, + 3852, + 3821, + 3823, + 3860, + 3935, + 4047, + 4198, + 4387, + 4613, + 4873, + 5164, + 5482, + 5822, + 6178, + 6545, + 6915, + 7282, + 7638, + 7976, + 8288, + 8566, + 8805, + 8996, + 9134, + 9214, + 9229, + 9178, + 9056, + 8863, + 8596, + 8256, + 7846, + 7367, + 6823, + 6220, + 5562, + 4857, + 4113, + 3337, + 2539, + 1729, + 915, + 110, + -677, + -1438, + -2161, + -2837, + -3457, + -4014, + -4500, + -4908, + -5234, + -5472, + -5621, + -5678, + -5643, + -5517, + -5301, + -4999, + -4616, + -4156, + -3627, + -3035, + -2390, + -1700, + -974, + -222, + 544, + 1317, + 2086, + 2840, + 3572, + 4271, + 4929, + 5540, + 6097, + 6593, + 7025, + 7389, + 7683, + 7906, + 8057, + 8137, + 8149, + 8096, + 7981, + 7809, + 7586, + 7317, + 7010, + 6671, + 6308, + 5927, + 5535, + 5140, + 4749, + 4367, + 4000, + 3653, + 3330, + 3035, + 2771, + 2540, + 2341, + 2176, + 2044, + 1942, + 1869, + 1821, + 1795, + 1786, + 1789, + 1800, + 1813, + 1823, + 1824, + 1812, + 1780, + 1726, + 1644, + 1532, + 1386, + 1204, + 986, + 729, + 436, + 107, + -254, + -648, + -1069, + -1513, + -1975, + -2449, + -2929, + -3410, + -3884, + -4345, + -4786, + -5201, + -5584, + -5928, + -6229, + -6481, + -6681, + -6826, + -6913, + -6941, + -6909, + -6818, + -6669, + -6465, + -6209, + -5905, + -5559, + -5176, + -4763, + -4326, + -3874, + -3412, + -2950, + -2496, + -2055, + -1637, + -1248, + -894, + -582, + -315, + -99, + 63, + 170, + 220, + 214, + 152, + 37, + -128, + -339, + -592, + -879, + -1193, + -1528, + -1874, + -2224, + -2569, + -2899, + -3206, + -3482, + -3716, + -3903, + -4034, + -4104, + -4105, + -4034, + -3886, + -3660, + -3354, + -2968, + -2502, + -1960, + -1344, + -659, + 88, + 893, + 1746, + 2640, + 3566, + 4513, + 5473, + 6434, + 7387, + 8322, + 9228, + 10096, + 10918, + 11684, + 12388, + 13022, + 13581, + 14061, + 14458, + 14769, + 14993, + 15131, + 15184, + 15153, + 15043, + 14857, + 14601, + 14281, + 13904, + 13476, + 13005, + 12500, + 11969, + 11420, + 10860, + 10297, + 9740, + 9194, + 8667, + 8163, + 7688, + 7245, + 6837, + 6467, + 6137, + 5845, + 5593, + 5378, + 5198, + 5050, + 4932, + 4838, + 4765, + 4707, + 4659, + 4617, + 4575, + 4529, + 4474, + 4405, + 4319, + 4212, + 4082, + 3927, + 3747, + 3539, + 3306, + 3047, + 2766, + 2465, + 2147, + 1816, + 1478, + 1136, + 796, + 465, + 147, + -151, + -424, + -667, + -874, + -1042, + -1165, + -1241, + -1267, + -1241, + -1163, + -1033, + -851, + -620, + -343, + -23, + 333, + 722, + 1137, + 1571, + 2016, + 2464, + 2908, + 3338, + 3746, + 4125, + 4466, + 4762, + 5005, + 5189, + 5309, + 5359, + 5337, + 5240, + 5065, + 4813, + 4484, + 4080, + 3605, + 3062, + 2456, + 1795, + 1085, + 334, + -448, + -1255, + -2075, + -2898, + -3716, + -4518, + -5295, + -6036, + -6734, + -7381, + -7968, + -8491, + -8942, + -9318, + -9616, + -9833, + -9969, + -10024, + -9999, + -9897, + -9723, + -9481, + -9177, + -8817, + -8410, + -7963, + -7484, + -6984, + -6470, + -5951, + -5438, + -4938, + -4460, + -4012, + -3601, + -3232, + -2912, + -2645, + -2434, + -2283, + -2191, + -2160, + -2188, + -2274, + -2414, + -2605, + -2842, + -3119, + -3430, + -3769, + -4128, + -4500, + -4877, + -5252, + -5618, + -5966, + -6290, + -6585, + -6844, + -7062, + -7235, + -7361, + -7435, + -7458, + -7429, + -7347, + -7215, + -7034, + -6808, + -6541, + -6236, + -5901, + -5539, + -5157, + -4762, + -4359, + -3956, + -3558, + -3172, + -2802, + -2456, + -2137, + -1849, + -1595, + -1379, + -1202, + -1065, + -968, + -911, + -891, + -906, + -954, + -1030, + -1131, + -1251, + -1385, + -1529, + -1676, + -1822, + -1960, + -2085, + -2194, + -2280, + -2342, + -2374, + -2376, + -2344, + -2280, + -2182, + -2052, + -1891, + -1702, + -1490, + -1258, + -1011, + -756, + -498, + -245, + -4, + 219, + 416, + 579, + 703, + 779, + 802, + 767, + 668, + 502, + 266, + -43, + -426, + -882, + -1410, + -2008, + -2672, + -3397, + -4178, + -5008, + -5880, + -6784, + -7712, + -8654, + -9601, + -10541, + -11465, + -12362, + -13222, + -14035, + -14792, + -15484, + -16103, + -16642, + -17096, + -17459, + -17728, + -17901, + -17975, + -17952, + -17832, + -17619, + -17315, + -16927, + -16459, + -15920, + -15316, + -14657, + -13952, + -13209, + -12440, + -11653, + -10860, + -10069, + -9291, + -8534, + -7807, + -7118, + -6473, + -5879, + -5340, + -4860, + -4444, + -4091, + -3803, + -3579, + -3418, + -3317, + -3274, + -3283, + -3339, + -3437, + -3571, + -3734, + -3920, + -4120, + -4330, + -4540, + -4746, + -4940, + -5118, + -5275, + -5405, + -5505, + -5574, + -5608, + -5607, + -5571, + -5500, + -5396, + -5262, + -5101, + -4916, + -4712, + -4494, + -4267, + -4037, + -3810, + -3590, + -3384, + -3197, + -3034, + -2899, + -2797, + -2731, + -2704, + -2717, + -2772, + -2868, + -3006, + -3184, + -3399, + -3648, + -3928, + -4233, + -4560, + -4902, + -5253, + -5607, + -5958, + -6298, + -6623, + -6924, + -7197, + -7437, + -7637, + -7795, + -7906, + -7969, + -7980, + -7941, + -7850, + -7708, + -7519, + -7284, + -7008, + -6695, + -6351, + -5982, + -5595, + -5196, + -4794, + -4395, + -4008, + -3639, + -3297, + -2988, + -2719, + -2495, + -2322, + -2203, + -2143, + -2144, + -2206, + -2330, + -2515, + -2760, + -3060, + -3412, + -3811, + -4251, + -4724, + -5223, + -5740, + -6266, + -6791, + -7308, + -7806, + -8276, + -8710, + -9099, + -9434, + -9710, + -9919, + -10056, + -10116, + -10096, + -9995, + -9810, + -9542, + -9193, + -8764, + -8261, + -7688, + -7051, + -6357, + -5613, + -4828, + -4011, + -3173, + -2321, + -1467, + -620, + 209, + 1012, + 1780, + 2505, + 3177, + 3792, + 4342, + 4824, + 5232, + 5565, + 5822, + 6001, + 6103, + 6131, + 6088, + 5977, + 5804, + 5573, + 5293, + 4969, + 4610, + 4222, + 3815, + 3396, + 2974, + 2556, + 2149, + 1761, + 1398, + 1065, + 768, + 511, + 297, + 129, + 8, + -66, + -93, + -74, + -12, + 89, + 229, + 402, + 603, + 828, + 1070, + 1325, + 1588, + 1852, + 2113, + 2366, + 2606, + 2831, + 3036, + 3219, + 3378, + 3512, + 3621, + 3705, + 3766, + 3805, + 3825, + 3831, + 3825, + 3812, + 3797, + 3785, + 3781, + 3792, + 3821, + 3875, + 3958, + 4074, + 4227, + 4421, + 4658, + 4940, + 5267, + 5639, + 6056, + 6516, + 7015, + 7550, + 8116, + 8707, + 9318, + 9941, + 10568, + 11193, + 11805, + 12398, + 12962, + 13489, + 13970, + 14398, + 14766, + 15066, + 15292, + 15440, + 15505, + 15484, + 15375, + 15177, + 14890, + 14517, + 14059, + 13520, + 12905, + 12221, + 11473, + 10671, + 9822, + 8935, + 8020, + 7086, + 6145, + 5205, + 4278, + 3372, + 2496, + 1660, + 871, + 136, + -537, + -1145, + -1685, + -2151, + -2544, + -2862, + -3107, + -3279, + -3383, + -3422, + -3401, + -3327, + -3207, + -3047, + -2855, + -2641, + -2413, + -2179, + -1948, + -1728, + -1528, + -1356, + -1217, + -1119, + -1067, + -1064, + -1116, + -1224, + -1389, + -1611, + -1891, + -2226, + -2612, + -3047, + -3525, + -4041, + -4588, + -5160, + -5748, + -6347, + -6947, + -7541, + -8121, + -8679, + -9208, + -9702, + -10154, + -10559, + -10912, + -11209, + -11447, + -11624, + -11739, + -11793, + -11785, + -11718, + -11594, + -11417, + -11191, + -10921, + -10613, + -10271, + -9903, + -9515, + -9112, + -8703, + -8292, + -7886, + -7490, + -7109, + -6748, + -6410, + -6099, + -5816, + -5564, + -5342, + -5150, + -4988, + -4853, + -4743, + -4655, + -4584, + -4527, + -4479, + -4434, + -4388, + -4335, + -4270, + -4188, + -4085, + -3955, + -3797, + -3605, + -3379, + -3116, + -2815, + -2477, + -2103, + -1694, + -1253, + -784, + -292, + 218, + 741, + 1271, + 1800, + 2320, + 2825, + 3307, + 3757, + 4169, + 4536, + 4850, + 5106, + 5298, + 5422, + 5473, + 5450, + 5350, + 5172, + 4918, + 4589, + 4188, + 3719, + 3187, + 2599, + 1960, + 1279, + 565, + -172, + -924, + -1680, + -2431, + -3165, + -3872, + -4544, + -5170, + -5741, + -6249, + -6688, + -7050, + -7330, + -7525, + -7631, + -7647, + -7572, + -7407, + -7154, + -6817, + -6399, + -5907, + -5347, + -4726, + -4052, + -3335, + -2584, + -1808, + -1017, + -220, + 570, + 1347, + 2101, + 2823, + 3506, + 4142, + 4725, + 5250, + 5713, + 6110, + 6441, + 6703, + 6898, + 7026, + 7090, + 7093, + 7040, + 6935, + 6784, + 6594, + 6371, + 6122, + 5854, + 5575, + 5291, + 5010, + 4738, + 4482, + 4246, + 4036, + 3855, + 3707, + 3595, + 3520, + 3483, + 3483, + 3519, + 3590, + 3692, + 3823, + 3979, + 4154, + 4343, + 4543, + 4746, + 4947, + 5142, + 5324, + 5489, + 5631, + 5748, + 5834, + 5887, + 5906, + 5888, + 5833, + 5741, + 5614, + 5453, + 5261, + 5042, + 4800, + 4540, + 4267, + 3986, + 3705, + 3428, + 3164, + 2917, + 2694, + 2501, + 2344, + 2227, + 2154, + 2130, + 2156, + 2235, + 2368, + 2555, + 2795, + 3085, + 3424, + 3807, + 4229, + 4686, + 5170, + 5677, + 6197, + 6724, + 7249, + 7766, + 8265, + 8739, + 9182, + 9585, + 9943, + 10249, + 10500, + 10690, + 10817, + 10880, + 10876, + 10806, + 10672, + 10475, + 10220, + 9912, + 9554, + 9154, + 8719, + 8257, + 7776, + 7285, + 6792, + 6308, + 5840, + 5398, + 4990, + 4624, + 4308, + 4049, + 3851, + 3720, + 3659, + 3672, + 3759, + 3921, + 4156, + 4463, + 4838, + 5277, + 5773, + 6321, + 6914, + 7542, + 8197, + 8871, + 9553, + 10233, + 10902, + 11549, + 12167, + 12745, + 13275, + 13749, + 14160, + 14503, + 14772, + 14963, + 15074, + 15102, + 15047, + 14910, + 14693, + 14398, + 14029, + 13591, + 13091, + 12534, + 11927, + 11279, + 10597, + 9890, + 9166, + 8434, + 7701, + 6977, + 6268, + 5582, + 4924, + 4301, + 3718, + 3177, + 2684, + 2239, + 1844, + 1499, + 1204, + 957, + 757, + 599, + 481, + 399, + 347, + 322, + 318, + 329, + 352, + 381, + 411, + 438, + 459, + 470, + 469, + 453, + 422, + 375, + 313, + 237, + 149, + 51, + -53, + -159, + -264, + -361, + -447, + -515, + -560, + -577, + -561, + -506, + -407, + -262, + -66, + 183, + 488, + 850, + 1269, + 1744, + 2273, + 2854, + 3483, + 4157, + 4868, + 5612, + 6381, + 7168, + 7964, + 8762, + 9553, + 10327, + 11076, + 11792, + 12466, + 13090, + 13656, + 14159, + 14592, + 14951, + 15230, + 15429, + 15544, + 15576, + 15524, + 15391, + 15180, + 14895, + 14540, + 14123, + 13649, + 13127, + 12566, + 11973, + 11359, + 10733, + 10105, + 9484, + 8880, + 8301, + 7757, + 7254, + 6800, + 6401, + 6062, + 5788, + 5580, + 5441, + 5372, + 5371, + 5437, + 5568, + 5758, + 6002, + 6296, + 6631, + 7001, + 7397, + 7811, + 8234, + 8657, + 9071, + 9468, + 9838, + 10174, + 10468, + 10714, + 10906, + 11039, + 11108, + 11111, + 11046, + 10913, + 10710, + 10441, + 10106, + 9711, + 9259, + 8755, + 8206, + 7618, + 6999, + 6356, + 5697, + 5030, + 4362, + 3703, + 3059, + 2437, + 1844, + 1286, + 768, + 294, + -130, + -504, + -826, + -1095, + -1311, + -1476, + -1590, + -1658, + -1683, + -1668, + -1620, + -1543, + -1443, + -1326, + -1198, + -1066, + -934, + -810, + -697, + -601, + -527, + -478, + -456, + -464, + -504, + -575, + -679, + -812, + -974, + -1162, + -1372, + -1601, + -1844, + -2095, + -2351, + -2604, + -2850, + -3083, + -3298, + -3489, + -3652, + -3783, + -3877, + -3932, + -3946, + -3916, + -3844, + -3728, + -3570, + -3373, + -3140, + -2874, + -2580, + -2264, + -1931, + -1589, + -1243, + -903, + -575, + -266, + 14, + 261, + 467, + 626, + 731, + 779, + 764, + 683, + 535, + 319, + 34, + -317, + -734, + -1213, + -1749, + -2336, + -2968, + -3637, + -4335, + -5054, + -5784, + -6515, + -7237, + -7940, + -8614, + -9250, + -9837, + -10368, + -10834, + -11227, + -11542, + -11772, + -11913, + -11963, + -11919, + -11781, + -11550, + -11226, + -10814, + -10318, + -9743, + -9095, + -8382, + -7613, + -6796, + -5940, + -5056, + -4154, + -3243, + -2334, + -1437, + -561, + 284, + 1090, + 1850, + 2556, + 3204, + 3787, + 4302, + 4747, + 5119, + 5419, + 5647, + 5805, + 5895, + 5921, + 5888, + 5801, + 5665, + 5488, + 5276, + 5035, + 4773, + 4497, + 4214, + 3930, + 3651, + 3384, + 3133, + 2903, + 2697, + 2518, + 2368, + 2248, + 2158, + 2097, + 2063, + 2055, + 2070, + 2102, + 2149, + 2206, + 2267, + 2327, + 2381, + 2423, + 2448, + 2451, + 2427, + 2372, + 2283, + 2156, + 1989, + 1781, + 1531, + 1239, + 906, + 535, + 127, + -313, + -782, + -1275, + -1787, + -2310, + -2840, + -3369, + -3892, + -4400, + -4888, + -5350, + -5779, + -6171, + -6520, + -6821, + -7073, + -7271, + -7416, + -7505, + -7539, + -7519, + -7448, + -7329, + -7165, + -6962, + -6725, + -6461, + -6175, + -5876, + -5571, + -5267, + -4973, + -4695, + -4442, + -4219, + -4034, + -3893, + -3799, + -3759, + -3774, + -3848, + -3980, + -4173, + -4423, + -4731, + -5091, + -5501, + -5954, + -6446, + -6968, + -7514, + -8075, + -8643, + -9208, + -9763, + -10297, + -10802, + -11269, + -11690, + -12058, + -12366, + -12607, + -12777, + -12871, + -12887, + -12824, + -12679, + -12455, + -12153, + -11776, + -11328, + -10815, + -10243, + -9619, + -8952, + -8251, + -7524, + -6781, + -6032, + -5288, + -4559, + -3853, + -3182, + -2553, + -1975, + -1456, + -1002, + -619, + -312, + -84, + 60, + 123, + 102, + 0, + -182, + -442, + -774, + -1173, + -1634, + -2149, + -2712, + -3315, + -3950, + -4608, + -5281, + -5961, + -6641, + -7312, + -7969, + -8603, + -9209, + -9783, + -10320, + -10817, + -11271, + -11681, + -12047, + -12368, + -12645, + -12882, + -13080, + -13243, + -13374, + -13479, + -13562, + -13627, + -13680, + -13726, + -13771, + -13817, + -13871, + -13935, + -14014, + -14110, + -14224, + -14359, + -14514, + -14690, + -14886, + -15099, + -15327, + -15567, + -15815, + -16067, + -16317, + -16560, + -16791, + -17005, + -17194, + -17355, + -17480, + -17566, + -17608, + -17601, + -17543, + -17430, + -17261, + -17035, + -16752, + -16412, + -16018, + -15573, + -15080, + -14544, + -13971, + -13367, + -12739, + -12093, + -11439, + -10785, + -10138, + -9508, + -8903, + -8330, + -7798, + -7314, + -6885, + -6516, + -6213, + -5979, + -5818, + -5730, + -5718, + -5781, + -5917, + -6123, + -6396, + -6730, + -7120, + -7559, + -8038, + -8551, + -9087, + -9638, + -10193, + -10743, + -11279, + -11791, + -12268, + -12704, + -13089, + -13417, + -13680, + -13874, + -13993, + -14035, + -13996, + -13877, + -13678, + -13399, + -13044, + -12616, + -12119, + -11561, + -10948, + -10286, + -9584, + -8851, + -8095, + -7326, + -6553, + -5785, + -5030, + -4298, + -3597, + -2932, + -2312, + -1742, + -1227, + -770, + -374, + -41, + 228, + 436, + 583, + 671, + 706, + 690, + 629, + 530, + 399, + 243, + 69, + -114, + -300, + -481, + -651, + -801, + -927, + -1021, + -1079, + -1096, + -1070, + -997, + -876, + -706, + -488, + -222, + 88, + 441, + 833, + 1259, + 1713, + 2192, + 2688, + 3195, + 3707, + 4217, + 4720, + 5209, + 5678, + 6122, + 6536, + 6916, + 7259, + 7562, + 7822, + 8039, + 8213, + 8344, + 8434, + 8485, + 8500, + 8483, + 8437, + 8368, + 8280, + 8180, + 8072, + 7962, + 7855, + 7758, + 7675, + 7609, + 7567, + 7549, + 7561, + 7602, + 7675, + 7779, + 7913, + 8077, + 8267, + 8480, + 8712, + 8957, + 9211, + 9467, + 9719, + 9959, + 10181, + 10377, + 10539, + 10662, + 10738, + 10761, + 10725, + 10627, + 10460, + 10223, + 9913, + 9529, + 9072, + 8541, + 7940, + 7271, + 6540, + 5752, + 4913, + 4032, + 3116, + 2174, + 1216, + 252, + -707, + -1652, + -2571, + -3455, + -4294, + -5078, + -5798, + -6446, + -7015, + -7499, + -7893, + -8193, + -8395, + -8499, + -8504, + -8412, + -8224, + -7944, + -7578, + -7130, + -6608, + -6019, + -5372, + -4676, + -3939, + -3173, + -2387, + -1591, + -794, + -7, + 760, + 1501, + 2207, + 2871, + 3486, + 4048, + 4552, + 4996, + 5376, + 5692, + 5945, + 6136, + 6267, + 6341, + 6362, + 6335, + 6267, + 6162, + 6027, + 5869, + 5696, + 5513, + 5328, + 5147, + 4976, + 4821, + 4688, + 4580, + 4501, + 4455, + 4442, + 4465, + 4523, + 4616, + 4742, + 4899, + 5083, + 5292, + 5520, + 5763, + 6016, + 6272, + 6527, + 6774, + 7008, + 7224, + 7415, + 7578, + 7709, + 7803, + 7858, + 7871, + 7842, + 7770, + 7655, + 7498, + 7302, + 7070, + 6805, + 6511, + 6193, + 5858, + 5510, + 5156, + 4802, + 4455, + 4121, + 3806, + 3516, + 3257, + 3034, + 2850, + 2709, + 2615, + 2568, + 2571, + 2622, + 2721, + 2866, + 3054, + 3281, + 3543, + 3835, + 4150, + 4481, + 4823, + 5167, + 5505, + 5831, + 6136, + 6413, + 6655, + 6856, + 7009, + 7109, + 7151, + 7133, + 7052, + 6905, + 6694, + 6417, + 6078, + 5679, + 5224, + 4718, + 4167, + 3577, + 2957, + 2314, + 1658, + 996, + 339, + -304, + -925, + -1514, + -2063, + -2563, + -3007, + -3389, + -3702, + -3943, + -4106, + -4191, + -4196, + -4119, + -3964, + -3732, + -3426, + -3051, + -2614, + -2120, + -1577, + -993, + -378, + 258, + 909, + 1562, + 2208, + 2837, + 3440, + 4008, + 4533, + 5006, + 5422, + 5773, + 6055, + 6264, + 6397, + 6453, + 6431, + 6332, + 6158, + 5911, + 5596, + 5217, + 4780, + 4292, + 3759, + 3189, + 2591, + 1972, + 1340, + 703, + 71, + -550, + -1153, + -1731, + -2278, + -2789, + -3259, + -3685, + -4064, + -4395, + -4676, + -4907, + -5091, + -5228, + -5321, + -5374, + -5391, + -5375, + -5332, + -5267, + -5185, + -5092, + -4992, + -4891, + -4794, + -4705, + -4628, + -4565, + -4521, + -4496, + -4492, + -4509, + -4546, + -4603, + -4678, + -4768, + -4869, + -4977, + -5089, + -5199, + -5302, + -5393, + -5466, + -5516, + -5538, + -5527, + -5478, + -5387, + -5252, + -5068, + -4835, + -4551, + -4216, + -3831, + -3397, + -2918, + -2397, + -1838, + -1247, + -630, + 5, + 653, + 1304, + 1952, + 2586, + 3199, + 3782, + 4327, + 4825, + 5270, + 5653, + 5970, + 6214, + 6382, + 6470, + 6475, + 6397, + 6235, + 5990, + 5666, + 5265, + 4792, + 4253, + 3655, + 3004, + 2310, + 1581, + 827, + 56, + -718, + -1490, + -2248, + -2981, + -3682, + -4341, + -4951, + -5503, + -5993, + -6415, + -6764, + -7038, + -7235, + -7354, + -7396, + -7363, + -7257, + -7083, + -6846, + -6552, + -6208, + -5820, + -5397, + -4948, + -4481, + -4005, + -3529, + -3062, + -2611, + -2184, + -1790, + -1433, + -1121, + -858, + -647, + -491, + -393, + -352, + -368, + -440, + -565, + -740, + -959, + -1218, + -1511, + -1830, + -2170, + -2522, + -2878, + -3231, + -3574, + -3898, + -4197, + -4464, + -4692, + -4877, + -5012, + -5096, + -5123, + -5093, + -5005, + -4857, + -4651, + -4389, + -4073, + -3706, + -3294, + -2840, + -2350, + -1830, + -1287, + -726, + -154, + 421, + 995, + 1561, + 2113, + 2646, + 3155, + 3637, + 4087, + 4505, + 4887, + 5234, + 5545, + 5821, + 6064, + 6276, + 6460, + 6620, + 6760, + 6885, + 6999, + 7109, + 7218, + 7332, + 7457, + 7596, + 7754, + 7936, + 8144, + 8380, + 8647, + 8946, + 9276, + 9637, + 10027, + 10443, + 10883, + 11341, + 11813, + 12293, + 12775, + 13251, + 13715, + 14160, + 14576, + 14958, + 15297, + 15587, + 15820, + 15990, + 16093, + 16122, + 16075, + 15948, + 15740, + 15450, + 15077, + 14625, + 14095, + 13492, + 12820, + 12085, + 11294, + 10456, + 9578, + 8671, + 7743, + 6804, + 5866, + 4939, + 4032, + 3157, + 2322, + 1536, + 808, + 146, + -443, + -955, + -1384, + -1729, + -1985, + -2153, + -2233, + -2227, + -2137, + -1968, + -1725, + -1414, + -1042, + -618, + -149, + 354, + 883, + 1429, + 1981, + 2530, + 3066, + 3580, + 4063, + 4509, + 4909, + 5258, + 5551, + 5782, + 5949, + 6050, + 6084, + 6051, + 5952, + 5790, + 5567, + 5289, + 4959, + 4585, + 4171, + 3725, + 3253, + 2764, + 2264, + 1761, + 1261, + 772, + 299, + -150, + -573, + -963, + -1319, + -1636, + -1913, + -2149, + -2344, + -2499, + -2616, + -2697, + -2745, + -2764, + -2759, + -2734, + -2695, + -2646, + -2594, + -2544, + -2501, + -2470, + -2456, + -2464, + -2497, + -2557, + -2648, + -2771, + -2926, + -3113, + -3332, + -3580, + -3855, + -4154, + -4472, + -4805, + -5148, + -5494, + -5838, + -6174, + -6494, + -6794, + -7066, + -7304, + -7504, + -7660, + -7768, + -7824, + -7826, + -7770, + -7657, + -7485, + -7256, + -6972, + -6635, + -6248, + -5817, + -5347, + -4843, + -4313, + -3764, + -3202, + -2637, + -2076, + -1526, + -997, + -495, + -27, + 398, + 778, + 1106, + 1377, + 1588, + 1738, + 1824, + 1847, + 1807, + 1708, + 1551, + 1342, + 1085, + 787, + 455, + 95, + -283, + -671, + -1061, + -1444, + -1810, + -2150, + -2457, + -2722, + -2938, + -3098, + -3196, + -3227, + -3188, + -3076, + -2889, + -2626, + -2290, + -1881, + -1404, + -862, + -260, + 392, + 1092, + 1828, + 2593, + 3377, + 4170, + 4964, + 5747, + 6510, + 7243, + 7938, + 8584, + 9176, + 9705, + 10164, + 10550, + 10856, + 11081, + 11222, + 11278, + 11250, + 11139, + 10948, + 10680, + 10341, + 9935, + 9468, + 8949, + 8384, + 7782, + 7150, + 6498, + 5833, + 5163, + 4498, + 3844, + 3208, + 2598, + 2018, + 1474, + 970, + 510, + 94, + -273, + -593, + -867, + -1095, + -1278, + -1421, + -1527, + -1599, + -1642, + -1660, + -1660, + -1645, + -1620, + -1592, + -1564, + -1541, + -1526, + -1523, + -1535, + -1563, + -1609, + -1673, + -1755, + -1854, + -1969, + -2095, + -2231, + -2373, + -2515, + -2654, + -2784, + -2899, + -2995, + -3066, + -3106, + -3110, + -3074, + -2993, + -2863, + -2682, + -2448, + -2158, + -1814, + -1413, + -960, + -455, + 97, + 694, + 1329, + 1996, + 2690, + 3402, + 4125, + 4850, + 5570, + 6274, + 6955, + 7603, + 8211, + 8771, + 9275, + 9716, + 10088, + 10388, + 10609, + 10750, + 10809, + 10784, + 10677, + 10489, + 10222, + 9881, + 9471, + 8997, + 8467, + 7888, + 7269, + 6619, + 5947, + 5262, + 4574, + 3894, + 3229, + 2591, + 1986, + 1424, + 911, + 454, + 58, + -272, + -534, + -725, + -845, + -894, + -873, + -785, + -634, + -424, + -163, + 144, + 490, + 866, + 1265, + 1676, + 2092, + 2504, + 2902, + 3279, + 3625, + 3934, + 4199, + 4413, + 4572, + 4671, + 4707, + 4677, + 4582, + 4421, + 4195, + 3906, + 3558, + 3156, + 2703, + 2206, + 1672, + 1108, + 521, + -80, + -689, + -1298, + -1897, + -2481, + -3041, + -3570, + -4064, + -4516, + -4922, + -5279, + -5583, + -5832, + -6027, + -6166, + -6252, + -6285, + -6269, + -6207, + -6103, + -5963, + -5792, + -5595, + -5378, + -5148, + -4910, + -4671, + -4436, + -4212, + -4002, + -3812, + -3645, + -3504, + -3392, + -3311, + -3261, + -3242, + -3253, + -3293, + -3359, + -3447, + -3555, + -3678, + -3810, + -3948, + -4085, + -4215, + -4334, + -4437, + -4517, + -4570, + -4592, + -4579, + -4529, + -4438, + -4305, + -4130, + -3913, + -3655, + -3358, + -3026, + -2661, + -2269, + -1854, + -1424, + -984, + -542, + -105, + 319, + 723, + 1100, + 1442, + 1743, + 1995, + 2192, + 2330, + 2405, + 2412, + 2350, + 2217, + 2013, + 1739, + 1397, + 990, + 523, + 0, + -570, + -1183, + -1830, + -2501, + -3188, + -3881, + -4570, + -5245, + -5895, + -6512, + -7085, + -7606, + -8066, + -8458, + -8775, + -9012, + -9163, + -9226, + -9199, + -9080, + -8869, + -8570, + -8184, + -7715, + -7169, + -6551, + -5870, + -5133, + -4349, + -3526, + -2676, + -1808, + -932, + -58, + 803, + 1644, + 2453, + 3223, + 3946, + 4615, + 5223, + 5767, + 6242, + 6645, + 6974, + 7229, + 7410, + 7519, + 7559, + 7533, + 7445, + 7301, + 7107, + 6868, + 6592, + 6286, + 5956, + 5610, + 5255, + 4898, + 4545, + 4202, + 3874, + 3565, + 3281, + 3023, + 2793, + 2594, + 2425, + 2286, + 2176, + 2092, + 2032, + 1993, + 1969, + 1957, + 1951, + 1947, + 1939, + 1922, + 1890, + 1839, + 1764, + 1660, + 1525, + 1354, + 1146, + 899, + 612, + 286, + -78, + -480, + -916, + -1383, + -1877, + -2393, + -2925, + -3467, + -4014, + -4559, + -5095, + -5615, + -6113, + -6583, + -7017, + -7411, + -7760, + -8059, + -8305, + -8495, + -8626, + -8699, + -8713, + -8669, + -8569, + -8416, + -8215, + -7968, + -7683, + -7364, + -7020, + -6656, + -6280, + -5901, + -5525, + -5160, + -4813, + -4493, + -4204, + -3954, + -3747, + -3587, + -3479, + -3424, + -3425, + -3481, + -3592, + -3756, + -3970, + -4230, + -4531, + -4868, + -5233, + -5619, + -6019, + -6423, + -6823, + -7210, + -7576, + -7910, + -8205, + -8453, + -8645, + -8775, + -8837, + -8825, + -8736, + -8566, + -8314, + -7978, + -7560, + -7061, + -6484, + -5833, + -5114, + -4332, + -3495, + -2611, + -1689, + -738, + 231, + 1210, + 2188, + 3155, + 4100, + 5015, + 5889, + 6715, + 7484, + 8189, + 8824, + 9385, + 9867, + 10268, + 10586, + 10820, + 10971, + 11040, + 11032, + 10949, + 10797, + 10582, + 10308, + 9985, + 9619, + 9218, + 8789, + 8342, + 7885, + 7424, + 6968, + 6523, + 6097, + 5694, + 5320, + 4980, + 4676, + 4411, + 4186, + 4003, + 3861, + 3758, + 3694, + 3664, + 3667, + 3697, + 3751, + 3824, + 3910, + 4005, + 4103, + 4199, + 4289, + 4368, + 4431, + 4476, + 4499, + 4498, + 4472, + 4419, + 4341, + 4236, + 4108, + 3958, + 3790, + 3607, + 3414, + 3215, + 3015, + 2820, + 2636, + 2468, + 2322, + 2203, + 2116, + 2066, + 2058, + 2093, + 2177, + 2309, + 2492, + 2726, + 3009, + 3340, + 3717, + 4136, + 4592, + 5079, + 5593, + 6125, + 6669, + 7217, + 7761, + 8291, + 8801, + 9280, + 9722, + 10119, + 10462, + 10746, + 10964, + 11111, + 11183, + 11178, + 11092, + 10925, + 10677, + 10350, + 9946, + 9469, + 8924, + 8316, + 7652, + 6941, + 6190, + 5408, + 4605, + 3790, + 2973, + 2164, + 1373, + 609, + -117, + -801, + -1432, + -2004, + -2512, + -2950, + -3314, + -3603, + -3815, + -3949, + -4007, + -3991, + -3904, + -3751, + -3537, + -3270, + -2954, + -2600, + -2215, + -1807, + -1386, + -961, + -541, + -134, + 250, + 605, + 922, + 1196, + 1421, + 1591, + 1702, + 1753, + 1742, + 1667, + 1530, + 1331, + 1075, + 763, + 402, + -4, + -449, + -926, + -1429, + -1949, + -2480, + -3012, + -3540, + -4054, + -4549, + -5018, + -5454, + -5853, + -6209, + -6520, + -6781, + -6992, + -7150, + -7257, + -7313, + -7320, + -7280, + -7197, + -7076, + -6921, + -6737, + -6530, + -6306, + -6072, + -5834, + -5599, + -5371, + -5157, + -4963, + -4793, + -4652, + -4542, + -4468, + -4430, + -4429, + -4468, + -4544, + -4656, + -4802, + -4980, + -5186, + -5415, + -5664, + -5926, + -6197, + -6470, + -6742, + -7005, + -7254, + -7485, + -7693, + -7874, + -8024, + -8140, + -8221, + -8265, + -8272, + -8243, + -8178, + -8081, + -7955, + -7803, + -7631, + -7444, + -7249, + -7051, + -6857, + -6675, + -6513, + -6377, + -6274, + -6211, + -6195, + -6231, + -6325, + -6481, + -6701, + -6990, + -7347, + -7774, + -8269, + -8831, + -9456, + -10141, + -10879, + -11665, + -12491, + -13350, + -14232, + -15127, + -16028, + -16922, + -17799, + -18650, + -19464, + -20231, + -20942, + -21587, + -22159, + -22650, + -23055, + -23367, + -23582, + -23699, + -23714, + -23629, + -23443, + -23159, + -22780, + -22312, + -21759, + -21128, + -20427, + -19665, + -18850, + -17992, + -17100, + -16185, + -15258, + -14327, + -13403, + -12494, + -11611, + -10761, + -9950, + -9187, + -8476, + -7822, + -7228, + -6696, + -6228, + -5824, + -5482, + -5202, + -4979, + -4810, + -4690, + -4615, + -4577, + -4571, + -4591, + -4628, + -4677, + -4731, + -4783, + -4826, + -4856, + -4867, + -4855, + -4815, + -4745, + -4643, + -4507, + -4338, + -4135, + -3900, + -3635, + -3344, + -3030, + -2697, + -2350, + -1994, + -1635, + -1278, + -930, + -596, + -281, + 7, + 268, + 494, + 683, + 831, + 936, + 996, + 1012, + 983, + 910, + 795, + 641, + 451, + 230, + -17, + -285, + -570, + -863, + -1159, + -1452, + -1734, + -2000, + -2244, + -2460, + -2643, + -2789, + -2894, + -2954, + -2969, + -2936, + -2856, + -2728, + -2556, + -2341, + -2088, + -1799, + -1482, + -1140, + -782, + -413, + -41, + 325, + 680, + 1015, + 1323, + 1597, + 1830, + 2016, + 2150, + 2227, + 2244, + 2198, + 2086, + 1909, + 1668, + 1363, + 998, + 576, + 102, + -416, + -975, + -1566, + -2181, + -2810, + -3446, + -4079, + -4699, + -5297, + -5864, + -6391, + -6871, + -7295, + -7657, + -7950, + -8170, + -8312, + -8375, + -8356, + -8255, + -8073, + -7812, + -7475, + -7067, + -6593, + -6060, + -5474, + -4844, + -4179, + -3488, + -2781, + -2067, + -1356, + -657, + 17, + 662, + 1266, + 1823, + 2325, + 2766, + 3141, + 3445, + 3677, + 3833, + 3914, + 3919, + 3851, + 3711, + 3505, + 3236, + 2909, + 2533, + 2112, + 1655, + 1169, + 663, + 145, + -376, + -894, + -1401, + -1889, + -2351, + -2781, + -3175, + -3527, + -3833, + -4092, + -4300, + -4458, + -4564, + -4621, + -4630, + -4592, + -4512, + -4394, + -4242, + -4060, + -3854, + -3629, + -3390, + -3143, + -2894, + -2646, + -2405, + -2174, + -1957, + -1757, + -1576, + -1415, + -1275, + -1155, + -1056, + -974, + -908, + -854, + -808, + -767, + -726, + -679, + -622, + -549, + -454, + -333, + -181, + 6, + 234, + 506, + 824, + 1189, + 1605, + 2069, + 2582, + 3143, + 3748, + 4394, + 5077, + 5791, + 6531, + 7289, + 8058, + 8830, + 9597, + 10351, + 11082, + 11783, + 12444, + 13057, + 13616, + 14112, + 14540, + 14893, + 15168, + 15359, + 15466, + 15486, + 15419, + 15266, + 15029, + 14711, + 14318, + 13853, + 13324, + 12737, + 12102, + 11426, + 10720, + 9992, + 9252, + 8511, + 7779, + 7064, + 6377, + 5726, + 5120, + 4564, + 4067, + 3633, + 3267, + 2971, + 2749, + 2600, + 2525, + 2521, + 2586, + 2717, + 2908, + 3154, + 3448, + 3782, + 4149, + 4541, + 4948, + 5363, + 5775, + 6177, + 6561, + 6918, + 7241, + 7523, + 7759, + 7944, + 8074, + 8145, + 8156, + 8107, + 7997, + 7828, + 7603, + 7324, + 6997, + 6626, + 6218, + 5779, + 5316, + 4836, + 4348, + 3860, + 3378, + 2912, + 2467, + 2051, + 1671, + 1332, + 1039, + 797, + 608, + 475, + 399, + 381, + 421, + 516, + 665, + 865, + 1111, + 1398, + 1723, + 2078, + 2458, + 2856, + 3267, + 3683, + 4099, + 4508, + 4905, + 5285, + 5642, + 5973, + 6275, + 6545, + 6781, + 6983, + 7151, + 7284, + 7386, + 7458, + 7503, + 7525, + 7528, + 7517, + 7497, + 7472, + 7449, + 7433, + 7428, + 7440, + 7473, + 7531, + 7617, + 7735, + 7886, + 8071, + 8292, + 8546, + 8834, + 9152, + 9497, + 9866, + 10253, + 10653, + 11059, + 11466, + 11866, + 12251, + 12614, + 12947, + 13244, + 13496, + 13698, + 13842, + 13924, + 13937, + 13879, + 13746, + 13537, + 13249, + 12884, + 12443, + 11928, + 11343, + 10693, + 9984, + 9221, + 8414, + 7570, + 6699, + 5810, + 4913, + 4018, + 3137, + 2278, + 1453, + 671, + -58, + -728, + -1329, + -1855, + -2300, + -2660, + -2931, + -3110, + -3197, + -3192, + -3096, + -2913, + -2646, + -2300, + -1881, + -1396, + -854, + -263, + 368, + 1030, + 1714, + 2408, + 3104, + 3792, + 4463, + 5107, + 5717, + 6286, + 6807, + 7274, + 7683, + 8030, + 8313, + 8531, + 8684, + 8772, + 8798, + 8764, + 8674, + 8533, + 8347, + 8121, + 7862, + 7577, + 7273, + 6958, + 6637, + 6320, + 6011, + 5717, + 5445, + 5199, + 4983, + 4802, + 4657, + 4551, + 4485, + 4459, + 4472, + 4522, + 4607, + 4724, + 4869, + 5038, + 5225, + 5425, + 5633, + 5844, + 6051, + 6250, + 6434, + 6600, + 6742, + 6857, + 6941, + 6992, + 7008, + 6989, + 6933, + 6842, + 6717, + 6561, + 6377, + 6168, + 5940, + 5697, + 5444, + 5189, + 4936, + 4692, + 4464, + 4257, + 4077, + 3931, + 3823, + 3757, + 3737, + 3767, + 3848, + 3981, + 4168, + 4407, + 4697, + 5035, + 5417, + 5840, + 6298, + 6785, + 7294, + 7819, + 8352, + 8885, + 9411, + 9920, + 10406, + 10860, + 11276, + 11646, + 11966, + 12228, + 12430, + 12568, + 12638, + 12640, + 12574, + 12439, + 12239, + 11976, + 11655, + 11279, + 10856, + 10392, + 9895, + 9373, + 8834, + 8287, + 7741, + 7205, + 6689, + 6200, + 5748, + 5339, + 4980, + 4678, + 4438, + 4264, + 4159, + 4125, + 4163, + 4271, + 4449, + 4693, + 5000, + 5363, + 5778, + 6237, + 6732, + 7255, + 7796, + 8346, + 8896, + 9435, + 9955, + 10444, + 10895, + 11299, + 11646, + 11932, + 12148, + 12289, + 12352, + 12333, + 12229, + 12040, + 11766, + 11409, + 10971, + 10455, + 9867, + 9211, + 8494, + 7723, + 6905, + 6050, + 5164, + 4256, + 3336, + 2411, + 1490, + 580, + -310, + -1175, + -2009, + -2806, + -3562, + -4272, + -4935, + -5549, + -6113, + -6626, + -7091, + -7509, + -7882, + -8213, + -8507, + -8767, + -8999, + -9207, + -9396, + -9571, + -9737, + -9898, + -10060, + -10225, + -10397, + -10579, + -10773, + -10980, + -11201, + -11435, + -11682, + -11939, + -12205, + -12476, + -12749, + -13018, + -13280, + -13529, + -13760, + -13967, + -14144, + -14287, + -14390, + -14448, + -14457, + -14413, + -14313, + -14154, + -13935, + -13656, + -13315, + -12916, + -12459, + -11949, + -11388, + -10782, + -10138, + -9461, + -8758, + -8038, + -7309, + -6579, + -5857, + -5151, + -4471, + -3825, + -3221, + -2667, + -2168, + -1733, + -1365, + -1069, + -849, + -706, + -641, + -655, + -746, + -912, + -1149, + -1451, + -1815, + -2231, + -2695, + -3196, + -3727, + -4278, + -4840, + -5402, + -5957, + -6493, + -7002, + -7476, + -7906, + -8285, + -8606, + -8865, + -9056, + -9177, + -9224, + -9198, + -9099, + -8927, + -8686, + -8379, + -8011, + -7587, + -7115, + -6601, + -6054, + -5482, + -4894, + -4298, + -3704, + -3122, + -2558, + -2023, + -1523, + -1066, + -658, + -304, + -9, + 222, + 389, + 490, + 524, + 493, + 398, + 243, + 31, + -232, + -543, + -893, + -1276, + -1684, + -2111, + -2548, + -2987, + -3420, + -3841, + -4241, + -4615, + -4955, + -5257, + -5516, + -5728, + -5890, + -6001, + -6059, + -6065, + -6018, + -5922, + -5779, + -5592, + -5365, + -5103, + -4812, + -4497, + -4165, + -3820, + -3470, + -3121, + -2778, + -2448, + -2134, + -1843, + -1577, + -1341, + -1136, + -965, + -829, + -727, + -659, + -623, + -617, + -639, + -683, + -747, + -825, + -913, + -1004, + -1094, + -1177, + -1247, + -1300, + -1330, + -1333, + -1305, + -1243, + -1144, + -1008, + -832, + -617, + -364, + -74, + 248, + 600, + 978, + 1377, + 1789, + 2210, + 2632, + 3048, + 3450, + 3830, + 4183, + 4499, + 4772, + 4996, + 5164, + 5272, + 5314, + 5288, + 5191, + 5021, + 4778, + 4463, + 4077, + 3624, + 3109, + 2535, + 1910, + 1240, + 534, + -199, + -952, + -1714, + -2474, + -3224, + -3952, + -4649, + -5305, + -5911, + -6459, + -6940, + -7348, + -7677, + -7922, + -8080, + -8147, + -8123, + -8008, + -7802, + -7509, + -7133, + -6678, + -6150, + -5556, + -4905, + -4204, + -3462, + -2690, + -1897, + -1093, + -289, + 505, + 1281, + 2028, + 2740, + 3406, + 4021, + 4578, + 5072, + 5499, + 5856, + 6141, + 6353, + 6493, + 6562, + 6562, + 6496, + 6370, + 6188, + 5956, + 5680, + 5367, + 5024, + 4657, + 4275, + 3884, + 3491, + 3103, + 2725, + 2363, + 2021, + 1704, + 1415, + 1156, + 928, + 733, + 569, + 436, + 332, + 253, + 197, + 160, + 136, + 122, + 111, + 99, + 81, + 50, + 2, + -67, + -162, + -289, + -448, + -643, + -876, + -1147, + -1457, + -1805, + -2190, + -2608, + -3057, + -3533, + -4031, + -4546, + -5072, + -5603, + -6133, + -6655, + -7162, + -7648, + -8106, + -8530, + -8915, + -9256, + -9547, + -9786, + -9970, + -10096, + -10163, + -10172, + -10123, + -10018, + -9861, + -9653, + -9401, + -9110, + -8785, + -8434, + -8062, + -7679, + -7291, + -6906, + -6532, + -6176, + -5846, + -5548, + -5288, + -5073, + -4906, + -4791, + -4731, + -4728, + -4781, + -4892, + -5058, + -5277, + -5545, + -5856, + -6207, + -6589, + -6996, + -7421, + -7854, + -8287, + -8711, + -9117, + -9497, + -9841, + -10141, + -10390, + -10581, + -10707, + -10764, + -10746, + -10650, + -10475, + -10219, + -9883, + -9468, + -8977, + -8414, + -7783, + -7092, + -6347, + -5556, + -4727, + -3870, + -2995, + -2111, + -1228, + -357, + 490, + 1308, + 2084, + 2811, + 3481, + 4086, + 4620, + 5078, + 5456, + 5750, + 5960, + 6084, + 6122, + 6078, + 5952, + 5750, + 5475, + 5134, + 4732, + 4277, + 3776, + 3238, + 2669, + 2079, + 1475, + 865, + 258, + -340, + -922, + -1482, + -2015, + -2517, + -2983, + -3411, + -3798, + -4145, + -4451, + -4717, + -4945, + -5136, + -5295, + -5425, + -5530, + -5615, + -5684, + -5744, + -5798, + -5851, + -5910, + -5977, + -6058, + -6155, + -6272, + -6411, + -6574, + -6761, + -6972, + -7207, + -7465, + -7741, + -8035, + -8342, + -8658, + -8977, + -9296, + -9608, + -9907, + -10189, + -10446, + -10674, + -10868, + -11022, + -11132, + -11194, + -11206, + -11165, + -11070, + -10920, + -10716, + -10459, + -10152, + -9798, + -9402, + -8968, + -8502, + -8012, + -7503, + -6984, + -6464, + -5949, + -5449, + -4972, + -4526, + -4119, + -3759, + -3451, + -3203, + -3019, + -2904, + -2861, + -2892, + -2999, + -3181, + -3437, + -3765, + -4162, + -4622, + -5140, + -5709, + -6322, + -6971, + -7647, + -8340, + -9042, + -9741, + -10429, + -11095, + -11730, + -12325, + -12872, + -13362, + -13789, + -14147, + -14430, + -14636, + -14761, + -14803, + -14762, + -14639, + -14437, + -14158, + -13807, + -13389, + -12910, + -12378, + -11800, + -11184, + -10540, + -9876, + -9201, + -8525, + -7857, + -7204, + -6576, + -5979, + -5421, + -4907, + -4443, + -4033, + -3680, + -3385, + -3150, + -2975, + -2858, + -2797, + -2788, + -2828, + -2911, + -3031, + -3183, + -3359, + -3551, + -3754, + -3958, + -4157, + -4343, + -4509, + -4648, + -4755, + -4825, + -4852, + -4833, + -4764, + -4645, + -4473, + -4250, + -3974, + -3650, + -3278, + -2864, + -2409, + -1921, + -1404, + -863, + -306, + 261, + 832, + 1402, + 1962, + 2508, + 3034, + 3534, + 4005, + 4442, + 4842, + 5203, + 5524, + 5804, + 6043, + 6242, + 6403, + 6528, + 6622, + 6688, + 6730, + 6753, + 6762, + 6764, + 6763, + 6764, + 6774, + 6796, + 6837, + 6899, + 6986, + 7102, + 7248, + 7425, + 7634, + 7875, + 8145, + 8443, + 8766, + 9110, + 9469, + 9839, + 10213, + 10584, + 10947, + 11293, + 11616, + 11908, + 12162, + 12370, + 12528, + 12627, + 12664, + 12634, + 12533, + 12358, + 12108, + 11783, + 11382, + 10908, + 10363, + 9752, + 9080, + 8352, + 7577, + 6761, + 5913, + 5043, + 4161, + 3277, + 2400, + 1543, + 714, + -76, + -817, + -1501, + -2119, + -2664, + -3129, + -3508, + -3798, + -3994, + -4096, + -4102, + -4012, + -3830, + -3558, + -3199, + -2761, + -2248, + -1669, + -1031, + -344, + 383, + 1141, + 1920, + 2710, + 3500, + 4281, + 5044, + 5780, + 6480, + 7138, + 7746, + 8300, + 8794, + 9225, + 9591, + 9890, + 10122, + 10289, + 10391, + 10433, + 10417, + 10348, + 10232, + 10075, + 9882, + 9662, + 9420, + 9163, + 8899, + 8635, + 8376, + 8128, + 7898, + 7689, + 7506, + 7352, + 7230, + 7140, + 7085, + 7062, + 7072, + 7113, + 7181, + 7273, + 7385, + 7513, + 7652, + 7795, + 7939, + 8076, + 8201, + 8310, + 8396, + 8454, + 8482, + 8474, + 8428, + 8341, + 8212, + 8040, + 7826, + 7569, + 7273, + 6940, + 6573, + 6176, + 5754, + 5313, + 4858, + 4396, + 3932, + 3475, + 3029, + 2601, + 2198, + 1825, + 1487, + 1190, + 936, + 729, + 572, + 465, + 410, + 405, + 450, + 541, + 676, + 851, + 1059, + 1296, + 1556, + 1831, + 2115, + 2399, + 2676, + 2939, + 3180, + 3392, + 3569, + 3703, + 3790, + 3825, + 3804, + 3724, + 3583, + 3381, + 3117, + 2793, + 2411, + 1976, + 1491, + 963, + 398, + -197, + -814, + -1446, + -2081, + -2713, + -3330, + -3925, + -4487, + -5009, + -5481, + -5896, + -6248, + -6529, + -6736, + -6863, + -6909, + -6871, + -6749, + -6543, + -6256, + -5890, + -5450, + -4941, + -4369, + -3742, + -3068, + -2356, + -1614, + -853, + -81, + 689, + 1450, + 2191, + 2904, + 3579, + 4208, + 4785, + 5302, + 5754, + 6137, + 6447, + 6683, + 6842, + 6926, + 6936, + 6874, + 6743, + 6549, + 6295, + 5989, + 5636, + 5245, + 4823, + 4378, + 3918, + 3450, + 2984, + 2527, + 2085, + 1667, + 1277, + 922, + 605, + 332, + 104, + -76, + -208, + -290, + -325, + -314, + -258, + -162, + -29, + 136, + 329, + 546, + 779, + 1025, + 1276, + 1529, + 1778, + 2019, + 2247, + 2459, + 2651, + 2822, + 2970, + 3094, + 3195, + 3272, + 3328, + 3364, + 3385, + 3393, + 3392, + 3388, + 3385, + 3389, + 3404, + 3436, + 3491, + 3573, + 3687, + 3837, + 4026, + 4258, + 4535, + 4858, + 5228, + 5644, + 6104, + 6607, + 7149, + 7725, + 8331, + 8961, + 9608, + 10266, + 10925, + 11579, + 12218, + 12834, + 13418, + 13963, + 14459, + 14900, + 15278, + 15586, + 15819, + 15971, + 16040, + 16023, + 15917, + 15723, + 15441, + 15073, + 14622, + 14092, + 13490, + 12820, + 12091, + 11309, + 10485, + 9627, + 8745, + 7849, + 6949, + 6055, + 5177, + 4324, + 3504, + 2728, + 2001, + 1332, + 724, + 184, + -285, + -682, + -1005, + -1254, + -1430, + -1535, + -1574, + -1551, + -1471, + -1340, + -1167, + -957, + -721, + -466, + -200, + 66, + 325, + 569, + 790, + 979, + 1132, + 1240, + 1301, + 1308, + 1260, + 1155, + 991, + 768, + 488, + 154, + -231, + -664, + -1140, + -1651, + -2193, + -2757, + -3336, + -3922, + -4508, + -5086, + -5648, + -6186, + -6694, + -7165, + -7593, + -7973, + -8300, + -8571, + -8784, + -8937, + -9029, + -9060, + -9032, + -8947, + -8808, + -8619, + -8384, + -8108, + -7797, + -7458, + -7095, + -6717, + -6328, + -5936, + -5546, + -5165, + -4798, + -4449, + -4122, + -3822, + -3550, + -3309, + -3100, + -2923, + -2777, + -2662, + -2574, + -2511, + -2469, + -2445, + -2434, + -2431, + -2431, + -2428, + -2418, + -2395, + -2355, + -2293, + -2204, + -2086, + -1936, + -1751, + -1530, + -1272, + -979, + -652, + -292, + 96, + 511, + 945, + 1395, + 1854, + 2314, + 2770, + 3214, + 3637, + 4033, + 4394, + 4713, + 4982, + 5196, + 5347, + 5432, + 5446, + 5386, + 5249, + 5034, + 4741, + 4371, + 3926, + 3410, + 2827, + 2183, + 1484, + 737, + -47, + -863, + -1700, + -2548, + -3396, + -4235, + -5053, + -5842, + -6591, + -7291, + -7934, + -8511, + -9016, + -9443, + -9787, + -10044, + -10212, + -10289, + -10276, + -10174, + -9985, + -9714, + -9365, + -8943, + -8457, + -7914, + -7321, + -6689, + -6026, + -5342, + -4647, + -3951, + -3264, + -2594, + -1951, + -1343, + -777, + -260, + 201, + 604, + 943, + 1217, + 1424, + 1562, + 1634, + 1641, + 1585, + 1471, + 1303, + 1086, + 827, + 531, + 206, + -141, + -503, + -873, + -1244, + -1609, + -1961, + -2295, + -2605, + -2886, + -3136, + -3351, + -3528, + -3667, + -3767, + -3829, + -3855, + -3845, + -3805, + -3736, + -3643, + -3532, + -3406, + -3273, + -3136, + -3001, + -2875, + -2762, + -2667, + -2594, + -2548, + -2532, + -2548, + -2599, + -2684, + -2805, + -2961, + -3151, + -3371, + -3620, + -3892, + -4184, + -4491, + -4807, + -5126, + -5442, + -5748, + -6039, + -6307, + -6547, + -6754, + -6921, + -7045, + -7120, + -7145, + -7116, + -7032, + -6893, + -6698, + -6450, + -6150, + -5801, + -5408, + -4977, + -4511, + -4018, + -3505, + -2980, + -2449, + -1921, + -1403, + -904, + -431, + 8, + 407, + 761, + 1063, + 1308, + 1494, + 1618, + 1678, + 1673, + 1605, + 1475, + 1286, + 1041, + 746, + 407, + 30, + -376, + -805, + -1249, + -1697, + -2141, + -2572, + -2981, + -3359, + -3699, + -3991, + -4229, + -4407, + -4520, + -4562, + -4532, + -4426, + -4244, + -3987, + -3655, + -3251, + -2780, + -2245, + -1654, + -1014, + -330, + 385, + 1127, + 1883, + 2645, + 3403, + 4147, + 4867, + 5554, + 6198, + 6793, + 7330, + 7803, + 8205, + 8534, + 8784, + 8953, + 9040, + 9046, + 8971, + 8817, + 8587, + 8287, + 7921, + 7494, + 7015, + 6490, + 5928, + 5335, + 4722, + 4095, + 3464, + 2837, + 2221, + 1624, + 1053, + 513, + 10, + -451, + -867, + -1236, + -1555, + -1824, + -2043, + -2212, + -2334, + -2411, + -2446, + -2443, + -2407, + -2342, + -2252, + -2144, + -2022, + -1891, + -1757, + -1623, + -1493, + -1372, + -1263, + -1167, + -1086, + -1021, + -972, + -939, + -920, + -912, + -914, + -921, + -929, + -933, + -930, + -913, + -877, + -817, + -727, + -602, + -438, + -229, + 26, + 333, + 693, + 1109, + 1581, + 2108, + 2689, + 3323, + 4007, + 4736, + 5505, + 6310, + 7142, + 7996, + 8863, + 9735, + 10603, + 11459, + 12295, + 13100, + 13867, + 14587, + 15253, + 15858, + 16395, + 16858, + 17244, + 17549, + 17770, + 17905, + 17956, + 17923, + 17808, + 17614, + 17347, + 17011, + 16614, + 16162, + 15663, + 15127, + 14562, + 13978, + 13384, + 12791, + 12206, + 11641, + 11103, + 10600, + 10141, + 9732, + 9378, + 9084, + 8854, + 8691, + 8594, + 8566, + 8604, + 8706, + 8869, + 9088, + 9358, + 9672, + 10023, + 10405, + 10807, + 11222, + 11640, + 12054, + 12453, + 12829, + 13175, + 13481, + 13741, + 13949, + 14099, + 14187, + 14208, + 14160, + 14043, + 13855, + 13597, + 13272, + 12882, + 12431, + 11924, + 11366, + 10764, + 10125, + 9456, + 8765, + 8060, + 7348, + 6639, + 5939, + 5256, + 4596, + 3967, + 3374, + 2822, + 2315, + 1855, + 1447, + 1090, + 784, + 531, + 327, + 171, + 60, + -10, + -45, + -49, + -28, + 12, + 67, + 129, + 193, + 253, + 303, + 338, + 353, + 345, + 310, + 246, + 151, + 23, + -136, + -328, + -550, + -800, + -1074, + -1370, + -1683, + -2009, + -2341, + -2675, + -3006, + -3326, + -3632, + -3918, + -4178, + -4408, + -4604, + -4762, + -4881, + -4957, + -4990, + -4979, + -4926, + -4831, + -4698, + -4530, + -4331, + -4105, + -3860, + -3600, + -3333, + -3066, + -2807, + -2562, + -2339, + -2146, + -1989, + -1876, + -1812, + -1802, + -1852, + -1965, + -2143, + -2389, + -2702, + -3083, + -3530, + -4039, + -4608, + -5230, + -5900, + -6611, + -7355, + -8124, + -8908, + -9699, + -10485, + -11257, + -12006, + -12720, + -13390, + -14008, + -14564, + -15051, + -15461, + -15789, + -16029, + -16178, + -16233, + -16192, + -16056, + -15826, + -15503, + -15092, + -14597, + -14025, + -13382, + -12675, + -11914, + -11107, + -10264, + -9395, + -8510, + -7620, + -6734, + -5862, + -5013, + -4197, + -3421, + -2693, + -2020, + -1406, + -856, + -373, + 38, + 380, + 652, + 853, + 987, + 1057, + 1066, + 1020, + 923, + 783, + 605, + 396, + 164, + -84, + -342, + -603, + -860, + -1108, + -1340, + -1553, + -1741, + -1903, + -2035, + -2136, + -2205, + -2243, + -2250, + -2229, + -2182, + -2112, + -2024, + -1922, + -1811, + -1696, + -1582, + -1476, + -1381, + -1305, + -1250, + -1223, + -1226, + -1264, + -1339, + -1454, + -1608, + -1803, + -2038, + -2312, + -2622, + -2966, + -3340, + -3739, + -4158, + -4592, + -5034, + -5479, + -5919, + -6348, + -6760, + -7148, + -7505, + -7827, + -8108, + -8343, + -8528, + -8661, + -8740, + -8763, + -8729, + -8641, + -8498, + -8304, + -8063, + -7778, + -7456, + -7101, + -6721, + -6322, + -5911, + -5497, + -5087, + -4689, + -4311, + -3958, + -3639, + -3360, + -3125, + -2941, + -2810, + -2736, + -2720, + -2763, + -2866, + -3026, + -3241, + -3508, + -3822, + -4177, + -4568, + -4986, + -5425, + -5875, + -6329, + -6777, + -7210, + -7620, + -7997, + -8333, + -8621, + -8852, + -9021, + -9122, + -9150, + -9102, + -8976, + -8769, + -8483, + -8118, + -7677, + -7163, + -6581, + -5937, + -5238, + -4491, + -3705, + -2889, + -2053, + -1205, + -357, + 480, + 1299, + 2089, + 2840, + 3544, + 4193, + 4779, + 5296, + 5739, + 6103, + 6386, + 6584, + 6698, + 6728, + 6675, + 6542, + 6332, + 6050, + 5702, + 5293, + 4831, + 4323, + 3778, + 3202, + 2604, + 1993, + 1377, + 762, + 157, + -430, + -996, + -1534, + -2039, + -2508, + -2937, + -3324, + -3669, + -3971, + -4231, + -4450, + -4631, + -4776, + -4890, + -4976, + -5039, + -5084, + -5116, + -5140, + -5161, + -5183, + -5212, + -5252, + -5305, + -5376, + -5467, + -5580, + -5715, + -5873, + -6053, + -6254, + -6474, + -6710, + -6958, + -7214, + -7474, + -7732, + -7984, + -8223, + -8444, + -8641, + -8808, + -8941, + -9035, + -9084, + -9085, + -9036, + -8933, + -8776, + -8563, + -8296, + -7975, + -7602, + -7182, + -6718, + -6215, + -5679, + -5117, + -4535, + -3942, + -3345, + -2753, + -2174, + -1616, + -1089, + -600, + -156, + 234, + 567, + 835, + 1034, + 1160, + 1212, + 1187, + 1086, + 908, + 657, + 335, + -52, + -500, + -1003, + -1554, + -2143, + -2763, + -3405, + -4058, + -4714, + -5362, + -5992, + -6596, + -7164, + -7688, + -8159, + -8571, + -8918, + -9193, + -9395, + -9518, + -9562, + -9527, + -9412, + -9220, + -8954, + -8617, + -8216, + -7756, + -7244, + -6688, + -6097, + -5478, + -4841, + -4195, + -3549, + -2913, + -2294, + -1701, + -1143, + -625, + -154, + 264, + 626, + 928, + 1168, + 1345, + 1458, + 1510, + 1501, + 1436, + 1318, + 1151, + 943, + 699, + 425, + 130, + -178, + -495, + -811, + -1119, + -1411, + -1682, + -1924, + -2133, + -2304, + -2432, + -2514, + -2549, + -2534, + -2470, + -2358, + -2198, + -1993, + -1747, + -1463, + -1147, + -802, + -436, + -54, + 337, + 732, + 1123, + 1506, + 1873, + 2219, + 2540, + 2829, + 3085, + 3303, + 3481, + 3617, + 3712, + 3764, + 3776, + 3748, + 3684, + 3587, + 3460, + 3309, + 3137, + 2951, + 2755, + 2556, + 2359, + 2169, + 1992, + 1831, + 1693, + 1580, + 1496, + 1442, + 1421, + 1433, + 1477, + 1554, + 1660, + 1794, + 1950, + 2125, + 2314, + 2510, + 2707, + 2899, + 3079, + 3239, + 3372, + 3471, + 3529, + 3540, + 3497, + 3396, + 3232, + 3000, + 2699, + 2326, + 1881, + 1365, + 778, + 124, + -592, + -1368, + -2197, + -3071, + -3983, + -4924, + -5884, + -6855, + -7825, + -8785, + -9724, + -10632, + -11498, + -12313, + -13067, + -13752, + -14360, + -14885, + -15320, + -15662, + -15906, + -16050, + -16093, + -16037, + -15881, + -15630, + -15287, + -14857, + -14347, + -13764, + -13115, + -12410, + -11658, + -10868, + -10051, + -9215, + -8373, + -7532, + -6703, + -5894, + -5114, + -4371, + -3671, + -3020, + -2423, + -1883, + -1404, + -987, + -632, + -339, + -105, + 70, + 192, + 264, + 293, + 283, + 240, + 172, + 85, + -13, + -117, + -219, + -314, + -395, + -456, + -494, + -503, + -481, + -424, + -333, + -204, + -40, + 158, + 391, + 654, + 944, + 1257, + 1589, + 1934, + 2287, + 2643, + 2994, + 3337, + 3665, + 3972, + 4254, + 4506, + 4725, + 4906, + 5047, + 5147, + 5205, + 5219, + 5191, + 5123, + 5017, + 4876, + 4704, + 4505, + 4285, + 4049, + 3803, + 3554, + 3307, + 3070, + 2849, + 2648, + 2476, + 2335, + 2232, + 2170, + 2152, + 2180, + 2257, + 2382, + 2556, + 2776, + 3040, + 3346, + 3689, + 4064, + 4466, + 4888, + 5323, + 5764, + 6204, + 6635, + 7049, + 7439, + 7797, + 8116, + 8391, + 8615, + 8783, + 8892, + 8938, + 8918, + 8833, + 8681, + 8465, + 8185, + 7846, + 7452, + 7009, + 6522, + 5998, + 5446, + 4874, + 4290, + 3704, + 3124, + 2561, + 2024, + 1520, + 1059, + 648, + 295, + 6, + -214, + -361, + -432, + -424, + -337, + -171, + 70, + 387, + 775, + 1228, + 1739, + 2303, + 2911, + 3554, + 4224, + 4911, + 5606, + 6297, + 6977, + 7634, + 8260, + 8846, + 9384, + 9866, + 10286, + 10638, + 10918, + 11122, + 11249, + 11296, + 11264, + 11154, + 10968, + 10710, + 10384, + 9995, + 9550, + 9054, + 8515, + 7942, + 7341, + 6722, + 6092, + 5459, + 4832, + 4218, + 3623, + 3055, + 2518, + 2019, + 1560, + 1146, + 778, + 457, + 185, + -38, + -216, + -350, + -442, + -497, + -518, + -510, + -478, + -428, + -363, + -291, + -215, + -141, + -74, + -17, + 24, + 49, + 55, + 40, + 3, + -56, + -136, + -236, + -353, + -485, + -627, + -776, + -927, + -1075, + -1214, + -1340, + -1447, + -1529, + -1581, + -1599, + -1578, + -1514, + -1404, + -1247, + -1039, + -781, + -473, + -115, + 288, + 737, + 1225, + 1749, + 2302, + 2878, + 3471, + 4071, + 4672, + 5265, + 5842, + 6393, + 6911, + 7388, + 7815, + 8185, + 8492, + 8730, + 8893, + 8979, + 8983, + 8905, + 8743, + 8498, + 8171, + 7766, + 7287, + 6738, + 6127, + 5458, + 4742, + 3986, + 3199, + 2391, + 1572, + 752, + -58, + -851, + -1616, + -2343, + -3025, + -3653, + -4222, + -4725, + -5157, + -5514, + -5795, + -5997, + -6121, + -6168, + -6140, + -6040, + -5873, + -5645, + -5360, + -5028, + -4655, + -4249, + -3820, + -3375, + -2924, + -2475, + -2037, + -1618, + -1226, + -867, + -548, + -274, + -49, + 122, + 239, + 299, + 303, + 252, + 147, + -8, + -210, + -454, + -734, + -1044, + -1377, + -1725, + -2082, + -2438, + -2788, + -3122, + -3434, + -3716, + -3963, + -4167, + -4325, + -4431, + -4481, + -4474, + -4408, + -4281, + -4095, + -3849, + -3547, + -3192, + -2786, + -2335, + -1844, + -1318, + -763, + -186, + 406, + 1008, + 1613, + 2215, + 2807, + 3384, + 3942, + 4475, + 4980, + 5455, + 5896, + 6303, + 6675, + 7013, + 7318, + 7591, + 7835, + 8054, + 8252, + 8432, + 8600, + 8761, + 8919, + 9080, + 9250, + 9432, + 9632, + 9854, + 10100, + 10375, + 10680, + 11017, + 11387, + 11788, + 12221, + 12682, + 13169, + 13678, + 14204, + 14743, + 15287, + 15831, + 16367, + 16889, + 17388, + 17856, + 18287, + 18673, + 19007, + 19282, + 19493, + 19634, + 19700, + 19689, + 19597, + 19424, + 19168, + 18832, + 18416, + 17925, + 17361, + 16732, + 16042, + 15300, + 14513, + 13691, + 12843, + 11978, + 11107, + 10240, + 9388, + 8560, + 7767, + 7018, + 6322, + 5686, + 5119, + 4625, + 4211, + 3881, + 3636, + 3479, + 3410, + 3428, + 3531, + 3714, + 3975, + 4306, + 4702, + 5154, + 5655, + 6196, + 6768, + 7360, + 7964, + 8569, + 9166, + 9745, + 10298, + 10817, + 11293, + 11720, + 12093, + 12406, + 12655, + 12838, + 12954, + 13001, + 12980, + 12893, + 12742, + 12532, + 12266, + 11950, + 11590, + 11192, + 10763, + 10311, + 9842, + 9364, + 8884, + 8409, + 7946, + 7500, + 7077, + 6682, + 6319, + 5991, + 5701, + 5449, + 5236, + 5063, + 4927, + 4828, + 4761, + 4724, + 4712, + 4721, + 4746, + 4782, + 4822, + 4862, + 4897, + 4920, + 4927, + 4913, + 4875, + 4809, + 4712, + 4582, + 4418, + 4219, + 3987, + 3722, + 3427, + 3105, + 2758, + 2392, + 2012, + 1622, +]; diff --git a/open_wearable/lib/apps/widgets/app_compatibility.dart b/open_wearable/lib/apps/widgets/app_compatibility.dart index 8a0e85ff..58cd8ea6 100644 --- a/open_wearable/lib/apps/widgets/app_compatibility.dart +++ b/open_wearable/lib/apps/widgets/app_compatibility.dart @@ -1,5 +1,33 @@ +import 'package:open_earable_flutter/open_earable_flutter.dart'; import 'package:open_wearable/models/device_name_formatter.dart'; +/// Describes one runtime capability an app needs from a wearable. +class WearableCapabilityRequirement { + /// Human-readable capability name shown when a wearable is missing it. + final String label; + + final bool Function(Wearable wearable) _isSatisfiedBy; + + /// Creates a requirement backed by a wearable capability predicate. + const WearableCapabilityRequirement({ + required this.label, + required bool Function(Wearable wearable) isSatisfiedBy, + }) : _isSatisfiedBy = isSatisfiedBy; + + /// Creates a requirement for a capability registered on [Wearable]. + static WearableCapabilityRequirement capability({ + required String label, + }) { + return WearableCapabilityRequirement( + label: label, + isSatisfiedBy: (wearable) => wearable.hasCapability(), + ); + } + + /// Returns whether [wearable] satisfies this app requirement. + bool isSatisfiedBy(Wearable wearable) => _isSatisfiedBy(wearable); +} + bool wearableNameStartsWithPrefix(String wearableName, String prefix) { final normalizedPrefix = prefix.trim().toLowerCase(); final normalizedWearableName = wearableName.trim().toLowerCase(); @@ -30,6 +58,43 @@ bool wearableIsCompatibleWithApp({ ); } +/// Returns true when [wearable] matches an app's supported device families. +bool wearableMatchesSupportedDevicePrefixes({ + required Wearable wearable, + required List supportedDevicePrefixes, +}) { + return wearableIsCompatibleWithApp( + wearableName: wearable.name, + supportedDevicePrefixes: supportedDevicePrefixes, + ); +} + +/// Returns capability requirements from [requirements] missing on [wearable]. +List missingWearableCapabilityRequirements({ + required Wearable wearable, + required List requirements, +}) { + return requirements + .where((requirement) => !requirement.isSatisfiedBy(wearable)) + .toList(growable: false); +} + +/// Returns true when [wearable] matches the app family and runtime capabilities. +bool wearableSatisfiesAppRequirements({ + required Wearable wearable, + required List supportedDevicePrefixes, + required List requiredCapabilities, +}) { + return wearableMatchesSupportedDevicePrefixes( + wearable: wearable, + supportedDevicePrefixes: supportedDevicePrefixes, + ) && + missingWearableCapabilityRequirements( + wearable: wearable, + requirements: requiredCapabilities, + ).isEmpty; +} + bool hasConnectedWearableForPrefix({ required String devicePrefix, required Iterable connectedWearableNames, diff --git a/open_wearable/lib/apps/widgets/apps_page.dart b/open_wearable/lib/apps/widgets/apps_page.dart index 024e656c..4773b251 100644 --- a/open_wearable/lib/apps/widgets/apps_page.dart +++ b/open_wearable/lib/apps/widgets/apps_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:go_router/go_router.dart'; import 'package:open_earable_flutter/open_earable_flutter.dart'; +import 'package:open_wearable/apps/seal_check/audio_response_measurement_view.dart'; import 'package:open_wearable/apps/heart_tracker/widgets/heart_tracker_page.dart'; import 'package:open_wearable/apps/posture_tracker/model/earable_attitude_tracker.dart'; import 'package:open_wearable/apps/posture_tracker/view/posture_tracker_view.dart'; @@ -14,11 +15,13 @@ import 'package:open_wearable/widgets/recording_activity_indicator.dart'; import 'package:open_wearable/widgets/sensors/sensor_page_spacing.dart'; import 'package:provider/provider.dart'; +/// Metadata and launch configuration for one built-in wearable app. class AppInfo { final String logoPath; final String title; final String description; final List supportedDevices; + final List requiredCapabilities; final Color accentColor; final Widget widget; final double? svgIconInset; @@ -30,6 +33,7 @@ class AppInfo { required this.title, required this.description, required this.supportedDevices, + required this.requiredCapabilities, required this.accentColor, required this.widget, this.svgIconInset, @@ -46,6 +50,24 @@ const List _heartSupportedDevices = [ "OpenEarable", "OpenRing", ]; +const List _sealCheckSupportedDevices = [ + "OpenEarable", +]; +final List _postureRequiredCapabilities = [ + WearableCapabilityRequirement.capability( + label: 'sensor streaming', + ), +]; +final List _heartRequiredCapabilities = [ + WearableCapabilityRequirement.capability( + label: 'sensor streaming', + ), +]; +final List _sealCheckRequiredCapabilities = [ + WearableCapabilityRequirement.capability( + label: 'audio response measurement', + ), +]; Sensor? _findOpticalTemperatureSensor(List sensors) { String normalizeToken(String input) { @@ -89,9 +111,11 @@ final List _apps = [ title: "Posture Tracker", description: "Get feedback on bad posture", supportedDevices: _postureSupportedDevices, + requiredCapabilities: _postureRequiredCapabilities, accentColor: _appAccentColor, widget: SelectEarableView( supportedDevicePrefixes: _postureSupportedDevices, + requiredCapabilities: _postureRequiredCapabilities, startApp: (wearable, sensorConfigProvider) async { return PostureTrackerView( EarableAttitudeTracker( @@ -110,9 +134,11 @@ final List _apps = [ title: "Heart Tracker", description: "Heart rate and HRV visualization", supportedDevices: _heartSupportedDevices, + requiredCapabilities: _heartRequiredCapabilities, accentColor: _appAccentColor, widget: SelectEarableView( supportedDevicePrefixes: _heartSupportedDevices, + requiredCapabilities: _heartRequiredCapabilities, startApp: (wearable, _) async { if (wearable.hasCapability()) { final sensors = wearable.requireCapability().sensors; @@ -169,10 +195,34 @@ final List _apps = [ }, ), ), + AppInfo( + logoPath: "lib/apps/seal_check/assets/seal-check-icon.png", + title: "Seal Check", + description: "Measure ear seal quality", + supportedDevices: _sealCheckSupportedDevices, + requiredCapabilities: _sealCheckRequiredCapabilities, + accentColor: _appAccentColor, + widget: SelectEarableView( + supportedDevicePrefixes: _sealCheckSupportedDevices, + requiredCapabilities: _sealCheckRequiredCapabilities, + startApp: (wearable, _) async { + final manager = wearable.requireCapability(); + final position = wearable.hasCapability() + ? await wearable.requireCapability().position + : null; + + return SealCheckMeasurementView( + left: position == DevicePosition.right ? null : manager, + right: position == DevicePosition.right ? manager : null, + ); + }, + ), + ), ]; int getAvailableAppsCount() => _apps.length; +/// Counts apps that have at least one connected wearable from a supported family. int getCompatibleAppsCountForWearables(Iterable wearables) { final names = wearables.map((wearable) => wearable.name).toList(); if (names.isEmpty) return 0; diff --git a/open_wearable/lib/apps/widgets/select_earable_view.dart b/open_wearable/lib/apps/widgets/select_earable_view.dart index cc367ccd..53c997d3 100644 --- a/open_wearable/lib/apps/widgets/select_earable_view.dart +++ b/open_wearable/lib/apps/widgets/select_earable_view.dart @@ -10,17 +10,20 @@ import 'package:open_wearable/widgets/devices/device_status_pills.dart'; import 'package:open_wearable/widgets/devices/wearable_icon.dart'; import 'package:provider/provider.dart'; +/// Lets the user choose a compatible wearable before launching an app. class SelectEarableView extends StatefulWidget { final Future Function( Wearable, SensorConfigurationProvider, ) startApp; final List supportedDevicePrefixes; + final List requiredCapabilities; const SelectEarableView({ super.key, required this.startApp, this.supportedDevicePrefixes = const [], + this.requiredCapabilities = const [], }); @override @@ -41,19 +44,24 @@ class _SelectEarableViewState extends State { ), body: Consumer( builder: (context, wearablesProvider, _) { - final compatibleWearables = wearablesProvider.wearables + final supportedWearables = wearablesProvider.wearables .where( - (wearable) => wearableIsCompatibleWithApp( - wearableName: wearable.name, + (wearable) => wearableMatchesSupportedDevicePrefixes( + wearable: wearable, supportedDevicePrefixes: widget.supportedDevicePrefixes, ), ) .toList(growable: false); + final selectableWearables = supportedWearables + .where( + (wearable) => _missingRequirements(wearable).isEmpty, + ) + .toList(growable: false); - _refreshGroupFutureIfNeeded(compatibleWearables); + _refreshGroupFutureIfNeeded(supportedWearables); final selectedDeviceId = _selectedWearable?.deviceId; final hasSelectedCompatibleWearable = selectedDeviceId != null && - compatibleWearables.any( + selectableWearables.any( (wearable) => wearable.deviceId == selectedDeviceId, ); @@ -62,8 +70,7 @@ class _SelectEarableViewState extends State { Expanded( child: _buildBody( context, - compatibleWearables: compatibleWearables, - wearablesProvider: wearablesProvider, + supportedWearables: supportedWearables, ), ), SafeArea( @@ -75,7 +82,7 @@ class _SelectEarableViewState extends State { onPressed: hasSelectedCompatibleWearable && !_isStartingApp ? () => _startSelectedApp( wearablesProvider, - compatibleWearables, + selectableWearables, ) : null, child: _isStartingApp @@ -112,10 +119,9 @@ class _SelectEarableViewState extends State { Widget _buildBody( BuildContext context, { - required List compatibleWearables, - required WearablesProvider wearablesProvider, + required List supportedWearables, }) { - if (compatibleWearables.isEmpty) { + if (supportedWearables.isEmpty) { return Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 18), @@ -133,7 +139,7 @@ class _SelectEarableViewState extends State { builder: (context, snapshot) { final groups = _sortGroupsForSelection( snapshot.data ?? - compatibleWearables + supportedWearables .map( (wearable) => WearableDisplayGroup.single(wearable: wearable), @@ -153,17 +159,22 @@ class _SelectEarableViewState extends State { itemBuilder: (context, index) { final group = groups[index]; final wearable = group.primary; - final isSelected = selectedId == wearable.deviceId; + final missingRequirements = _missingRequirements(wearable); + final isSelectable = missingRequirements.isEmpty; + final isSelected = isSelectable && selectedId == wearable.deviceId; return _SelectableWearableCard( wearable: wearable, position: group.primaryPosition, selected: isSelected, - onTap: () { - setState(() { - _selectedWearable = wearable; - }); - }, + disabledReason: _disabledReason(missingRequirements), + onTap: isSelectable + ? () { + setState(() { + _selectedWearable = wearable; + }); + } + : null, ); }, ); @@ -199,6 +210,12 @@ class _SelectEarableViewState extends State { } indexed.sort((a, b) { + final bySelectable = _selectableRank(a.value.primary) + .compareTo(_selectableRank(b.value.primary)); + if (bySelectable != 0) { + return bySelectable; + } + final aBase = normalizedName(a.value.primary.name).toLowerCase(); final bBase = normalizedName(b.value.primary.name).toLowerCase(); final byBase = aBase.compareTo(bBase); @@ -225,16 +242,37 @@ class _SelectEarableViewState extends State { return indexed.map((entry) => entry.value).toList(growable: false); } + int _selectableRank(Wearable wearable) { + return _missingRequirements(wearable).isEmpty ? 0 : 1; + } + + List _missingRequirements(Wearable wearable) { + return missingWearableCapabilityRequirements( + wearable: wearable, + requirements: widget.requiredCapabilities, + ); + } + + String? _disabledReason(List requirements) { + if (requirements.isEmpty) { + return null; + } + + final labels = + requirements.map((requirement) => requirement.label).join(', '); + return 'Missing $labels'; + } + Future _startSelectedApp( WearablesProvider wearablesProvider, - List compatibleWearables, + List selectableWearables, ) async { final selectedId = _selectedWearable?.deviceId; if (selectedId == null) { return; } - final selectedWearable = compatibleWearables + final selectedWearable = selectableWearables .where((wearable) => wearable.deviceId == selectedId) .firstOrNull; @@ -318,12 +356,14 @@ class _SelectableWearableCard extends StatelessWidget { final Wearable wearable; final DevicePosition? position; final bool selected; - final VoidCallback onTap; + final String? disabledReason; + final VoidCallback? onTap; const _SelectableWearableCard({ required this.wearable, required this.position, required this.selected, + required this.disabledReason, required this.onTap, }); @@ -333,9 +373,18 @@ class _SelectableWearableCard extends StatelessWidget { final colorScheme = theme.colorScheme; final iconVariant = _iconVariantForPosition(position); final hasWearableIcon = _hasWearableIcon(iconVariant); + final isEnabled = onTap != null; + final disabledCardColor = theme.brightness == Brightness.dark + ? const Color(0xFF2E2E2E) + : const Color(0xFFE7E7E7); + final disabledTextColor = theme.brightness == Brightness.dark + ? const Color(0xFFB8B8B8) + : const Color(0xFF6F6F6F); final cardColor = selected ? colorScheme.primaryContainer.withValues(alpha: 0.34) - : colorScheme.surface; + : isEnabled + ? colorScheme.surface + : disabledCardColor; final pills = _buildDeviceStatusPills(); return Card( @@ -343,80 +392,99 @@ class _SelectableWearableCard extends StatelessWidget { clipBehavior: Clip.antiAlias, child: InkWell( onTap: onTap, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (hasWearableIcon) ...[ - Padding( - padding: const EdgeInsets.only(top: 2), - child: SizedBox( - width: 56, - height: 56, - child: WearableIcon( - wearable: wearable, - initialVariant: iconVariant, - hideWhileResolvingStereoPosition: true, - hideWhenResolvedVariantIsSingle: true, - fallback: const SizedBox.shrink(), + child: _DisabledGreyscale( + enabled: !isEnabled, + child: Opacity( + opacity: isEnabled ? 1 : 0.66, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (hasWearableIcon) ...[ + Padding( + padding: const EdgeInsets.only(top: 2), + child: SizedBox( + width: 56, + height: 56, + child: WearableIcon( + wearable: wearable, + initialVariant: iconVariant, + hideWhileResolvingStereoPosition: true, + hideWhenResolvedVariantIsSingle: true, + fallback: const SizedBox.shrink(), + ), + ), ), - ), - ), - const SizedBox(width: 12), - ], - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( + const SizedBox(width: 12), + ], + Expanded( + child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded( - child: Text( - formatWearableDisplayName(wearable.name), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: theme.textTheme.bodyLarge?.copyWith( - fontWeight: FontWeight.bold, + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Text( + formatWearableDisplayName(wearable.name), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: theme.textTheme.bodyLarge?.copyWith( + fontWeight: FontWeight.bold, + color: isEnabled ? null : disabledTextColor, + ), + ), ), - ), + const SizedBox(width: 8), + ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 170), + child: Text( + wearable.deviceId, + maxLines: 1, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.right, + style: theme.textTheme.bodySmall?.copyWith( + color: isEnabled + ? theme.colorScheme.onSurfaceVariant + : disabledTextColor, + fontWeight: FontWeight.w600, + ), + ), + ), + if (selected) ...[ + const SizedBox(width: 6), + Padding( + padding: const EdgeInsets.only(top: 1), + child: Icon( + Icons.check_circle_rounded, + color: colorScheme.primary, + size: 18, + ), + ), + ], + ], ), - const SizedBox(width: 8), - ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 170), - child: Text( - wearable.deviceId, - maxLines: 1, - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.right, + if (disabledReason case final reason?) ...[ + const SizedBox(height: 6), + Text( + reason, style: theme.textTheme.bodySmall?.copyWith( - color: theme.colorScheme.onSurfaceVariant, + color: disabledTextColor, fontWeight: FontWeight.w600, ), ), - ), - if (selected) ...[ - const SizedBox(width: 6), - Padding( - padding: const EdgeInsets.only(top: 1), - child: Icon( - Icons.check_circle_rounded, - color: colorScheme.primary, - size: 18, - ), - ), + ], + if (pills.isNotEmpty) ...[ + const SizedBox(height: 8), + _buildStatusPillLine(pills), ], ], ), - if (pills.isNotEmpty) ...[ - const SizedBox(height: 8), - _buildStatusPillLine(pills), - ], - ], - ), + ), + ], ), - ], + ), ), ), ), @@ -456,3 +524,46 @@ class _SelectableWearableCard extends StatelessWidget { return DevicePillLine(pills: pills); } } + +class _DisabledGreyscale extends StatelessWidget { + final bool enabled; + final Widget child; + + const _DisabledGreyscale({ + required this.enabled, + required this.child, + }); + + @override + Widget build(BuildContext context) { + if (!enabled) { + return child; + } + + return ColorFiltered( + colorFilter: const ColorFilter.matrix([ + 0.2126, + 0.7152, + 0.0722, + 0, + 0, + 0.2126, + 0.7152, + 0.0722, + 0, + 0, + 0.2126, + 0.7152, + 0.0722, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ]), + child: child, + ); + } +} diff --git a/open_wearable/macos/Podfile.lock b/open_wearable/macos/Podfile.lock index 41eb4bdf..2e46ed0c 100644 --- a/open_wearable/macos/Podfile.lock +++ b/open_wearable/macos/Podfile.lock @@ -1,7 +1,4 @@ PODS: - - flutter_archive (0.0.1): - - FlutterMacOS - - ZIPFoundation (= 0.9.19) - FlutterMacOS (1.0.0) - iOSMcuManagerLibrary (1.12): - SwiftCBOR (= 0.5.0) @@ -16,7 +13,6 @@ PODS: - ZIPFoundation (0.9.19) DEPENDENCIES: - - flutter_archive (from `Flutter/ephemeral/.symlinks/plugins/flutter_archive/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - mcumgr_flutter (from `Flutter/ephemeral/.symlinks/plugins/mcumgr_flutter/darwin`) @@ -28,15 +24,12 @@ SPEC REPOS: - ZIPFoundation EXTERNAL SOURCES: - flutter_archive: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_archive/macos FlutterMacOS: :path: Flutter/ephemeral mcumgr_flutter: :path: Flutter/ephemeral/.symlinks/plugins/mcumgr_flutter/darwin SPEC CHECKSUMS: - flutter_archive: 07888d9aeb79da005e0ad8b9d347d17cdea07f68 FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 iOSMcuManagerLibrary: f72db849f6dd66b1f26cd7eea776050a22c8591c mcumgr_flutter: b9864b2ae8334b6ba2b33f9ab4fc0a67bbe75c7a diff --git a/open_wearable/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/open_wearable/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..51e02a31 --- /dev/null +++ b/open_wearable/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "zipfoundation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/weichsel/ZIPFoundation.git", + "state" : { + "revision" : "02b6abe5f6eef7e3cbd5f247c5cc24e246efcfe0", + "version" : "0.9.19" + } + } + ], + "version" : 2 +} diff --git a/open_wearable/macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved b/open_wearable/macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..51e02a31 --- /dev/null +++ b/open_wearable/macos/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "zipfoundation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/weichsel/ZIPFoundation.git", + "state" : { + "revision" : "02b6abe5f6eef7e3cbd5f247c5cc24e246efcfe0", + "version" : "0.9.19" + } + } + ], + "version" : 2 +} diff --git a/open_wearable/pubspec.lock b/open_wearable/pubspec.lock index bdcab1ef..ac84f3ae 100644 --- a/open_wearable/pubspec.lock +++ b/open_wearable/pubspec.lock @@ -29,58 +29,58 @@ packages: dependency: "direct main" description: name: audioplayers - sha256: "1d0c1b1f2095e59080e2d5046639096417a86687d89778da41b0c9a06d683dfd" + sha256: ab3868065119285370fcd41399c7541fb32239dd90f65be1338d284a80487668 url: "https://pub.dev" source: hosted - version: "6.7.0" + version: "6.8.0" audioplayers_android: dependency: transitive description: name: audioplayers_android - sha256: "60a6728277228413a85755bd3ffd6fab98f6555608923813ce383b190a360605" + sha256: f5ff5b15620fbab8cb0849e9636c48e2b96c3f0f71723bbbe2ad3c761b205f05 url: "https://pub.dev" source: hosted - version: "5.2.1" + version: "5.3.0" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - sha256: c994b3bb3a921e4904ac40e013fbc94488e824fd7c1de6326f549943b0b44a91 + sha256: "1ca553add991384ecf421b9569da850f3ab2472ffb83f6970b0416365abc51be" url: "https://pub.dev" source: hosted - version: "6.4.0" + version: "6.5.0" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - sha256: f75bce1ce864170ef5e6a2c6a61cd3339e1a17ce11e99a25bae4474ea491d001 + sha256: "15178b726b7cdee5364d0463c8d445630c4e0fb7d26612b73c767e7d25de9417" url: "https://pub.dev" source: hosted - version: "4.2.1" + version: "4.3.0" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - sha256: "0e2f6a919ab56d0fec272e801abc07b26ae7f31980f912f24af4748763e5a656" + sha256: "765f6f0e6dca55cb471c9483fc77700564b3484d19198aca4ebb5147c6c85acb" url: "https://pub.dev" source: hosted - version: "7.1.1" + version: "7.2.0" audioplayers_web: dependency: transitive description: name: audioplayers_web - sha256: "24a6f258062bd7da8cb2157e83fccb9816a08dd306cbaaa24f9813d071470545" + sha256: ae1e0103c865a03e273f6d13d97b93f5595eac09915729cd5e37ef96e2857319 url: "https://pub.dev" source: hosted - version: "5.2.1" + version: "5.3.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - sha256: "95f875a96c88c3dbbcb608d4f8288e300b0113d256a81d0b3197fcc18f0dc91a" + sha256: d0690f33b1443ee89632126861a997db33dc90f3af54aef305dfb977bc580f2c url: "https://pub.dev" source: hosted - version: "4.3.1" + version: "4.4.0" bloc: dependency: transitive description: @@ -125,10 +125,10 @@ packages: dependency: transitive description: name: code_assets - sha256: "67cf6d84013f9c601e42a6f8a6b74c4c0d9dc1a1619d775f2b28b732d3551b85" + sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" collection: dependency: transitive description: @@ -189,10 +189,10 @@ packages: dependency: transitive description: name: dbus - sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 + sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" url: "https://pub.dev" source: hosted - version: "0.7.12" + version: "0.7.14" device_info_plus: dependency: "direct main" description: @@ -274,10 +274,10 @@ packages: dependency: transitive description: name: flutter_archive - sha256: e433389fde0bdfc20af40784fdb6d91753794b40cf708a43f95244fcd5d6c298 + sha256: d07dcd976954d997e547980cbdc01fe444e77cce062866735bc3b5a1da39f2c5 url: "https://pub.dev" source: hosted - version: "6.0.4" + version: "6.3.1" flutter_bloc: dependency: "direct main" description: @@ -322,10 +322,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "38d1c268de9097ff59cf0e844ac38759fc78f76836d37edad06fa21e182055a0" + sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" url: "https://pub.dev" source: hosted - version: "2.0.34" + version: "2.0.35" flutter_staggered_grid_view: dependency: "direct main" description: @@ -364,18 +364,18 @@ packages: dependency: "direct main" description: name: go_router - sha256: "92d8cee7c57dff0a6c409c05597b460002434eccf7424a712283225b3962d03f" + sha256: "5922b2861e2235a3504896f0d6fa07d84141b480cf52eecd2f42cd25585a9e8a" url: "https://pub.dev" source: hosted - version: "17.2.3" + version: "17.3.0" hooks: dependency: transitive description: name: hooks - sha256: a41af4e8fc687cd6d33de9751eb936c8c0204ebe2bcb6c15ecf707504bf47f31 + sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.2" http: dependency: transitive description: @@ -531,11 +531,20 @@ packages: open_earable_flutter: dependency: "direct main" description: - name: open_earable_flutter - sha256: d7a2e491fa589ea14093101fa37b182d748240ac26fe9cafe9938371f6256b67 + path: "." + ref: "feature/audio-response" + resolved-ref: b6ac787c04f018f7b76ca23d69599295b59e4a0d + url: "https://github.com/OpenEarable/open_earable_flutter.git" + source: git + version: "2.3.10" + open_earable_protocols: + dependency: transitive + description: + name: open_earable_protocols + sha256: c11cae4914827c1d7617d44647a5c49304f0c2a2c02c907c595682cfade6ddb2 url: "https://pub.dev" source: hosted - version: "2.3.10" + version: "0.0.2" open_file: dependency: "direct main" description: @@ -548,18 +557,18 @@ packages: dependency: transitive description: name: open_file_android - sha256: "58141fcaece2f453a9684509a7275f231ac0e3d6ceb9a5e6de310a7dff9084aa" + sha256: f48a342b0347bf82bebf68c752f5cfce162965ce8449c5ecdafc406d294aa63d url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.1.0" open_file_ios: dependency: transitive description: name: open_file_ios - sha256: a5acd07ba1f304f807a97acbcc489457e1ad0aadff43c467987dd9eef814098f + sha256: "0e3e67dcd12f69888128f533cacc092039627dd4f1d7a95a2826b814ae4ea8aa" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.1.0" open_file_linux: dependency: transitive description: @@ -572,18 +581,18 @@ packages: dependency: transitive description: name: open_file_mac - sha256: cd293f6750de6438ab2390513c99128ade8c974825d4d8128886d1cda8c64d01 + sha256: "1abe00e65f792b9baa1e15fdf4d44af5e813b1696ac307d71535543122a01e30" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.1.0" open_file_platform_interface: dependency: transitive description: name: open_file_platform_interface - sha256: "101b424ca359632699a7e1213e83d025722ab668b9fd1412338221bf9b0e5757" + sha256: dc302e4bd5c1d77acec4240bd0dbc1d9f2ee6882b1ce52bca5298369da7acf12 url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.1.0" open_file_web: dependency: transitive description: @@ -625,7 +634,7 @@ packages: source: hosted version: "3.2.1" path: - dependency: transitive + dependency: "direct main" description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" @@ -644,10 +653,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.1.6" path_provider_android: dependency: transitive description: @@ -676,10 +685,10 @@ packages: dependency: transitive description: name: path_provider_platform_interface - sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" path_provider_windows: dependency: transitive description: @@ -692,10 +701,10 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 + sha256: fe54465bcc62a4564c6e4db337bbaded6c0c0fa6e10487414436d163114784f6 url: "https://pub.dev" source: hosted - version: "12.0.1" + version: "12.0.3" permission_handler_android: dependency: transitive description: @@ -708,10 +717,10 @@ packages: dependency: transitive description: name: permission_handler_apple - sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + sha256: "79dfa1df734798aa3cfdad166d3a3698c206d8813de13516ea1071b5d7e2f420" url: "https://pub.dev" source: hosted - version: "9.4.7" + version: "9.4.10" permission_handler_html: dependency: transitive description: @@ -916,10 +925,10 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 + sha256: "93ae5884a9df5d3bb696825bceb3a17590754548b5d740eba51500afc8d088f5" url: "https://pub.dev" source: hosted - version: "2.4.23" + version: "2.4.26" shared_preferences_foundation: dependency: transitive description: @@ -1001,10 +1010,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" + sha256: "93b153dcb6a26dcddee6ca087dd634b53e38c10b5aa163e8e49501a776456153" url: "https://pub.dev" source: hosted - version: "3.4.0+1" + version: "3.4.1" term_glyph: dependency: transitive description: @@ -1041,10 +1050,10 @@ packages: dependency: "direct main" description: name: universal_ble - sha256: da15f61251299daf9c290bb8e40ded1e5313c4636fef6c796a7a656a06c93b4a + sha256: ff3c4ea34e1360ba593c68f68ff2d0cd598dcb054b0de1d89c0936dbb5dd9707 url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.0.2" url_launcher: dependency: "direct main" description: @@ -1057,10 +1066,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" + sha256: b413d49b73867ac08dd2f9890efd3cc11f2a0e577618d50843440a1fb3776c32 url: "https://pub.dev" source: hosted - version: "6.3.30" + version: "6.3.32" url_launcher_ios: dependency: transitive description: @@ -1137,10 +1146,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: "09854c7633b215e6f7bb2a9adb607bc525bae8655c7fc29db880c33e62f72230" + sha256: "142a9146f447d15b10bdc00e21d5f4d83e5b32bb5f8f8f5a04c75311344923a3" url: "https://pub.dev" source: hosted - version: "1.2.4" + version: "1.2.6" vector_math: dependency: transitive description: diff --git a/open_wearable/pubspec.yaml b/open_wearable/pubspec.yaml index c460b7dd..2eeab894 100644 --- a/open_wearable/pubspec.yaml +++ b/open_wearable/pubspec.yaml @@ -35,7 +35,11 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.9 open_file: ^3.5.11 - open_earable_flutter: ^2.3.10 + # open_earable_flutter: ^2.3.10 + open_earable_flutter: + git: + url: https://github.com/OpenEarable/open_earable_flutter.git + ref: feature/audio-response universal_ble: ^2.0.4 permission_handler: ^12.0.1 flutter_platform_widgets: ^10.0.1 @@ -56,6 +60,7 @@ dependencies: go_router: ^17.2.3 audioplayers: ^6.7.0 wakelock_plus: ^1.5.2 + path: ^1.9.1 package_info_plus: ^9.0.1 sensors_plus: ^7.0.0 device_info_plus: ^12.4.0 @@ -75,6 +80,11 @@ dev_dependencies: # rules and activating additional ones. flutter_lints: ^6.0.0 +dependency_overrides: + file_picker: 11.0.2 + mcumgr_flutter: 0.9.1 + universal_ble: 2.0.2 + # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec @@ -90,6 +100,7 @@ flutter: assets: - lib/apps/posture_tracker/assets/ - lib/apps/heart_tracker/assets/ + - lib/apps/seal_check/assets/ - lib/assets/devices/phone-app.png - android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/open_wearable/test/apps/audio_response_measure/audio_response_measurement_session_test.dart b/open_wearable/test/apps/audio_response_measure/audio_response_measurement_session_test.dart new file mode 100644 index 00000000..6557aefe --- /dev/null +++ b/open_wearable/test/apps/audio_response_measure/audio_response_measurement_session_test.dart @@ -0,0 +1,210 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:open_earable_flutter/open_earable_flutter.dart'; +import 'package:open_wearable/apps/seal_check/audio_response_measurement_session.dart'; +import 'package:open_wearable/apps/seal_check/seal_check_tone.dart'; + +class _FakeAudioResponseManager implements AudioResponseManager { + _FakeAudioResponseManager({this.failUploadAttempts = 0}); + + final int failUploadAttempts; + final List transferIds = []; + final List> uploadedSamples = []; + final List samplingRates = []; + final List configs = []; + int _uploadAttempts = 0; + + @override + Future uploadAudioBuffer({ + required int transferId, + required List samples, + required int samplingRate, + int maximumSamplesPerChunk = 118, + AudioResponseUploadProgressCallback? onProgress, + }) async { + _uploadAttempts += 1; + if (_uploadAttempts <= failUploadAttempts) { + throw StateError('Audio response transfer status stream closed'); + } + + transferIds.add(transferId); + uploadedSamples.add(samples); + samplingRates.add(samplingRate); + onProgress?.call( + AudioResponseUploadProgress( + phase: AudioResponseUploadPhase.starting, + acknowledgedSamples: 0, + totalSamples: samples.length, + ), + ); + onProgress?.call( + AudioResponseUploadProgress( + phase: AudioResponseUploadPhase.uploading, + acknowledgedSamples: samples.length ~/ 2, + totalSamples: samples.length, + ), + ); + onProgress?.call( + AudioResponseUploadProgress( + phase: AudioResponseUploadPhase.completed, + acknowledgedSamples: samples.length, + totalSamples: samples.length, + ), + ); + } + + @override + Future measureAudioResponse( + AudioResponseConfig config, + ) async { + configs.add(config); + return AudioResponseResult( + id: config.id, + points: 2, + frequencies: [40, 60], + response: [100, 120], + ); + } +} + +void main() { + group('AudioResponseMeasurementSession', () { + test('uploads the pregenerated seal-check tone by default', () async { + final manager = _FakeAudioResponseManager(); + final session = AudioResponseMeasurementSession(left: manager); + + await session.measure(); + + expect(manager.uploadedSamples.single, same(sealCheckToneBuffer)); + expect(manager.samplingRates, [audioResponseSamplingRate]); + }); + + test('requests the configured seal-check response frequencies', () async { + final manager = _FakeAudioResponseManager(); + final session = AudioResponseMeasurementSession( + left: manager, + samples: const [0, 100, -100], + ); + + final first = await session.measure(); + final second = await session.measure(); + + expect(manager.transferIds, [1]); + expect(manager.configs.map((config) => config.transfer_id), [1, 1]); + expect(manager.configs.map((config) => config.id), [1, 2]); + expect( + manager.configs.first.frequencies, + audioResponseRequestFrequencies, + ); + expect( + manager.configs.first.points, + audioResponseRequestFrequencies.length, + ); + expect(first.left?.points.first.frequencyHz, 40); + expect(first.left?.points.first.magnitude, 100); + expect(second.left?.id, 2); + expect(first.right, isNull); + }); + + test('uses the same measurement id for both sides', () async { + final left = _FakeAudioResponseManager(); + final right = _FakeAudioResponseManager(); + final session = AudioResponseMeasurementSession( + left: left, + right: right, + samples: const [1], + ); + + final result = await session.measure(); + + expect(left.configs.single.id, right.configs.single.id); + expect(result.left, isNotNull); + expect(result.right, isNotNull); + }); + + test('reports upload and measurement progress', () async { + final manager = _FakeAudioResponseManager(); + final session = AudioResponseMeasurementSession( + left: manager, + samples: const [1, 2], + ); + final progressUpdates = []; + + await session.measure(onProgress: progressUpdates.add); + + expect( + progressUpdates.map((progress) => progress.phase).toList(), + [ + AudioResponseMeasurementPhase.uploadingTone, + AudioResponseMeasurementPhase.uploadingTone, + AudioResponseMeasurementPhase.uploadingTone, + AudioResponseMeasurementPhase.uploadingTone, + AudioResponseMeasurementPhase.uploadingTone, + AudioResponseMeasurementPhase.measuringResponse, + ], + ); + expect( + progressUpdates + .map((progress) => progress.uploadFraction) + .toList(growable: false), + [0.0, 0.0, 0.5, 1.0, 1.0, null], + ); + expect( + progressUpdates + .map((progress) => progress.acknowledgedSamples) + .toList(growable: false), + [0, 0, 1, 2, 2, 0], + ); + }); + + test('skips upload progress after the tone has been cached', () async { + final manager = _FakeAudioResponseManager(); + final session = AudioResponseMeasurementSession( + left: manager, + samples: const [1], + ); + + await session.measure(); + + final progressUpdates = []; + await session.measure(onProgress: progressUpdates.add); + + expect( + progressUpdates.map((progress) => progress.phase).toList(), + [AudioResponseMeasurementPhase.measuringResponse], + ); + }); + + test('retries a transient closed transfer status stream once', () async { + final manager = _FakeAudioResponseManager(failUploadAttempts: 1); + final session = AudioResponseMeasurementSession( + left: manager, + samples: const [1], + ); + + await session.measure(); + + expect(manager.transferIds, [2]); + }); + + test('surfaces persistent closed transfer status stream failures', + () async { + final manager = _FakeAudioResponseManager(failUploadAttempts: 2); + final session = AudioResponseMeasurementSession( + left: manager, + samples: const [1], + ); + + await expectLater( + session.measure(), + throwsA( + isA().having( + (error) => error.message, + 'message', + 'Audio response transfer status stream closed', + ), + ), + ); + expect(manager.transferIds, isEmpty); + }); + }); +} diff --git a/open_wearable/test/apps/audio_response_measure/seal_check_quality_test.dart b/open_wearable/test/apps/audio_response_measure/seal_check_quality_test.dart new file mode 100644 index 00000000..4949755a --- /dev/null +++ b/open_wearable/test/apps/audio_response_measure/seal_check_quality_test.dart @@ -0,0 +1,91 @@ +import 'dart:math' as math; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:open_wearable/apps/seal_check/audio_response_measurement_session.dart'; +import 'package:open_wearable/apps/seal_check/seal_check_quality.dart'; + +void main() { + group('computeSealCheckQuality', () { + test('returns zero when fewer than two valid peaks are available', () { + expect(computeSealCheckQuality(const []), 0); + expect( + computeSealCheckQuality( + const [AudioResponsePoint(frequencyHz: 40, magnitude: 119)], + ), + 0, + ); + }); + + test('matches the firmware formula for valid peaks in index order', () { + final points = List.generate( + sealCheckTargetMagnitudes.length, + (index) => AudioResponsePoint( + frequencyHz: audioResponseRequestFrequencies[index].toDouble(), + magnitude: sealCheckReferenceAverageMagnitude * + sealCheckTargetMagnitudes[index], + ), + ); + + expect(computeSealCheckQuality(points), closeTo(100, 0.000001)); + }); + + test('ignores non-positive response points before calculating quality', () { + final points = const [ + AudioResponsePoint(frequencyHz: 40, magnitude: 119), + AudioResponsePoint(frequencyHz: 60, magnitude: 0), + AudioResponsePoint(frequencyHz: 90, magnitude: 100), + AudioResponsePoint(frequencyHz: 135, magnitude: -1), + ]; + + expect( + computeSealCheckQuality(points), + closeTo(_expectedFirmwareQuality(points), 0.000001), + ); + }); + }); +} + +double _expectedFirmwareQuality(List points) { + final validPoints = points + .where((point) => point.frequencyHz > 0 && point.magnitude > 0) + .toList(growable: false); + if (validPoints.length < 2) { + return 0; + } + + final logFrequencies = + validPoints.map((point) => math.log(point.frequencyHz)).toList(); + final amplitudes = validPoints.map((point) => point.magnitude).toList(); + final meanLogFrequency = logFrequencies.reduce((sum, value) => sum + value) / + logFrequencies.length; + final meanAmplitude = + amplitudes.reduce((sum, value) => sum + value) / amplitudes.length; + + var numerator = 0.0; + var denominator = 0.0; + for (var index = 0; index < validPoints.length; index++) { + final logFrequencyDiff = logFrequencies[index] - meanLogFrequency; + final amplitudeDiff = amplitudes[index] - meanAmplitude; + numerator += logFrequencyDiff * amplitudeDiff; + denominator += logFrequencyDiff * logFrequencyDiff; + } + + final slope = denominator == 0.0 ? 0.0 : numerator / denominator; + + var mse = 0.0; + for (var index = 0; index < validPoints.length; index++) { + final frequencyError = + amplitudes[index] / meanAmplitude - sealCheckTargetMagnitudes[index]; + mse += frequencyError * frequencyError; + } + mse /= validPoints.length; + + final quality = math.min( + meanAmplitude / sealCheckReferenceAverageMagnitude, + 1, + ) - + mse - + (slope / sealCheckReferenceAverageMagnitude - + sealCheckReferenceAverageSlope); + return (quality * 100).clamp(0, 100); +} diff --git a/open_wearable/test/apps/widgets/app_compatibility_test.dart b/open_wearable/test/apps/widgets/app_compatibility_test.dart index 4c729438..a4edc005 100644 --- a/open_wearable/test/apps/widgets/app_compatibility_test.dart +++ b/open_wearable/test/apps/widgets/app_compatibility_test.dart @@ -1,4 +1,5 @@ import 'package:flutter_test/flutter_test.dart'; +import 'package:open_earable_flutter/open_earable_flutter.dart'; import 'package:open_wearable/apps/widgets/app_compatibility.dart'; void main() { @@ -35,4 +36,66 @@ void main() { isTrue, ); }); + + group('wearableSatisfiesAppRequirements', () { + test('accepts a supported wearable with all required capabilities', () { + final wearable = _FakeWearable(name: 'OpenEarable-2-L'); + wearable.registerCapability<_ExampleCapability>( + const _ExampleCapability(), + ); + + expect( + wearableSatisfiesAppRequirements( + wearable: wearable, + supportedDevicePrefixes: const ['OpenEarable'], + requiredCapabilities: [ + WearableCapabilityRequirement.capability<_ExampleCapability>( + label: 'example capability', + ), + ], + ), + isTrue, + ); + }); + + test('rejects a supported wearable missing a required capability', () { + final wearable = _FakeWearable(name: 'OpenEarable-2-L'); + + final requirement = + WearableCapabilityRequirement.capability<_ExampleCapability>( + label: 'example capability', + ); + + expect( + wearableSatisfiesAppRequirements( + wearable: wearable, + supportedDevicePrefixes: const ['OpenEarable'], + requiredCapabilities: [requirement], + ), + isFalse, + ); + expect( + missingWearableCapabilityRequirements( + wearable: wearable, + requirements: [requirement], + ), + [requirement], + ); + }); + }); +} + +class _FakeWearable extends Wearable { + _FakeWearable({required super.name}) + : super(disconnectNotifier: WearableDisconnectNotifier()); + + @override + String get deviceId => 'fake-device'; + + @override + Future disconnect() async {} +} + +class _ExampleCapability { + const _ExampleCapability(); }