diff --git a/.editorconfig b/.editorconfig index cb589a5ce1..30edee1633 100644 --- a/.editorconfig +++ b/.editorconfig @@ -21,7 +21,7 @@ csharp_new_line_before_finally = true csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_members_in_anonymous_types = true csharp_new_line_between_query_expression_clauses = true -trim_trailing_whitespace = true +# trim_trailing_whitespace = true # Indentation preferences csharp_indent_block_contents = true diff --git a/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm b/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm index f133fa34f6..45d78b3926 100644 --- a/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm +++ b/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm @@ -224,7 +224,7 @@ HRESULT WindowBaseImpl::GetFrameSize(AvnSize *ret) { if (ret == nullptr) return E_POINTER; - if(Window != nullptr){ + if(Window != nullptr && _shown){ auto frame = [Window frame]; ret->Width = frame.size.width; ret->Height = frame.size.height; diff --git a/native/Avalonia.Native/src/OSX/WindowImpl.mm b/native/Avalonia.Native/src/OSX/WindowImpl.mm index 6db586f3ca..85a89955f4 100644 --- a/native/Avalonia.Native/src/OSX/WindowImpl.mm +++ b/native/Avalonia.Native/src/OSX/WindowImpl.mm @@ -119,13 +119,16 @@ void WindowImpl::BringToFront() { if(Window != nullptr) { - if(IsDialog()) + if (![Window isMiniaturized]) { - Activate(); - } - else - { - [Window orderFront:nullptr]; + if(IsDialog()) + { + Activate(); + } + else + { + [Window orderFront:nullptr]; + } } [Window invalidateShadow]; @@ -488,6 +491,8 @@ HRESULT WindowImpl::SetWindowState(AvnWindowState state) { } if (_shown) { + _actualWindowState = _lastWindowState; + switch (state) { case Maximized: if (currentState == FullScreen) { @@ -545,7 +550,6 @@ HRESULT WindowImpl::SetWindowState(AvnWindowState state) { break; } - _actualWindowState = _lastWindowState; WindowEvents->WindowStateChanged(_actualWindowState); } diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs index fd080cfc5b..13751b56b5 100644 --- a/samples/ControlCatalog.NetCore/Program.cs +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -115,7 +115,6 @@ namespace ControlCatalog.NetCore }) .With(new Win32PlatformOptions { - EnableMultitouch = true }) .UseSkia() .AfterSetup(builder => diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml index d8dc3bad2d..7676de54a6 100644 --- a/samples/ControlCatalog/MainView.xaml +++ b/samples/ControlCatalog/MainView.xaml @@ -109,7 +109,7 @@ - + diff --git a/samples/ControlCatalog/Pages/PointerCanvas.cs b/samples/ControlCatalog/Pages/PointerCanvas.cs new file mode 100644 index 0000000000..5843b13a0c --- /dev/null +++ b/samples/ControlCatalog/Pages/PointerCanvas.cs @@ -0,0 +1,235 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; + +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Media; +using Avalonia.Threading; + +namespace ControlCatalog.Pages; + +public class PointerCanvas : Control +{ + private readonly Stopwatch _stopwatch = Stopwatch.StartNew(); + private int _events; + private IDisposable? _statusUpdated; + private Dictionary _pointers = new(); + private PointerPointProperties? _lastProperties; + private PointerUpdateKind? _lastNonOtherUpdateKind; + class PointerPoints + { + struct CanvasPoint + { + public IBrush Brush; + public Point Point; + public double Radius; + public double? Pressure; + } + + readonly CanvasPoint[] _points = new CanvasPoint[1000]; + int _index; + + public void Render(DrawingContext context, bool drawPoints) + { + CanvasPoint? prev = null; + for (var c = 0; c < _points.Length; c++) + { + var i = (c + _index) % _points.Length; + var pt = _points[i]; + var pressure = (pt.Pressure ?? prev?.Pressure ?? 0.5); + var thickness = pressure * 10; + var radius = pressure * pt.Radius; + + if (drawPoints) + { + if (pt.Brush != null) + { + context.DrawEllipse(pt.Brush, null, pt.Point, radius, radius); + } + } + else + { + if (prev.HasValue && prev.Value.Brush != null && pt.Brush != null + && prev.Value.Pressure != null && pt.Pressure != null) + { + var linePen = new Pen(Brushes.Black, thickness, null, PenLineCap.Round, PenLineJoin.Round); + context.DrawLine(linePen, prev.Value.Point, pt.Point); + } + } + prev = pt; + } + + } + + void AddPoint(Point pt, IBrush brush, double radius, float? pressure = null) + { + _points[_index] = new CanvasPoint { Point = pt, Brush = brush, Radius = radius, Pressure = pressure }; + _index = (_index + 1) % _points.Length; + } + + public void HandleEvent(PointerEventArgs e, Visual v) + { + e.Handled = true; + var currentPoint = e.GetCurrentPoint(v); + if (e.RoutedEvent == PointerPressedEvent) + AddPoint(currentPoint.Position, Brushes.Green, 10); + else if (e.RoutedEvent == PointerReleasedEvent) + AddPoint(currentPoint.Position, Brushes.Red, 10); + else + { + var pts = e.GetIntermediatePoints(v); + for (var c = 0; c < pts.Count; c++) + { + var pt = pts[c]; + AddPoint(pt.Position, c == pts.Count - 1 ? Brushes.Blue : Brushes.Black, + c == pts.Count - 1 ? 5 : 2, pt.Properties.Pressure); + } + } + } + } + + private int _threadSleep; + public static DirectProperty ThreadSleepProperty = + AvaloniaProperty.RegisterDirect(nameof(ThreadSleep), c => c.ThreadSleep, (c, v) => c.ThreadSleep = v); + + public int ThreadSleep + { + get => _threadSleep; + set => SetAndRaise(ThreadSleepProperty, ref _threadSleep, value); + } + + private bool _drawOnlyPoints; + public static DirectProperty DrawOnlyPointsProperty = + AvaloniaProperty.RegisterDirect(nameof(DrawOnlyPoints), c => c.DrawOnlyPoints, (c, v) => c.DrawOnlyPoints = v); + + public bool DrawOnlyPoints + { + get => _drawOnlyPoints; + set => SetAndRaise(DrawOnlyPointsProperty, ref _drawOnlyPoints, value); + } + + private string? _status; + public static DirectProperty StatusProperty = + AvaloniaProperty.RegisterDirect(nameof(DrawOnlyPoints), c => c.Status, (c, v) => c.Status = v, + defaultBindingMode: Avalonia.Data.BindingMode.TwoWay); + + public string? Status + { + get => _status; + set => SetAndRaise(StatusProperty, ref _status, value); + } + + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnAttachedToVisualTree(e); + + _statusUpdated = DispatcherTimer.Run(() => + { + if (_stopwatch.Elapsed.TotalMilliseconds > 250) + { + Status = $@"Events per second: {(_events / _stopwatch.Elapsed.TotalSeconds)} +PointerUpdateKind: {_lastProperties?.PointerUpdateKind} +Last PointerUpdateKind != Other: {_lastNonOtherUpdateKind} +IsLeftButtonPressed: {_lastProperties?.IsLeftButtonPressed} +IsRightButtonPressed: {_lastProperties?.IsRightButtonPressed} +IsMiddleButtonPressed: {_lastProperties?.IsMiddleButtonPressed} +IsXButton1Pressed: {_lastProperties?.IsXButton1Pressed} +IsXButton2Pressed: {_lastProperties?.IsXButton2Pressed} +IsBarrelButtonPressed: {_lastProperties?.IsBarrelButtonPressed} +IsEraser: {_lastProperties?.IsEraser} +IsInverted: {_lastProperties?.IsInverted} +Pressure: {_lastProperties?.Pressure} +XTilt: {_lastProperties?.XTilt} +YTilt: {_lastProperties?.YTilt} +Twist: {_lastProperties?.Twist}"; + _stopwatch.Restart(); + _events = 0; + } + + return true; + }, TimeSpan.FromMilliseconds(10)); + } + + protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnDetachedFromVisualTree(e); + + _statusUpdated?.Dispose(); + } + + void HandleEvent(PointerEventArgs e) + { + _events++; + + if (_threadSleep != 0) + { + Thread.Sleep(_threadSleep); + } + InvalidateVisual(); + + var lastPointer = e.GetCurrentPoint(this); + _lastProperties = lastPointer.Properties; + + if (_lastProperties.PointerUpdateKind != PointerUpdateKind.Other) + { + _lastNonOtherUpdateKind = _lastProperties.PointerUpdateKind; + } + + if (e.RoutedEvent == PointerReleasedEvent && e.Pointer.Type == PointerType.Touch) + { + _pointers.Remove(e.Pointer.Id); + return; + } + + if (e.Pointer.Type != PointerType.Pen + || lastPointer.Properties.Pressure > 0) + { + if (!_pointers.TryGetValue(e.Pointer.Id, out var pt)) + _pointers[e.Pointer.Id] = pt = new PointerPoints(); + pt.HandleEvent(e, this); + } + } + + public override void Render(DrawingContext context) + { + context.FillRectangle(Brushes.White, Bounds); + foreach (var pt in _pointers.Values) + pt.Render(context, _drawOnlyPoints); + base.Render(context); + } + + protected override void OnPointerPressed(PointerPressedEventArgs e) + { + if (e.ClickCount == 2) + { + _pointers.Clear(); + InvalidateVisual(); + return; + } + + HandleEvent(e); + base.OnPointerPressed(e); + } + + protected override void OnPointerMoved(PointerEventArgs e) + { + HandleEvent(e); + base.OnPointerMoved(e); + } + + protected override void OnPointerReleased(PointerReleasedEventArgs e) + { + HandleEvent(e); + base.OnPointerReleased(e); + } + + protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e) + { + _lastProperties = null; + base.OnPointerCaptureLost(e); + } +} diff --git a/samples/ControlCatalog/Pages/PointerContactsTab.cs b/samples/ControlCatalog/Pages/PointerContactsTab.cs new file mode 100644 index 0000000000..b6aabebf99 --- /dev/null +++ b/samples/ControlCatalog/Pages/PointerContactsTab.cs @@ -0,0 +1,109 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Linq; + +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Media; +using Avalonia.Media.Immutable; + +namespace ControlCatalog.Pages; + +public class PointerContactsTab : Control +{ + class PointerInfo + { + public Point Point { get; set; } + public Color Color { get; set; } + } + + private static Color[] AllColors = new[] + { + Colors.Aqua, + Colors.Beige, + Colors.Chartreuse, + Colors.Coral, + Colors.Fuchsia, + Colors.Crimson, + Colors.Lavender, + Colors.Orange, + Colors.Orchid, + Colors.ForestGreen, + Colors.SteelBlue, + Colors.PapayaWhip, + Colors.PaleVioletRed, + Colors.Goldenrod, + Colors.Maroon, + Colors.Moccasin, + Colors.Navy, + Colors.Wheat, + Colors.Violet, + Colors.Sienna, + Colors.Indigo, + Colors.Honeydew + }; + + private Dictionary _pointers = new Dictionary(); + + public PointerContactsTab() + { + ClipToBounds = true; + } + + void UpdatePointer(PointerEventArgs e) + { + if (!_pointers.TryGetValue(e.Pointer, out var info)) + { + if (e.RoutedEvent == PointerMovedEvent) + return; + var colors = AllColors.Except(_pointers.Values.Select(c => c.Color)).ToArray(); + var color = colors[new Random().Next(0, colors.Length - 1)]; + _pointers[e.Pointer] = info = new PointerInfo { Color = color }; + } + + info.Point = e.GetPosition(this); + InvalidateVisual(); + } + + protected override void OnPointerPressed(PointerPressedEventArgs e) + { + UpdatePointer(e); + e.Pointer.Capture(this); + e.Handled = true; + base.OnPointerPressed(e); + } + + protected override void OnPointerMoved(PointerEventArgs e) + { + UpdatePointer(e); + e.Handled = true; + base.OnPointerMoved(e); + } + + protected override void OnPointerReleased(PointerReleasedEventArgs e) + { + _pointers.Remove(e.Pointer); + e.Handled = true; + InvalidateVisual(); + } + + protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e) + { + _pointers.Remove(e.Pointer); + InvalidateVisual(); + } + + public override void Render(DrawingContext context) + { + context.FillRectangle(Brushes.Transparent, new Rect(default, Bounds.Size)); + foreach (var pt in _pointers.Values) + { + var brush = new ImmutableSolidColorBrush(pt.Color); + + context.DrawEllipse(brush, null, pt.Point, 75, 75); + } + } +} diff --git a/samples/ControlCatalog/Pages/PointersPage.cs b/samples/ControlCatalog/Pages/PointersPage.cs deleted file mode 100644 index 0377993d2c..0000000000 --- a/samples/ControlCatalog/Pages/PointersPage.cs +++ /dev/null @@ -1,322 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reactive.Linq; -using System.Runtime.InteropServices; -using System.Threading; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.Documents; -using Avalonia.Input; -using Avalonia.Layout; -using Avalonia.Media; -using Avalonia.Media.Immutable; -using Avalonia.Threading; -using Avalonia.VisualTree; - -namespace ControlCatalog.Pages; - -public class PointersPage : Decorator -{ - public PointersPage() - { - Child = new TabControl - { - Items = new[] - { - new TabItem() { Header = "Contacts", Content = new PointerContactsTab() }, - new TabItem() { Header = "IntermediatePoints", Content = new PointerIntermediatePointsTab() } - } - }; - } - - - class PointerContactsTab : Control - { - class PointerInfo - { - public Point Point { get; set; } - public Color Color { get; set; } - } - - private static Color[] AllColors = new[] - { - Colors.Aqua, - Colors.Beige, - Colors.Chartreuse, - Colors.Coral, - Colors.Fuchsia, - Colors.Crimson, - Colors.Lavender, - Colors.Orange, - Colors.Orchid, - Colors.ForestGreen, - Colors.SteelBlue, - Colors.PapayaWhip, - Colors.PaleVioletRed, - Colors.Goldenrod, - Colors.Maroon, - Colors.Moccasin, - Colors.Navy, - Colors.Wheat, - Colors.Violet, - Colors.Sienna, - Colors.Indigo, - Colors.Honeydew - }; - - private Dictionary _pointers = new Dictionary(); - - public PointerContactsTab() - { - ClipToBounds = true; - } - - void UpdatePointer(PointerEventArgs e) - { - if (!_pointers.TryGetValue(e.Pointer, out var info)) - { - if (e.RoutedEvent == PointerMovedEvent) - return; - var colors = AllColors.Except(_pointers.Values.Select(c => c.Color)).ToArray(); - var color = colors[new Random().Next(0, colors.Length - 1)]; - _pointers[e.Pointer] = info = new PointerInfo {Color = color}; - } - - info.Point = e.GetPosition(this); - InvalidateVisual(); - } - - protected override void OnPointerPressed(PointerPressedEventArgs e) - { - UpdatePointer(e); - e.Pointer.Capture(this); - e.Handled = true; - base.OnPointerPressed(e); - } - - protected override void OnPointerMoved(PointerEventArgs e) - { - UpdatePointer(e); - e.Handled = true; - base.OnPointerMoved(e); - } - - protected override void OnPointerReleased(PointerReleasedEventArgs e) - { - _pointers.Remove(e.Pointer); - e.Handled = true; - InvalidateVisual(); - } - - protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e) - { - _pointers.Remove(e.Pointer); - InvalidateVisual(); - } - - public override void Render(DrawingContext context) - { - context.FillRectangle(Brushes.Transparent, new Rect(default, Bounds.Size)); - foreach (var pt in _pointers.Values) - { - var brush = new ImmutableSolidColorBrush(pt.Color); - - context.DrawEllipse(brush, null, pt.Point, 75, 75); - } - } - } - - public class PointerIntermediatePointsTab : Decorator - { - public PointerIntermediatePointsTab() - { - this[TextElement.ForegroundProperty] = Brushes.Black; - var slider = new Slider - { - Margin = new Thickness(5), - Minimum = 0, - Maximum = 500 - }; - - var status = new TextBlock() - { - HorizontalAlignment = HorizontalAlignment.Left, - VerticalAlignment = VerticalAlignment.Top, - }; - Child = new Grid - { - Children = - { - new PointerCanvas(slider, status), - new Border - { - Background = Brushes.LightYellow, - Child = new StackPanel - { - Children = - { - new StackPanel - { - Orientation = Orientation.Horizontal, - Children = - { - new TextBlock { Text = "Thread sleep:" }, - new TextBlock() - { - [!TextBlock.TextProperty] =slider.GetObservable(Slider.ValueProperty) - .Select(x=>x.ToString()).ToBinding() - } - } - }, - slider - } - }, - - HorizontalAlignment = HorizontalAlignment.Right, - VerticalAlignment = VerticalAlignment.Top, - Width = 300, - Height = 60 - }, - status - } - }; - } - - class PointerCanvas : Control - { - private readonly Slider _slider; - private readonly TextBlock _status; - private int _events; - private Stopwatch _stopwatch = Stopwatch.StartNew(); - private Dictionary _pointers = new(); - class PointerPoints - { - struct CanvasPoint - { - public IBrush Brush; - public Point Point; - public double Radius; - } - - readonly CanvasPoint[] _points = new CanvasPoint[1000]; - int _index; - - public void Render(DrawingContext context) - { - - CanvasPoint? prev = null; - for (var c = 0; c < _points.Length; c++) - { - var i = (c + _index) % _points.Length; - var pt = _points[i]; - if (prev.HasValue && prev.Value.Brush != null && pt.Brush != null) - context.DrawLine(new Pen(Brushes.Black), prev.Value.Point, pt.Point); - prev = pt; - if (pt.Brush != null) - context.DrawEllipse(pt.Brush, null, pt.Point, pt.Radius, pt.Radius); - - } - - } - - void AddPoint(Point pt, IBrush brush, double radius) - { - _points[_index] = new CanvasPoint { Point = pt, Brush = brush, Radius = radius }; - _index = (_index + 1) % _points.Length; - } - - public void HandleEvent(PointerEventArgs e, Visual v) - { - e.Handled = true; - if (e.RoutedEvent == PointerPressedEvent) - AddPoint(e.GetPosition(v), Brushes.Green, 10); - else if (e.RoutedEvent == PointerReleasedEvent) - AddPoint(e.GetPosition(v), Brushes.Red, 10); - else - { - var pts = e.GetIntermediatePoints(v); - for (var c = 0; c < pts.Count; c++) - { - var pt = pts[c]; - AddPoint(pt.Position, c == pts.Count - 1 ? Brushes.Blue : Brushes.Black, - c == pts.Count - 1 ? 5 : 2); - } - } - } - } - - public PointerCanvas(Slider slider, TextBlock status) - { - _slider = slider; - _status = status; - DispatcherTimer.Run(() => - { - if (_stopwatch.Elapsed.TotalSeconds > 1) - { - _status.Text = "Events per second: " + (_events / _stopwatch.Elapsed.TotalSeconds); - _stopwatch.Restart(); - _events = 0; - } - - return this.GetVisualRoot() != null; - }, TimeSpan.FromMilliseconds(10)); - } - - - void HandleEvent(PointerEventArgs e) - { - _events++; - Thread.Sleep((int)_slider.Value); - InvalidateVisual(); - - if (e.RoutedEvent == PointerReleasedEvent && e.Pointer.Type == PointerType.Touch) - { - _pointers.Remove(e.Pointer.Id); - return; - } - - if (!_pointers.TryGetValue(e.Pointer.Id, out var pt)) - _pointers[e.Pointer.Id] = pt = new PointerPoints(); - pt.HandleEvent(e, this); - - - } - - public override void Render(DrawingContext context) - { - context.FillRectangle(Brushes.White, Bounds); - foreach(var pt in _pointers.Values) - pt.Render(context); - base.Render(context); - } - - protected override void OnPointerPressed(PointerPressedEventArgs e) - { - if (e.ClickCount == 2) - { - _pointers.Clear(); - InvalidateVisual(); - return; - } - - HandleEvent(e); - base.OnPointerPressed(e); - } - - protected override void OnPointerMoved(PointerEventArgs e) - { - HandleEvent(e); - base.OnPointerMoved(e); - } - - protected override void OnPointerReleased(PointerReleasedEventArgs e) - { - HandleEvent(e); - base.OnPointerReleased(e); - } - } - - } -} diff --git a/samples/ControlCatalog/Pages/PointersPage.xaml b/samples/ControlCatalog/Pages/PointersPage.xaml new file mode 100644 index 0000000000..c39106f29e --- /dev/null +++ b/samples/ControlCatalog/Pages/PointersPage.xaml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Capture 1 + + + Capture 2 + + + + + diff --git a/samples/ControlCatalog/Pages/PointersPage.xaml.cs b/samples/ControlCatalog/Pages/PointersPage.xaml.cs new file mode 100644 index 0000000000..6fc468e37f --- /dev/null +++ b/samples/ControlCatalog/Pages/PointersPage.xaml.cs @@ -0,0 +1,78 @@ +using System; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Interactivity; +using Avalonia.Markup.Xaml; + +namespace ControlCatalog.Pages; + +public class PointersPage : UserControl +{ + public PointersPage() + { + this.InitializeComponent(); + + var border1 = this.Get("BorderCapture1"); + var border2 = this.Get("BorderCapture2"); + + border1.PointerPressed += Border_PointerPressed; + border1.PointerReleased += Border_PointerReleased; + border1.PointerCaptureLost += Border_PointerCaptureLost; + border1.PointerMoved += Border_PointerUpdated; + border1.PointerEntered += Border_PointerUpdated; + border1.PointerExited += Border_PointerUpdated; + + border2.PointerPressed += Border_PointerPressed; + border2.PointerReleased += Border_PointerReleased; + border2.PointerCaptureLost += Border_PointerCaptureLost; + border2.PointerMoved += Border_PointerUpdated; + border2.PointerEntered += Border_PointerUpdated; + border2.PointerExited += Border_PointerUpdated; + } + + private void Border_PointerUpdated(object sender, PointerEventArgs e) + { + var textBlock = (TextBlock)((Border)sender).Child; + var position = e.GetPosition((Border)sender); + textBlock.Text = @$"Type: {e.Pointer.Type} +Captured: {e.Pointer.Captured == sender} +PointerId: {e.Pointer.Id} +Position: {(int)position.X} {(int)position.Y}"; + e.Handled = true; + } + + private void Border_PointerCaptureLost(object sender, PointerCaptureLostEventArgs e) + { + var textBlock = (TextBlock)((Border)sender).Child; + textBlock.Text = @$"Type: {e.Pointer.Type} +Captured: {e.Pointer.Captured == sender} +PointerId: {e.Pointer.Id} +Position: ??? ???"; + e.Handled = true; + } + + private void Border_PointerReleased(object sender, PointerReleasedEventArgs e) + { + if (e.Pointer.Captured == sender) + { + e.Pointer.Capture(null); + e.Handled = true; + } + else + { + throw new InvalidOperationException("How?"); + } + } + + private void Border_PointerPressed(object sender, PointerPressedEventArgs e) + { + e.Pointer.Capture((Border)sender); + e.Handled = true; + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } +} diff --git a/samples/IntegrationTestApp/MainWindow.axaml b/samples/IntegrationTestApp/MainWindow.axaml index 19ac68b15b..3377979199 100644 --- a/samples/IntegrationTestApp/MainWindow.axaml +++ b/samples/IntegrationTestApp/MainWindow.axaml @@ -4,6 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="IntegrationTestApp.MainWindow" + Name="MainWindow" Title="IntegrationTestApp"> @@ -94,6 +95,26 @@ + + + + + + NonOwned + Owned + Modal + + + Manual + CenterScreen + CenterOwner + + + + + + + diff --git a/samples/IntegrationTestApp/MainWindow.axaml.cs b/samples/IntegrationTestApp/MainWindow.axaml.cs index 9a612aa94d..9e180b12c5 100644 --- a/samples/IntegrationTestApp/MainWindow.axaml.cs +++ b/samples/IntegrationTestApp/MainWindow.axaml.cs @@ -3,8 +3,10 @@ using System.Collections.Generic; using System.Linq; using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Interactivity; using Avalonia.Markup.Xaml; +using Avalonia.VisualTree; namespace IntegrationTestApp { @@ -46,6 +48,62 @@ namespace IntegrationTestApp } } + private void ShowWindow() + { + var sizeTextBox = this.GetControl("ShowWindowSize"); + var modeComboBox = this.GetControl("ShowWindowMode"); + var locationComboBox = this.GetControl("ShowWindowLocation"); + var size = !string.IsNullOrWhiteSpace(sizeTextBox.Text) ? Size.Parse(sizeTextBox.Text) : (Size?)null; + var owner = (Window)this.GetVisualRoot()!; + + var window = new ShowWindowTest + { + WindowStartupLocation = (WindowStartupLocation)locationComboBox.SelectedIndex, + }; + + if (size.HasValue) + { + window.Width = size.Value.Width; + window.Height = size.Value.Height; + } + + sizeTextBox.Text = string.Empty; + + switch (modeComboBox.SelectedIndex) + { + case 0: + window.Show(); + break; + case 1: + window.Show(owner); + break; + case 2: + window.ShowDialog(owner); + break; + } + } + + private void SendToBack() + { + var lifetime = (ClassicDesktopStyleApplicationLifetime)Application.Current!.ApplicationLifetime!; + + foreach (var window in lifetime.Windows) + { + window.Activate(); + } + } + + private void RestoreAll() + { + var lifetime = (ClassicDesktopStyleApplicationLifetime)Application.Current!.ApplicationLifetime!; + + foreach (var window in lifetime.Windows) + { + if (window.WindowState == WindowState.Minimized) + window.WindowState = WindowState.Normal; + } + } + private void MenuClicked(object? sender, RoutedEventArgs e) { var clickedMenuItemTextBlock = this.FindControl("ClickedMenuItem"); @@ -64,6 +122,14 @@ namespace IntegrationTestApp this.FindControl("BasicListBox").SelectedIndex = -1; if (source?.Name == "MenuClickedMenuItemReset") this.FindControl("ClickedMenuItem").Text = "None"; + if (source?.Name == "ShowWindow") + ShowWindow(); + if (source?.Name == "SendToBack") + SendToBack(); + if (source?.Name == "ExitFullscreen") + WindowState = WindowState.Normal; + if (source?.Name == "RestoreAll") + RestoreAll(); } } } diff --git a/samples/IntegrationTestApp/ShowWindowTest.axaml b/samples/IntegrationTestApp/ShowWindowTest.axaml new file mode 100644 index 0000000000..40c1642e91 --- /dev/null +++ b/samples/IntegrationTestApp/ShowWindowTest.axaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + Normal + Minimized + Maximized + Fullscreen + + + diff --git a/samples/IntegrationTestApp/ShowWindowTest.axaml.cs b/samples/IntegrationTestApp/ShowWindowTest.axaml.cs new file mode 100644 index 0000000000..001f186761 --- /dev/null +++ b/samples/IntegrationTestApp/ShowWindowTest.axaml.cs @@ -0,0 +1,40 @@ +using System; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Interactivity; +using Avalonia.Markup.Xaml; +using Avalonia.Rendering; + +namespace IntegrationTestApp +{ + public class ShowWindowTest : Window + { + public ShowWindowTest() + { + InitializeComponent(); + DataContext = this; + PositionChanged += (s, e) => this.GetControl("Position").Text = $"{Position}"; + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + + protected override void OnOpened(EventArgs e) + { + base.OnOpened(e); + var scaling = PlatformImpl!.DesktopScaling; + this.GetControl("Position").Text = $"{Position}"; + this.GetControl("ScreenRect").Text = $"{Screens.ScreenFromVisual(this)?.WorkingArea}"; + this.GetControl("Scaling").Text = $"{scaling}"; + + if (Owner is not null) + { + var ownerRect = this.GetControl("OwnerRect"); + var owner = (Window)Owner; + ownerRect.Text = $"{owner.Position}, {PixelSize.FromSize(owner.FrameSize!.Value, scaling)}"; + } + } + } +} diff --git a/src/Avalonia.Base/Assets/BiDi.trie b/src/Avalonia.Base/Assets/BiDi.trie deleted file mode 100644 index 1c6122e2f1..0000000000 Binary files a/src/Avalonia.Base/Assets/BiDi.trie and /dev/null differ diff --git a/src/Avalonia.Base/Assets/GraphemeBreak.trie b/src/Avalonia.Base/Assets/GraphemeBreak.trie deleted file mode 100644 index 482bf9b44d..0000000000 Binary files a/src/Avalonia.Base/Assets/GraphemeBreak.trie and /dev/null differ diff --git a/src/Avalonia.Base/Assets/UnicodeData.trie b/src/Avalonia.Base/Assets/UnicodeData.trie deleted file mode 100644 index 46175ea644..0000000000 Binary files a/src/Avalonia.Base/Assets/UnicodeData.trie and /dev/null differ diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 1f14ddede4..6633eabb5d 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -935,7 +935,8 @@ namespace Avalonia public void Dispose() { - _subscription.Dispose(); + // _subscription can be null, if Subscribe failed with an exception. + _subscription?.Dispose(); _owner._directBindings!.Remove(this); } diff --git a/src/Avalonia.Base/Controls/ResourceDictionary.cs b/src/Avalonia.Base/Controls/ResourceDictionary.cs index 3af14daa83..77863e5101 100644 --- a/src/Avalonia.Base/Controls/ResourceDictionary.cs +++ b/src/Avalonia.Base/Controls/ResourceDictionary.cs @@ -1,38 +1,45 @@ using System; +using System.Collections; using System.Collections.Generic; -using System.Collections.Specialized; +using System.Linq; using Avalonia.Collections; -using Avalonia.Metadata; - -#nullable enable namespace Avalonia.Controls { /// /// An indexed dictionary of resources. /// - public class ResourceDictionary : AvaloniaDictionary, IResourceDictionary + public class ResourceDictionary : IResourceDictionary { + private Dictionary? _inner; private IResourceHost? _owner; private AvaloniaList? _mergedDictionaries; /// /// Initializes a new instance of the class. /// - public ResourceDictionary() - { - CollectionChanged += OnCollectionChanged; - } + public ResourceDictionary() { } /// /// Initializes a new instance of the class. /// - public ResourceDictionary(IResourceHost owner) - : this() + public ResourceDictionary(IResourceHost owner) => Owner = owner; + + public int Count => _inner?.Count ?? 0; + + public object? this[object key] { - Owner = owner; + get => _inner?[key]; + set + { + Inner[key] = value; + Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + } } + public ICollection Keys => (ICollection?)_inner?.Keys ?? Array.Empty(); + public ICollection Values => (ICollection?)_inner?.Values ?? Array.Empty(); + public IResourceHost? Owner { get => _owner; @@ -80,7 +87,7 @@ namespace Avalonia.Controls { get { - if (Count > 0) + if (_inner?.Count > 0) { return true; } @@ -100,11 +107,43 @@ namespace Avalonia.Controls } } + bool ICollection>.IsReadOnly => false; + + private Dictionary Inner => _inner ??= new(); + public event EventHandler? OwnerChanged; + public void Add(object key, object? value) + { + Inner.Add(key, value); + Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + } + + public void Clear() + { + if (_inner?.Count > 0) + { + _inner.Clear(); + Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + } + } + + public bool ContainsKey(object key) => _inner?.ContainsKey(key) ?? false; + + public bool Remove(object key) + { + if (_inner?.Remove(key) == true) + { + Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + return true; + } + + return false; + } + public bool TryGetResource(object key, out object? value) { - if (TryGetValue(key, out value)) + if (_inner is not null && _inner.TryGetValue(key, out value)) { return true; } @@ -120,9 +159,52 @@ namespace Avalonia.Controls } } + value = null; return false; } + public bool TryGetValue(object key, out object? value) + { + if (_inner is not null) + return _inner.TryGetValue(key, out value); + value = null; + return false; + } + + + void ICollection>.Add(KeyValuePair item) + { + Add(item.Key, item.Value); + } + + bool ICollection>.Contains(KeyValuePair item) + { + return (_inner as ICollection>)?.Contains(item) ?? false; + } + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + (_inner as ICollection>)?.CopyTo(array, arrayIndex); + } + + bool ICollection>.Remove(KeyValuePair item) + { + if ((_inner as ICollection>)?.Remove(item) == true) + { + Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + return true; + } + + return false; + } + + public IEnumerator> GetEnumerator() + { + return _inner?.GetEnumerator() ?? Enumerable.Empty>().GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + void IResourceProvider.AddOwner(IResourceHost owner) { owner = owner ?? throw new ArgumentNullException(nameof(owner)); @@ -134,7 +216,7 @@ namespace Avalonia.Controls Owner = owner; - var hasResources = Count > 0; + var hasResources = _inner?.Count > 0; if (_mergedDictionaries is object) { @@ -159,7 +241,7 @@ namespace Avalonia.Controls { Owner = null; - var hasResources = Count > 0; + var hasResources = _inner?.Count > 0; if (_mergedDictionaries is object) { @@ -176,10 +258,5 @@ namespace Avalonia.Controls } } } - - private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) - { - Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); - } } } diff --git a/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs b/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs index f8cedb636f..889b7e3b82 100644 --- a/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs +++ b/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs @@ -66,7 +66,8 @@ namespace Avalonia.Input.GestureRecognizers public void PointerPressed(PointerPressedEventArgs e) { - if (e.Pointer.IsPrimary && e.Pointer.Type == PointerType.Touch) + if (e.Pointer.IsPrimary && + (e.Pointer.Type == PointerType.Touch || e.Pointer.Type == PointerType.Pen)) { EndGesture(); _tracking = e.Pointer; @@ -101,7 +102,7 @@ namespace Avalonia.Input.GestureRecognizers if (_scrolling) { var vector = _trackedRootPoint - rootPoint; - var elapsed = _lastMoveTimestamp.HasValue ? + var elapsed = _lastMoveTimestamp.HasValue && _lastMoveTimestamp < e.Timestamp ? TimeSpan.FromMilliseconds(e.Timestamp - _lastMoveTimestamp.Value) : TimeSpan.Zero; diff --git a/src/Avalonia.Base/Input/IInputElement.cs b/src/Avalonia.Base/Input/IInputElement.cs index 78001143d7..43ac87d008 100644 --- a/src/Avalonia.Base/Input/IInputElement.cs +++ b/src/Avalonia.Base/Input/IInputElement.cs @@ -42,12 +42,12 @@ namespace Avalonia.Input /// /// Occurs when the pointer enters the control. /// - event EventHandler? PointerEnter; + event EventHandler? PointerEntered; /// /// Occurs when the pointer leaves the control. /// - event EventHandler? PointerLeave; + event EventHandler? PointerExited; /// /// Occurs when the pointer is pressed over the control. diff --git a/src/Avalonia.Base/Input/IKeyboardDevice.cs b/src/Avalonia.Base/Input/IKeyboardDevice.cs index c8db8bf16f..80aebc02bc 100644 --- a/src/Avalonia.Base/Input/IKeyboardDevice.cs +++ b/src/Avalonia.Base/Input/IKeyboardDevice.cs @@ -43,12 +43,17 @@ namespace Avalonia.Input Control = 2, Shift = 4, Meta = 8, + LeftMouseButton = 16, RightMouseButton = 32, MiddleMouseButton = 64, XButton1MouseButton = 128, XButton2MouseButton = 256, - KeyboardMask = Alt | Control | Shift | Meta + KeyboardMask = Alt | Control | Shift | Meta, + + PenInverted = 512, + PenEraser = 1024, + PenBarrelButton = 2048 } [NotClientImplementable] diff --git a/src/Avalonia.Base/Input/IPenDevice.cs b/src/Avalonia.Base/Input/IPenDevice.cs new file mode 100644 index 0000000000..1cc0fcf76d --- /dev/null +++ b/src/Avalonia.Base/Input/IPenDevice.cs @@ -0,0 +1,10 @@ +namespace Avalonia.Input +{ + /// + /// Represents a pen/stylus device. + /// + public interface IPenDevice : IPointerDevice + { + + } +} diff --git a/src/Avalonia.Base/Input/IPointer.cs b/src/Avalonia.Base/Input/IPointer.cs index 66aeacadc9..52605bb6ae 100644 --- a/src/Avalonia.Base/Input/IPointer.cs +++ b/src/Avalonia.Base/Input/IPointer.cs @@ -2,20 +2,59 @@ using Avalonia.Metadata; namespace Avalonia.Input { + /// + /// Identifies specific pointer generated by input device. + /// + /// + /// Some devices, for instance, touchscreen might generate a pointer on each physical contact. + /// [NotClientImplementable] public interface IPointer { + /// + /// Gets a unique identifier for the input pointer. + /// int Id { get; } + + /// + /// Captures pointer input to the specified control. + /// + /// The control. + /// + /// When an element captures the pointer, it receives pointer input whether the cursor is + /// within the control's bounds or not. The current pointer capture control is exposed + /// by the property. + /// void Capture(IInputElement? control); + + /// + /// Gets the control that is currently capturing by the pointer, if any. + /// + /// + /// When an element captures the pointer, it receives pointer input whether the cursor is + /// within the control's bounds or not. To set the pointer capture, call the + /// method. + /// IInputElement? Captured { get; } + + /// + /// Gets the pointer device type. + /// PointerType Type { get; } + + /// + /// Gets a value that indicates whether the input is from the primary pointer when multiple pointers are registered. + /// bool IsPrimary { get; } - } + /// + /// Enumerates pointer device types. + /// public enum PointerType { Mouse, - Touch + Touch, + Pen } } diff --git a/src/Avalonia.Base/Input/InputElement.cs b/src/Avalonia.Base/Input/InputElement.cs index f4e25ebada..d0130258c3 100644 --- a/src/Avalonia.Base/Input/InputElement.cs +++ b/src/Avalonia.Base/Input/InputElement.cs @@ -128,16 +128,20 @@ namespace Avalonia.Input RoutingStrategies.Tunnel | RoutingStrategies.Bubble); /// - /// Defines the event. + /// Defines the event. /// - public static readonly RoutedEvent PointerEnterEvent = - RoutedEvent.Register(nameof(PointerEnter), RoutingStrategies.Direct); + public static readonly RoutedEvent PointerEnteredEvent = + RoutedEvent.Register( + nameof(PointerEntered), + RoutingStrategies.Direct); /// - /// Defines the event. + /// Defines the event. /// - public static readonly RoutedEvent PointerLeaveEvent = - RoutedEvent.Register(nameof(PointerLeave), RoutingStrategies.Direct); + public static readonly RoutedEvent PointerExitedEvent = + RoutedEvent.Register( + nameof(PointerExited), + RoutingStrategies.Direct); /// /// Defines the event. @@ -208,8 +212,8 @@ namespace Avalonia.Input KeyDownEvent.AddClassHandler((x, e) => x.OnKeyDown(e)); KeyUpEvent.AddClassHandler((x, e) => x.OnKeyUp(e)); TextInputEvent.AddClassHandler((x, e) => x.OnTextInput(e)); - PointerEnterEvent.AddClassHandler((x, e) => x.OnPointerEnterCore(e)); - PointerLeaveEvent.AddClassHandler((x, e) => x.OnPointerLeaveCore(e)); + PointerEnteredEvent.AddClassHandler((x, e) => x.OnPointerEnteredCore(e)); + PointerExitedEvent.AddClassHandler((x, e) => x.OnPointerExitedCore(e)); PointerMovedEvent.AddClassHandler((x, e) => x.OnPointerMoved(e)); PointerPressedEvent.AddClassHandler((x, e) => x.OnPointerPressed(e)); PointerReleasedEvent.AddClassHandler((x, e) => x.OnPointerReleased(e)); @@ -279,19 +283,19 @@ namespace Avalonia.Input /// /// Occurs when the pointer enters the control. /// - public event EventHandler? PointerEnter + public event EventHandler? PointerEntered { - add { AddHandler(PointerEnterEvent, value); } - remove { RemoveHandler(PointerEnterEvent, value); } + add { AddHandler(PointerEnteredEvent, value); } + remove { RemoveHandler(PointerEnteredEvent, value); } } /// /// Occurs when the pointer leaves the control. /// - public event EventHandler? PointerLeave + public event EventHandler? PointerExited { - add { AddHandler(PointerLeaveEvent, value); } - remove { RemoveHandler(PointerLeaveEvent, value); } + add { AddHandler(PointerExitedEvent, value); } + remove { RemoveHandler(PointerExitedEvent, value); } } /// @@ -539,18 +543,18 @@ namespace Avalonia.Input } /// - /// Called before the event occurs. + /// Called before the event occurs. /// /// The event args. - protected virtual void OnPointerEnter(PointerEventArgs e) + protected virtual void OnPointerEntered(PointerEventArgs e) { } /// - /// Called before the event occurs. + /// Called before the event occurs. /// /// The event args. - protected virtual void OnPointerLeave(PointerEventArgs e) + protected virtual void OnPointerExited(PointerEventArgs e) { } @@ -561,7 +565,9 @@ namespace Avalonia.Input protected virtual void OnPointerMoved(PointerEventArgs e) { if (_gestureRecognizers?.HandlePointerMoved(e) == true) + { e.Handled = true; + } } /// @@ -571,7 +577,9 @@ namespace Avalonia.Input protected virtual void OnPointerPressed(PointerPressedEventArgs e) { if (_gestureRecognizers?.HandlePointerPressed(e) == true) + { e.Handled = true; + } } /// @@ -581,7 +589,9 @@ namespace Avalonia.Input protected virtual void OnPointerReleased(PointerReleasedEventArgs e) { if (_gestureRecognizers?.HandlePointerReleased(e) == true) + { e.Handled = true; + } } /// @@ -634,23 +644,23 @@ namespace Avalonia.Input } /// - /// Called before the event occurs. + /// Called before the event occurs. /// /// The event args. - private void OnPointerEnterCore(PointerEventArgs e) + private void OnPointerEnteredCore(PointerEventArgs e) { IsPointerOver = true; - OnPointerEnter(e); + OnPointerEntered(e); } /// - /// Called before the event occurs. + /// Called before the event occurs. /// /// The event args. - private void OnPointerLeaveCore(PointerEventArgs e) + private void OnPointerExitedCore(PointerEventArgs e) { IsPointerOver = false; - OnPointerLeave(e); + OnPointerExited(e); } /// diff --git a/src/Avalonia.Base/Input/PenDevice.cs b/src/Avalonia.Base/Input/PenDevice.cs new file mode 100644 index 0000000000..d22b48562c --- /dev/null +++ b/src/Avalonia.Base/Input/PenDevice.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Linq; +using Avalonia.Input.Raw; +using Avalonia.Platform; +using Avalonia.VisualTree; + +namespace Avalonia.Input +{ + /// + /// Represents a pen/stylus device. + /// + public class PenDevice : IPenDevice, IDisposable + { + private readonly Dictionary _pointers = new(); + private readonly Dictionary _lastPositions = new(); + private int _clickCount; + private Rect _lastClickRect; + private ulong _lastClickTime; + private MouseButton _lastMouseDownButton; + + private bool _disposed; + + public void ProcessRawEvent(RawInputEventArgs e) + { + if (!e.Handled && e is RawPointerEventArgs margs) + ProcessRawEvent(margs); + } + + private void ProcessRawEvent(RawPointerEventArgs e) + { + e = e ?? throw new ArgumentNullException(nameof(e)); + + if (!_pointers.TryGetValue(e.RawPointerId, out var pointer)) + { + if (e.Type == RawPointerEventType.LeftButtonUp + || e.Type == RawPointerEventType.TouchEnd) + return; + + _pointers[e.RawPointerId] = pointer = new Pointer(Pointer.GetNextFreeId(), + PointerType.Pen, _pointers.Count == 0); + } + + _lastPositions[e.RawPointerId] = e.Root.PointToScreen(e.Position); + + var props = new PointerPointProperties(e.InputModifiers, e.Type.ToUpdateKind(), + e.Point.Twist, e.Point.Pressure, e.Point.XTilt, e.Point.YTilt); + var keyModifiers = e.InputModifiers.ToKeyModifiers(); + + bool shouldReleasePointer = false; + switch (e.Type) + { + case RawPointerEventType.LeaveWindow: + shouldReleasePointer = true; + break; + case RawPointerEventType.LeftButtonDown: + e.Handled = PenDown(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult); + break; + case RawPointerEventType.LeftButtonUp: + e.Handled = PenUp(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult); + break; + case RawPointerEventType.Move: + e.Handled = PenMove(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult, e.IntermediatePoints); + break; + } + + if (shouldReleasePointer) + { + pointer.Dispose(); + _pointers.Remove(e.RawPointerId); + _lastPositions.Remove(e.RawPointerId); + } + } + + private bool PenDown(Pointer pointer, ulong timestamp, + IInputElement root, Point p, PointerPointProperties properties, + KeyModifiers inputModifiers, IInputElement? hitTest) + { + var source = pointer.Captured ?? hitTest; + + if (source != null) + { + pointer.Capture(source); + var settings = AvaloniaLocator.Current.GetService(); + var doubleClickTime = settings?.DoubleClickTime.TotalMilliseconds ?? 500; + var doubleClickSize = settings?.DoubleClickSize ?? new Size(4, 4); + + if (!_lastClickRect.Contains(p) || timestamp - _lastClickTime > doubleClickTime) + { + _clickCount = 0; + } + + ++_clickCount; + _lastClickTime = timestamp; + _lastClickRect = new Rect(p, new Size()) + .Inflate(new Thickness(doubleClickSize.Width / 2, doubleClickSize.Height / 2)); + _lastMouseDownButton = properties.PointerUpdateKind.GetMouseButton(); + var e = new PointerPressedEventArgs(source, pointer, root, p, timestamp, properties, inputModifiers, _clickCount); + source.RaiseEvent(e); + return e.Handled; + } + + return false; + } + + private bool PenMove(Pointer pointer, ulong timestamp, + IInputRoot root, Point p, PointerPointProperties properties, + KeyModifiers inputModifiers, IInputElement? hitTest, + Lazy?>? intermediatePoints) + { + var source = pointer.Captured ?? hitTest; + + if (source is not null) + { + var e = new PointerEventArgs(InputElement.PointerMovedEvent, source, pointer, root, + p, timestamp, properties, inputModifiers, intermediatePoints); + + source.RaiseEvent(e); + return e.Handled; + } + + return false; + } + + private bool PenUp(Pointer pointer, ulong timestamp, + IInputElement root, Point p, PointerPointProperties properties, + KeyModifiers inputModifiers, IInputElement? hitTest) + { + var source = pointer.Captured ?? hitTest; + + if (source is not null) + { + var e = new PointerReleasedEventArgs(source, pointer, root, p, timestamp, properties, inputModifiers, + _lastMouseDownButton); + + source?.RaiseEvent(e); + pointer.Capture(null); + return e.Handled; + } + + return false; + } + + public void Dispose() + { + if (_disposed) + return; + var values = _pointers.Values.ToList(); + _pointers.Clear(); + _disposed = true; + foreach (var p in values) + p.Dispose(); + } + + [Obsolete] + IInputElement? IPointerDevice.Captured => _pointers.Values + .FirstOrDefault(p => p.IsPrimary)?.Captured; + + [Obsolete] + void IPointerDevice.Capture(IInputElement? control) => _pointers.Values + .FirstOrDefault(p => p.IsPrimary)?.Capture(control); + + [Obsolete] + Point IPointerDevice.GetPosition(IVisual relativeTo) => new Point(-1, -1); + + public IPointer? TryGetPointer(RawPointerEventArgs ev) + { + return _pointers.TryGetValue(ev.RawPointerId, out var pointer) + ? pointer + : null; + } + } +} diff --git a/src/Avalonia.Base/Input/PointerEventArgs.cs b/src/Avalonia.Base/Input/PointerEventArgs.cs index 5495802920..058c2f9cc1 100644 --- a/src/Avalonia.Base/Input/PointerEventArgs.cs +++ b/src/Avalonia.Base/Input/PointerEventArgs.cs @@ -67,7 +67,14 @@ namespace Avalonia.Input public IPointer? TryGetPointer(RawPointerEventArgs ev) => _ev.Pointer; } + /// + /// Gets specific pointer generated by input device. + /// public IPointer Pointer { get; } + + /// + /// Gets the time when the input occurred. + /// public ulong Timestamp { get; } private IPointerDevice? _device; @@ -91,7 +98,10 @@ namespace Avalonia.Input return mods; } } - + + /// + /// Gets a value that indicates which key modifiers were active at the time that the pointer event was initiated. + /// public KeyModifiers KeyModifiers { get; } private Point GetPosition(Point pt, IVisual? relativeTo) @@ -102,7 +112,12 @@ namespace Avalonia.Input return pt; return pt * _rootVisual.TransformToVisual(relativeTo) ?? default; } - + + /// + /// Gets the pointer position relative to a control. + /// + /// The control. + /// The pointer position in the control's coordinates. public Point GetPosition(IVisual? relativeTo) => GetPosition(_rootVisualPosition, relativeTo); [Obsolete("Use GetCurrentPoint")] @@ -130,7 +145,8 @@ namespace Avalonia.Input for (var c = 0; c < previousPoints.Count; c++) { var pt = previousPoints[c]; - points[c] = new PointerPoint(Pointer, GetPosition(pt.Position, relativeTo), _properties); + var pointProperties = new PointerPointProperties(_properties, pt); + points[c] = new PointerPoint(Pointer, GetPosition(pt.Position, relativeTo), pointProperties); } points[points.Length - 1] = GetCurrentPoint(relativeTo); diff --git a/src/Avalonia.Base/Input/PointerOverPreProcessor.cs b/src/Avalonia.Base/Input/PointerOverPreProcessor.cs index d22252893d..67d1eea7e3 100644 --- a/src/Avalonia.Base/Input/PointerOverPreProcessor.cs +++ b/src/Avalonia.Base/Input/PointerOverPreProcessor.cs @@ -97,7 +97,7 @@ namespace Avalonia.Input // Do not pass rootVisual, when we have unknown (negative) position, // so GetPosition won't return invalid values. var hasPosition = position.X >= 0 && position.Y >= 0; - var e = new PointerEventArgs(InputElement.PointerLeaveEvent, element, pointer, + var e = new PointerEventArgs(InputElement.PointerExitedEvent, element, pointer, hasPosition ? root : null, hasPosition ? position : default, timestamp, properties, inputModifiers); @@ -177,7 +177,7 @@ namespace Avalonia.Input el = root.PointerOverElement; - var e = new PointerEventArgs(InputElement.PointerLeaveEvent, el, pointer, root, position, + var e = new PointerEventArgs(InputElement.PointerExitedEvent, el, pointer, root, position, timestamp, properties, inputModifiers); if (el != null && branch != null && !el.IsAttachedToVisualTree) { @@ -195,7 +195,7 @@ namespace Avalonia.Input el = root.PointerOverElement = element; _lastPointer = (pointer, root.PointToScreen(position)); - e.RoutedEvent = InputElement.PointerEnterEvent; + e.RoutedEvent = InputElement.PointerEnteredEvent; while (el != null && el != branch) { diff --git a/src/Avalonia.Base/Input/PointerPoint.cs b/src/Avalonia.Base/Input/PointerPoint.cs index 9f8285a8e1..71145b5cb0 100644 --- a/src/Avalonia.Base/Input/PointerPoint.cs +++ b/src/Avalonia.Base/Input/PointerPoint.cs @@ -1,5 +1,10 @@ +using Avalonia.Input.Raw; + namespace Avalonia.Input { + /// + /// Provides basic properties for the input pointer associated with a single mouse, pen/stylus, or touch contact. + /// public sealed class PointerPoint { public PointerPoint(IPointer pointer, Point position, PointerPointProperties properties) @@ -8,25 +13,109 @@ namespace Avalonia.Input Position = position; Properties = properties; } + + /// + /// Gets specific pointer generated by input device. + /// public IPointer Pointer { get; } + + /// + /// Gets extended information about the input pointer. + /// public PointerPointProperties Properties { get; } + + /// + /// Gets the location of the pointer input in client coordinates. + /// public Point Position { get; } } + /// + /// Provides extended properties for a PointerPoint object. + /// public sealed class PointerPointProperties { + /// + /// Gets a value that indicates whether the pointer input was triggered by the primary action mode of an input device. + /// public bool IsLeftButtonPressed { get; } + + /// + /// Gets a value that indicates whether the pointer input was triggered by the tertiary action mode of an input device. + /// public bool IsMiddleButtonPressed { get; } + + /// + /// Gets a value that indicates whether the pointer input was triggered by the secondary action mode (if supported) of an input device. + /// public bool IsRightButtonPressed { get; } + + /// + /// Gets a value that indicates whether the pointer input was triggered by the first extended mouse button (XButton1). + /// public bool IsXButton1Pressed { get; } + + /// + /// Gets a value that indicates whether the pointer input was triggered by the second extended mouse button (XButton2). + /// public bool IsXButton2Pressed { get; } + /// + /// Gets a value that indicates whether the barrel button of the pen/stylus device is pressed. + /// + public bool IsBarrelButtonPressed { get; } + + /// + /// Gets a value that indicates whether the input is from a pen eraser. + /// + public bool IsEraser { get; } + + /// + /// Gets a value that indicates whether the digitizer pen is inverted. + /// + public bool IsInverted { get; } + + /// + /// Gets the clockwise rotation in degrees of a pen device around its own major axis (such as when the user spins the pen in their fingers). + /// + /// + /// A value between 0.0 and 359.0 in degrees of rotation. The default value is 0.0. + /// + public float Twist { get; } + + /// + /// Gets a value that indicates the force that the pointer device (typically a pen/stylus) exerts on the surface of the digitizer. + /// + /// + /// A value from 0 to 1.0. The default value is 0.5. + /// + public float Pressure { get; } = 0.5f; + + /// + /// Gets the plane angle between the Y-Z plane and the plane that contains the Y axis and the axis of the input device (typically a pen/stylus). + /// + /// + /// The value is 0.0 when the finger or pen is perpendicular to the digitizer surface, between 0.0 and 90.0 when tilted to the right of perpendicular, and between 0.0 and -90.0 when tilted to the left of perpendicular. The default value is 0.0. + /// + public float XTilt { get; } + + /// + /// Gets the plane angle between the X-Z plane and the plane that contains the X axis and the axis of the input device (typically a pen/stylus). + /// + /// + /// The value is 0.0 when the finger or pen is perpendicular to the digitizer surface, between 0.0 and 90.0 when tilted towards the user, and between 0.0 and -90.0 when tilted away from the user. The default value is 0.0. + /// + public float YTilt { get; } + + /// + /// Gets the kind of pointer state change. + /// public PointerUpdateKind PointerUpdateKind { get; } private PointerPointProperties() - { + { } - + public PointerPointProperties(RawInputModifiers modifiers, PointerUpdateKind kind) { PointerUpdateKind = kind; @@ -36,10 +125,13 @@ namespace Avalonia.Input IsRightButtonPressed = modifiers.HasAllFlags(RawInputModifiers.RightMouseButton); IsXButton1Pressed = modifiers.HasAllFlags(RawInputModifiers.XButton1MouseButton); IsXButton2Pressed = modifiers.HasAllFlags(RawInputModifiers.XButton2MouseButton); + IsInverted = modifiers.HasAllFlags(RawInputModifiers.PenInverted); + IsEraser = modifiers.HasAllFlags(RawInputModifiers.PenEraser); + IsBarrelButtonPressed = modifiers.HasAllFlags(RawInputModifiers.PenBarrelButton); // The underlying input source might be reporting the previous state, // so make sure that we reflect the current state - + if (kind == PointerUpdateKind.LeftButtonPressed) IsLeftButtonPressed = true; if (kind == PointerUpdateKind.LeftButtonReleased) @@ -62,6 +154,33 @@ namespace Avalonia.Input IsXButton2Pressed = false; } + public PointerPointProperties(RawInputModifiers modifiers, PointerUpdateKind kind, + float twist, float pressure, float xTilt, float yTilt + ) : this (modifiers, kind) + { + Twist = twist; + Pressure = pressure; + XTilt = xTilt; + YTilt = yTilt; + } + + internal PointerPointProperties(PointerPointProperties basedOn, RawPointerPoint rawPoint) + { + IsLeftButtonPressed = basedOn.IsLeftButtonPressed; + IsMiddleButtonPressed = basedOn.IsMiddleButtonPressed; + IsRightButtonPressed = basedOn.IsRightButtonPressed; + IsXButton1Pressed = basedOn.IsXButton1Pressed; + IsXButton2Pressed = basedOn.IsXButton2Pressed; + IsInverted = basedOn.IsInverted; + IsEraser = basedOn.IsEraser; + IsBarrelButtonPressed = basedOn.IsBarrelButtonPressed; + + Twist = rawPoint.Twist; + Pressure = rawPoint.Pressure; + XTilt = rawPoint.XTilt; + YTilt = rawPoint.YTilt; + } + public static PointerPointProperties None { get; } = new PointerPointProperties(); } diff --git a/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs b/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs index 8b9d7c161d..0e4e0ed3e2 100644 --- a/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs +++ b/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs @@ -56,11 +56,12 @@ namespace Avalonia.Input.Raw Contract.Requires(device != null); Contract.Requires(root != null); + Point = new RawPointerPoint(); Position = position; Type = type; InputModifiers = inputModifiers; } - + /// /// Initializes a new instance of the class. /// @@ -87,6 +88,11 @@ namespace Avalonia.Input.Raw InputModifiers = inputModifiers; } + /// + /// Gets the raw pointer identifier. + /// + public long RawPointerId { get; set; } + /// /// Gets the pointer properties and position, in client DIPs. /// @@ -130,10 +136,17 @@ namespace Avalonia.Input.Raw /// Pointer position, in client DIPs. /// public Point Position { get; set; } - + + public float Twist { get; set; } + public float Pressure { get; set; } + public float XTilt { get; set; } + public float YTilt { get; set; } + + public RawPointerPoint() { - Position = default; + this = default; + Pressure = 0.5f; } } } diff --git a/src/Avalonia.Base/Input/Raw/RawTouchEventArgs.cs b/src/Avalonia.Base/Input/Raw/RawTouchEventArgs.cs index 020b40e55b..6706a45f48 100644 --- a/src/Avalonia.Base/Input/Raw/RawTouchEventArgs.cs +++ b/src/Avalonia.Base/Input/Raw/RawTouchEventArgs.cs @@ -1,15 +1,26 @@ +using System; + namespace Avalonia.Input.Raw { public class RawTouchEventArgs : RawPointerEventArgs { public RawTouchEventArgs(IInputDevice device, ulong timestamp, IInputRoot root, RawPointerEventType type, Point position, RawInputModifiers inputModifiers, - long touchPointId) + long rawPointerId) : base(device, timestamp, root, type, position, inputModifiers) { - TouchPointId = touchPointId; + RawPointerId = rawPointerId; + } + + public RawTouchEventArgs(IInputDevice device, ulong timestamp, IInputRoot root, + RawPointerEventType type, RawPointerPoint point, RawInputModifiers inputModifiers, + long rawPointerId) + : base(device, timestamp, root, type, point, inputModifiers) + { + RawPointerId = rawPointerId; } - public long TouchPointId { get; set; } + [Obsolete("Use RawPointerId")] + public long TouchPointId { get => RawPointerId; set => RawPointerId = value; } } } diff --git a/src/Avalonia.Base/Input/TouchDevice.cs b/src/Avalonia.Base/Input/TouchDevice.cs index 54dcc4051e..e914d860fd 100644 --- a/src/Avalonia.Base/Input/TouchDevice.cs +++ b/src/Avalonia.Base/Input/TouchDevice.cs @@ -40,14 +40,14 @@ namespace Avalonia.Input { if (ev.Handled || _disposed) return; - var args = (RawTouchEventArgs)ev; - if (!_pointers.TryGetValue(args.TouchPointId, out var pointer)) + var args = (RawPointerEventArgs)ev; + if (!_pointers.TryGetValue(args.RawPointerId, out var pointer)) { if (args.Type == RawPointerEventType.TouchEnd) return; var hit = args.InputHitTestResult; - _pointers[args.TouchPointId] = pointer = new Pointer(Pointer.GetNextFreeId(), + _pointers[args.RawPointerId] = pointer = new Pointer(Pointer.GetNextFreeId(), PointerType.Touch, _pointers.Count == 0); pointer.Capture(hit); } @@ -88,7 +88,7 @@ namespace Avalonia.Input if (args.Type == RawPointerEventType.TouchEnd) { - _pointers.Remove(args.TouchPointId); + _pointers.Remove(args.RawPointerId); using (pointer) { target.RaiseEvent(new PointerReleasedEventArgs(target, pointer, @@ -101,7 +101,7 @@ namespace Avalonia.Input if (args.Type == RawPointerEventType.TouchCancel) { - _pointers.Remove(args.TouchPointId); + _pointers.Remove(args.RawPointerId); using (pointer) pointer.Capture(null); _lastPointer = null; @@ -129,8 +129,7 @@ namespace Avalonia.Input public IPointer? TryGetPointer(RawPointerEventArgs ev) { - return ev is RawTouchEventArgs args - && _pointers.TryGetValue(args.TouchPointId, out var pointer) + return _pointers.TryGetValue(ev.RawPointerId, out var pointer) ? pointer : null; } diff --git a/src/Avalonia.Base/Layout/LayoutHelper.cs b/src/Avalonia.Base/Layout/LayoutHelper.cs index d24be57d2b..404d19906a 100644 --- a/src/Avalonia.Base/Layout/LayoutHelper.cs +++ b/src/Avalonia.Base/Layout/LayoutHelper.cs @@ -36,11 +36,28 @@ namespace Avalonia.Layout public static Size MeasureChild(ILayoutable? control, Size availableSize, Thickness padding, Thickness borderThickness) { - return MeasureChild(control, availableSize, padding + borderThickness); + if (IsParentLayoutRounded(control, out double scale)) + { + padding = RoundLayoutThickness(padding, scale, scale); + borderThickness = RoundLayoutThickness(borderThickness, scale, scale); + } + + if (control != null) + { + control.Measure(availableSize.Deflate(padding + borderThickness)); + return control.DesiredSize.Inflate(padding + borderThickness); + } + + return new Size().Inflate(padding + borderThickness); } public static Size MeasureChild(ILayoutable? control, Size availableSize, Thickness padding) { + if (IsParentLayoutRounded(control, out double scale)) + { + padding = RoundLayoutThickness(padding, scale, scale); + } + if (control != null) { control.Measure(availableSize.Deflate(padding)); @@ -137,7 +154,7 @@ namespace Avalonia.Layout /// /// Rounds a size to integer values for layout purposes, compensating for high DPI screen - /// coordinates. + /// coordinates by rounding the size up to the nearest pixel. /// /// Input size. /// DPI along x-dimension. @@ -149,9 +166,9 @@ namespace Avalonia.Layout /// associated with the UseLayoutRounding property and should not be used as a general rounding /// utility. /// - public static Size RoundLayoutSize(Size size, double dpiScaleX, double dpiScaleY) + public static Size RoundLayoutSizeUp(Size size, double dpiScaleX, double dpiScaleY) { - return new Size(RoundLayoutValue(size.Width, dpiScaleX), RoundLayoutValue(size.Height, dpiScaleY)); + return new Size(RoundLayoutValueUp(size.Width, dpiScaleX), RoundLayoutValueUp(size.Height, dpiScaleY)); } /// @@ -178,10 +195,9 @@ namespace Avalonia.Layout ); } - - /// - /// Calculates the value to be used for layout rounding at high DPI. + /// Calculates the value to be used for layout rounding at high DPI by rounding the value + /// up or down to the nearest pixel. /// /// Input value to be rounded. /// Ratio of screen's DPI to layout DPI @@ -217,7 +233,46 @@ namespace Avalonia.Layout return newValue; } - + + /// + /// Calculates the value to be used for layout rounding at high DPI by rounding the value up + /// to the nearest pixel. + /// + /// Input value to be rounded. + /// Ratio of screen's DPI to layout DPI + /// Adjusted value that will produce layout rounding on screen at high dpi. + /// + /// This is a layout helper method. It takes DPI into account and also does not return + /// the rounded value if it is unacceptable for layout, e.g. Infinity or NaN. It's a helper + /// associated with the UseLayoutRounding property and should not be used as a general rounding + /// utility. + /// + public static double RoundLayoutValueUp(double value, double dpiScale) + { + double newValue; + + // If DPI == 1, don't use DPI-aware rounding. + if (!MathUtilities.IsOne(dpiScale)) + { + newValue = Math.Ceiling(value * dpiScale) / dpiScale; + + // If rounding produces a value unacceptable to layout (NaN, Infinity or MaxValue), + // use the original value. + if (double.IsNaN(newValue) || + double.IsInfinity(newValue) || + MathUtilities.AreClose(newValue, double.MaxValue)) + { + newValue = value; + } + } + else + { + newValue = Math.Ceiling(value); + } + + return newValue; + } + /// /// Calculates the min and max height for a control. Ported from WPF. /// diff --git a/src/Avalonia.Base/Layout/Layoutable.cs b/src/Avalonia.Base/Layout/Layoutable.cs index f30925f489..101e867d56 100644 --- a/src/Avalonia.Base/Layout/Layoutable.cs +++ b/src/Avalonia.Base/Layout/Layoutable.cs @@ -548,6 +548,14 @@ namespace Avalonia.Layout if (IsVisible) { var margin = Margin; + var useLayoutRounding = UseLayoutRounding; + var scale = 1.0; + + if (useLayoutRounding) + { + scale = LayoutHelper.GetLayoutScale(this); + margin = LayoutHelper.RoundLayoutThickness(margin, scale, scale); + } ApplyStyling(); ApplyTemplate(); @@ -584,16 +592,14 @@ namespace Avalonia.Layout height = Math.Min(height, MaxHeight); height = Math.Max(height, MinHeight); - width = Math.Min(width, availableSize.Width); - height = Math.Min(height, availableSize.Height); - - if (UseLayoutRounding) + if (useLayoutRounding) { - var scale = LayoutHelper.GetLayoutScale(this); - width = LayoutHelper.RoundLayoutValue(width, scale); - height = LayoutHelper.RoundLayoutValue(height, scale); + (width, height) = LayoutHelper.RoundLayoutSizeUp(new Size(width, height), scale, scale); } + width = Math.Min(width, availableSize.Width); + height = Math.Min(height, availableSize.Height); + return NonNegative(new Size(width, height).Inflate(margin)); } else @@ -678,8 +684,8 @@ namespace Avalonia.Layout if (useLayoutRounding) { - size = LayoutHelper.RoundLayoutSize(size, scale, scale); - availableSizeMinusMargins = LayoutHelper.RoundLayoutSize(availableSizeMinusMargins, scale, scale); + size = LayoutHelper.RoundLayoutSizeUp(size, scale, scale); + availableSizeMinusMargins = LayoutHelper.RoundLayoutSizeUp(availableSizeMinusMargins, scale, scale); } size = ArrangeOverride(size).Constrain(size); diff --git a/src/Avalonia.Base/Media/GlyphRun.cs b/src/Avalonia.Base/Media/GlyphRun.cs index 6f1fa03990..ac87d521a5 100644 --- a/src/Avalonia.Base/Media/GlyphRun.cs +++ b/src/Avalonia.Base/Media/GlyphRun.cs @@ -734,10 +734,9 @@ namespace Avalonia.Media private void Set(ref T field, T value) { - if (_glyphRunImpl != null) - { - throw new InvalidOperationException("GlyphRun can't be changed after it has been initialized.'"); - } + _glyphRunImpl?.Dispose(); + + _glyphRunImpl = null; _glyphRunMetrics = null; diff --git a/src/Avalonia.Base/Media/TextAlignment.cs b/src/Avalonia.Base/Media/TextAlignment.cs index b1a394e157..94416ccde2 100644 --- a/src/Avalonia.Base/Media/TextAlignment.cs +++ b/src/Avalonia.Base/Media/TextAlignment.cs @@ -19,5 +19,28 @@ namespace Avalonia.Media /// The text is right-aligned. /// Right, + + /// + /// The beginning of the text is aligned to the edge of the available space. + /// + Start, + + /// + /// The end of the text is aligned to the edge of the available space. + /// + End, + + /// + /// Text alignment is inferred from the text content. + /// + /// + /// When the TextAlignment property is set to DetectFromContent, alignment is inferred from the text content of the control. For example, English text is left aligned, and Arabic text is right aligned. + /// + DetectFromContent, + + /// + /// Text is justified within the available space. + /// + Justify } } diff --git a/src/Avalonia.Base/Media/TextFormatting/InterWordJustification.cs b/src/Avalonia.Base/Media/TextFormatting/InterWordJustification.cs new file mode 100644 index 0000000000..df83ada34a --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/InterWordJustification.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using Avalonia.Media.TextFormatting.Unicode; + +namespace Avalonia.Media.TextFormatting +{ + internal class InterWordJustification : JustificationProperties + { + public InterWordJustification(double width) + { + Width = width; + } + + public override double Width { get; } + + public override void Justify(TextLine textLine) + { + var paragraphWidth = Width; + + if (double.IsInfinity(paragraphWidth)) + { + return; + } + + if (textLine.NewLineLength > 0) + { + return; + } + + var textLineBreak = textLine.TextLineBreak; + + if (textLineBreak is not null && textLineBreak.TextEndOfLine is not null) + { + if (textLineBreak.RemainingRuns is null || textLineBreak.RemainingRuns.Count == 0) + { + return; + } + } + + var breakOportunities = new Queue(); + + foreach (var textRun in textLine.TextRuns) + { + var text = textRun.Text; + + if (text.IsEmpty) + { + continue; + } + + var start = text.Start; + + var lineBreakEnumerator = new LineBreakEnumerator(text); + + while (lineBreakEnumerator.MoveNext()) + { + var currentBreak = lineBreakEnumerator.Current; + + if (!currentBreak.Required && currentBreak.PositionWrap != text.Length) + { + breakOportunities.Enqueue(start + currentBreak.PositionMeasure); + } + } + } + + if (breakOportunities.Count == 0) + { + return; + } + + var remainingSpace = Math.Max(0, paragraphWidth - textLine.WidthIncludingTrailingWhitespace); + var spacing = remainingSpace / breakOportunities.Count; + + foreach (var textRun in textLine.TextRuns) + { + var text = textRun.Text; + + if (text.IsEmpty) + { + continue; + } + + if (textRun is ShapedTextCharacters shapedText) + { + var glyphRun = shapedText.GlyphRun; + var shapedBuffer = shapedText.ShapedBuffer; + var currentPosition = text.Start; + + while (breakOportunities.Count > 0) + { + var characterIndex = breakOportunities.Dequeue(); + + if (characterIndex < currentPosition) + { + continue; + } + + var glyphIndex = glyphRun.FindGlyphIndex(characterIndex); + var glyphInfo = shapedBuffer.GlyphInfos[glyphIndex]; + + shapedBuffer.GlyphInfos[glyphIndex] = new GlyphInfo(glyphInfo.GlyphIndex, glyphInfo.GlyphCluster, glyphInfo.GlyphAdvance + spacing); + } + + glyphRun.GlyphAdvances = shapedBuffer.GlyphAdvances; + } + } + } + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/JustificationProperties.cs b/src/Avalonia.Base/Media/TextFormatting/JustificationProperties.cs new file mode 100644 index 0000000000..620ad17189 --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/JustificationProperties.cs @@ -0,0 +1,16 @@ +namespace Avalonia.Media.TextFormatting +{ + public abstract class JustificationProperties + { + /// + /// Gets the width in which the range is justified. + /// + public abstract double Width { get; } + + /// + /// Justifies given text line. + /// + /// Text line to collapse. + public abstract void Justify(TextLine textLine); + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/TextFormatterImpl.cs b/src/Avalonia.Base/Media/TextFormatting/TextFormatterImpl.cs index 4205268bc6..73dd3366aa 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextFormatterImpl.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextFormatterImpl.cs @@ -15,7 +15,7 @@ namespace Avalonia.Media.TextFormatting TextParagraphProperties paragraphProperties, TextLineBreak? previousLineBreak = null) { var textWrapping = paragraphProperties.TextWrapping; - FlowDirection flowDirection; + FlowDirection resolvedFlowDirection; TextLineBreak? nextLineBreak = null; List drawableTextRuns; @@ -24,17 +24,17 @@ namespace Avalonia.Media.TextFormatting if (previousLineBreak?.RemainingRuns != null) { - flowDirection = previousLineBreak.FlowDirection; + resolvedFlowDirection = previousLineBreak.FlowDirection; drawableTextRuns = previousLineBreak.RemainingRuns.ToList(); nextLineBreak = previousLineBreak; } else { - drawableTextRuns = ShapeTextRuns(textRuns, paragraphProperties, out flowDirection); + drawableTextRuns = ShapeTextRuns(textRuns, paragraphProperties, out resolvedFlowDirection); if (nextLineBreak == null && textEndOfLine != null) { - nextLineBreak = new TextLineBreak(textEndOfLine, flowDirection); + nextLineBreak = new TextLineBreak(textEndOfLine, resolvedFlowDirection); } } @@ -45,7 +45,7 @@ namespace Avalonia.Media.TextFormatting case TextWrapping.NoWrap: { textLine = new TextLineImpl(drawableTextRuns, firstTextSourceIndex, textSourceLength, - paragraphWidth, paragraphProperties, flowDirection, nextLineBreak); + paragraphWidth, paragraphProperties, resolvedFlowDirection, nextLineBreak); textLine.FinalizeLine(); @@ -55,7 +55,7 @@ namespace Avalonia.Media.TextFormatting case TextWrapping.Wrap: { textLine = PerformTextWrapping(drawableTextRuns, firstTextSourceIndex, paragraphWidth, paragraphProperties, - flowDirection, nextLineBreak); + resolvedFlowDirection, nextLineBreak); break; } default: @@ -159,7 +159,6 @@ namespace Avalonia.Media.TextFormatting { var flowDirection = paragraphProperties.FlowDirection; var drawableTextRuns = new List(); - var biDiData = new BidiData((sbyte)flowDirection); foreach (var textRun in textRuns) @@ -174,10 +173,9 @@ namespace Avalonia.Media.TextFormatting { biDiData.Append(textRun.Text); } - } - var biDi = BidiAlgorithm.Instance.Value!; + var biDi = new BidiAlgorithm(); biDi.Process(biDiData); @@ -290,9 +288,7 @@ namespace Avalonia.Media.TextFormatting /// The text characters to form from. /// The bidi levels. /// - private static IEnumerable> CoalesceLevels( - IReadOnlyList textCharacters, - ReadOnlySlice levels) + private static IEnumerable> CoalesceLevels(IReadOnlyList textCharacters, ArraySlice levels) { if (levels.Length == 0) { @@ -404,9 +400,9 @@ namespace Avalonia.Media.TextFormatting { endOfLine = textEndOfLine; - textRuns.Add(textRun); + textSourceLength += textEndOfLine.TextSourceLength; - textSourceLength += textRun.TextSourceLength; + textRuns.Add(textRun); break; } @@ -431,9 +427,9 @@ namespace Avalonia.Media.TextFormatting break; } - case DrawableTextRun drawableTextRun: + default: { - textRuns.Add(drawableTextRun); + textRuns.Add(textRun); break; } } @@ -552,11 +548,11 @@ namespace Avalonia.Media.TextFormatting /// The first text source index. /// The paragraph width. /// The text paragraph properties. - /// + /// /// The current line break if the line was explicitly broken. /// The wrapped text line. private static TextLineImpl PerformTextWrapping(List textRuns, int firstTextSourceIndex, - double paragraphWidth, TextParagraphProperties paragraphProperties, FlowDirection flowDirection, + double paragraphWidth, TextParagraphProperties paragraphProperties, FlowDirection resolvedFlowDirection, TextLineBreak? currentLineBreak) { if(textRuns.Count == 0) @@ -684,16 +680,16 @@ namespace Avalonia.Media.TextFormatting var remainingCharacters = splitResult.Second; var lineBreak = remainingCharacters?.Count > 0 ? - new TextLineBreak(currentLineBreak?.TextEndOfLine, flowDirection, remainingCharacters) : + new TextLineBreak(currentLineBreak?.TextEndOfLine, resolvedFlowDirection, remainingCharacters) : null; if (lineBreak is null && currentLineBreak?.TextEndOfLine != null) { - lineBreak = new TextLineBreak(currentLineBreak.TextEndOfLine, flowDirection); + lineBreak = new TextLineBreak(currentLineBreak.TextEndOfLine, resolvedFlowDirection); } var textLine = new TextLineImpl(splitResult.First, firstTextSourceIndex, measuredLength, - paragraphWidth, paragraphProperties, flowDirection, + paragraphWidth, paragraphProperties, resolvedFlowDirection, lineBreak); return textLine.FinalizeLine(); diff --git a/src/Avalonia.Base/Media/TextFormatting/TextLayout.cs b/src/Avalonia.Base/Media/TextFormatting/TextLayout.cs index 4f7c43a6d1..f3af240c58 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextLayout.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextLayout.cs @@ -439,7 +439,7 @@ namespace Avalonia.Media.TextFormatting var textLine = TextFormatter.Current.FormatLine(_textSource, _textSourceLength, MaxWidth, _paragraphProperties, previousLine?.TextLineBreak); - if(textLine == null || textLine.Length == 0) + if(textLine == null || textLine.Length == 0 || textLine.TextRuns.Count == 0 && textLine.TextLineBreak?.TextEndOfLine is TextEndOfParagraph) { if(previousLine != null && previousLine.NewLineLength > 0) { @@ -501,6 +501,35 @@ namespace Avalonia.Media.TextFormatting Bounds = new Rect(left, 0, width, height); + if(_paragraphProperties.TextAlignment == TextAlignment.Justify) + { + var whitespaceWidth = 0d; + + foreach (var line in textLines) + { + var lineWhitespaceWidth = line.Width - line.WidthIncludingTrailingWhitespace; + + if(lineWhitespaceWidth > whitespaceWidth) + { + whitespaceWidth = lineWhitespaceWidth; + } + } + + var justificationWidth = width - whitespaceWidth; + + if(justificationWidth > 0) + { + var justificationProperties = new InterWordJustification(justificationWidth); + + for (var i = 0; i < textLines.Count - 1; i++) + { + var line = textLines[i]; + + line.Justify(justificationProperties); + } + } + } + return textLines; } diff --git a/src/Avalonia.Base/Media/TextFormatting/TextLine.cs b/src/Avalonia.Base/Media/TextFormatting/TextLine.cs index 1f69c15acc..c8a23097db 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextLine.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextLine.cs @@ -15,9 +15,15 @@ namespace Avalonia.Media.TextFormatting /// The contained text runs. /// public abstract IReadOnlyList TextRuns { get; } - + + /// + /// Gets the first TextSource position of the current line. + /// public abstract int FirstTextSourceIndex { get; } + /// + /// Gets the total number of TextSource positions of the current line. + /// public abstract int Length { get; } /// @@ -56,7 +62,7 @@ namespace Avalonia.Media.TextFormatting /// Gets a value that indicates whether content of the line overflows the specified paragraph width. /// /// - /// true, it the line overflows the specified paragraph width; otherwise, false. + /// true, the line overflows the specified paragraph width; otherwise, false. /// public abstract bool HasOverflowed { get; } @@ -75,7 +81,7 @@ namespace Avalonia.Media.TextFormatting /// The number of newline characters. /// public abstract int NewLineLength { get; } - + /// /// Gets the distance that black pixels extend beyond the bottom alignment edge of a line. /// @@ -149,6 +155,15 @@ namespace Avalonia.Media.TextFormatting /// public abstract TextLine Collapse(params TextCollapsingProperties[] collapsingPropertiesList); + /// + /// Create a justified line based on justification text properties. + /// + /// An object that represent the justification text properties. + /// + /// A value that represents a justified line that can be displayed. + /// + public abstract void Justify(JustificationProperties justificationProperties); + /// /// Gets the character hit corresponding to the specified distance from the beginning of the line. /// @@ -192,50 +207,5 @@ namespace Avalonia.Media.TextFormatting /// number of characters of the specified range /// an array of bounding rectangles. public abstract IReadOnlyList GetTextBounds(int firstTextSourceCharacterIndex, int textLength); - - /// - /// Gets the text line offset x. - /// - /// The line width. - /// The paragraph width including whitespace. - /// The paragraph width. - /// The text alignment. - /// The flow direction of the line. - /// The paragraph offset. - internal static double GetParagraphOffsetX(double width, double widthIncludingTrailingWhitespace, - double paragraphWidth, TextAlignment textAlignment, FlowDirection flowDirection) - { - if (double.IsPositiveInfinity(paragraphWidth)) - { - return 0; - } - - if (flowDirection == FlowDirection.LeftToRight) - { - switch (textAlignment) - { - case TextAlignment.Center: - return Math.Max(0, (paragraphWidth - width) / 2); - - case TextAlignment.Right: - return Math.Max(0, paragraphWidth - widthIncludingTrailingWhitespace); - - default: - return 0; - } - } - - switch (textAlignment) - { - case TextAlignment.Center: - return Math.Max(0, (paragraphWidth - width) / 2); - - case TextAlignment.Right: - return 0; - - default: - return Math.Max(0, paragraphWidth - widthIncludingTrailingWhitespace); - } - } } } diff --git a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs index 8b5e2cc2ce..7c686358e2 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs @@ -10,10 +10,10 @@ namespace Avalonia.Media.TextFormatting private readonly double _paragraphWidth; private readonly TextParagraphProperties _paragraphProperties; private TextLineMetrics _textLineMetrics; - private readonly FlowDirection _flowDirection; + private readonly FlowDirection _resolvedFlowDirection; public TextLineImpl(List textRuns, int firstTextSourceIndex, int length, double paragraphWidth, - TextParagraphProperties paragraphProperties, FlowDirection flowDirection = FlowDirection.LeftToRight, + TextParagraphProperties paragraphProperties, FlowDirection resolvedFlowDirection = FlowDirection.LeftToRight, TextLineBreak? lineBreak = null, bool hasCollapsed = false) { FirstTextSourceIndex = firstTextSourceIndex; @@ -25,7 +25,7 @@ namespace Avalonia.Media.TextFormatting _paragraphWidth = paragraphWidth; _paragraphProperties = paragraphProperties; - _flowDirection = flowDirection; + _resolvedFlowDirection = resolvedFlowDirection; } /// @@ -136,7 +136,7 @@ namespace Avalonia.Media.TextFormatting } var collapsedLine = new TextLineImpl(collapsedRuns, FirstTextSourceIndex, Length, _paragraphWidth, _paragraphProperties, - _flowDirection, TextLineBreak, true); + _resolvedFlowDirection, TextLineBreak, true); if (collapsedRuns.Count > 0) { @@ -144,7 +144,14 @@ namespace Avalonia.Media.TextFormatting } return collapsedLine; + } + /// + public override void Justify(JustificationProperties justificationProperties) + { + justificationProperties.Justify(this); + + _textLineMetrics = CreateLineMetrics(); } /// @@ -167,7 +174,7 @@ namespace Avalonia.Media.TextFormatting return shapedTextCharacters.GlyphRun.GetCharacterHitFromDistance(distance, out _); } - return _flowDirection == FlowDirection.LeftToRight ? + return _resolvedFlowDirection == FlowDirection.LeftToRight ? new CharacterHit(FirstTextSourceIndex) : new CharacterHit(FirstTextSourceIndex + Length); } @@ -260,7 +267,7 @@ namespace Avalonia.Media.TextFormatting //Look at the left and right edge of the current run if (currentRun.IsLeftToRight) { - if (_flowDirection == FlowDirection.LeftToRight && (lastRun == null || lastRun.IsLeftToRight)) + if (_resolvedFlowDirection == FlowDirection.LeftToRight && (lastRun == null || lastRun.IsLeftToRight)) { if (characterIndex <= currentPosition) { @@ -735,7 +742,7 @@ namespace Avalonia.Media.TextFormatting // Build up the collection of ordered runs. var run = _textRuns[0]; - OrderedBidiRun orderedRun = new(run, GetRunBidiLevel(run, _flowDirection)); + OrderedBidiRun orderedRun = new(run, GetRunBidiLevel(run, _resolvedFlowDirection)); var current = orderedRun; @@ -743,7 +750,7 @@ namespace Avalonia.Media.TextFormatting { run = _textRuns[i]; - current.Next = new OrderedBidiRun(run, GetRunBidiLevel(run, _flowDirection)); + current.Next = new OrderedBidiRun(run, GetRunBidiLevel(run, _resolvedFlowDirection)); current = current.Next; } @@ -762,7 +769,7 @@ namespace Avalonia.Media.TextFormatting { var currentRun = _textRuns[i]; - var level = GetRunBidiLevel(currentRun, _flowDirection); + var level = GetRunBidiLevel(currentRun, _resolvedFlowDirection); if (level > max) { @@ -1242,8 +1249,7 @@ namespace Avalonia.Media.TextFormatting } } - var start = GetParagraphOffsetX(width, widthIncludingWhitespace, _paragraphWidth, - _paragraphProperties.TextAlignment, _paragraphProperties.FlowDirection); + var start = GetParagraphOffsetX(width, widthIncludingWhitespace); if (!double.IsNaN(lineHeight) && !MathUtilities.IsZero(lineHeight)) { @@ -1257,6 +1263,55 @@ namespace Avalonia.Media.TextFormatting -ascent, trailingWhitespaceLength, width, widthIncludingWhitespace); } + /// + /// Gets the text line offset x. + /// + /// The line width. + /// The paragraph width including whitespace. + + /// The paragraph offset. + private double GetParagraphOffsetX(double width, double widthIncludingTrailingWhitespace) + { + if (double.IsPositiveInfinity(_paragraphWidth)) + { + return 0; + } + + var textAlignment = _paragraphProperties.TextAlignment; + var paragraphFlowDirection = _paragraphProperties.FlowDirection; + + switch (textAlignment) + { + case TextAlignment.Start: + { + textAlignment = paragraphFlowDirection == FlowDirection.LeftToRight ? TextAlignment.Left : TextAlignment.Right; + break; + } + case TextAlignment.End: + { + textAlignment = paragraphFlowDirection == FlowDirection.RightToLeft ? TextAlignment.Left : TextAlignment.Right; + break; + } + case TextAlignment.DetectFromContent: + { + textAlignment = _resolvedFlowDirection == FlowDirection.LeftToRight ? TextAlignment.Left : TextAlignment.Right; + break; + } + } + + switch (textAlignment) + { + case TextAlignment.Center: + return Math.Max(0, (_paragraphWidth - width) / 2); + + case TextAlignment.Right: + return Math.Max(0, _paragraphWidth - widthIncludingTrailingWhitespace); + + default: + return 0; + } + } + private sealed class OrderedBidiRun { public OrderedBidiRun(DrawableTextRun run, sbyte level) diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDi.trie.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDi.trie.cs new file mode 100644 index 0000000000..d489ad4106 --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDi.trie.cs @@ -0,0 +1,472 @@ +using System; +namespace Avalonia.Media.TextFormatting.Unicode +{ + internal static class BidiTrie + { + public static ReadOnlySpan Data => new byte[] + { + 0, 0, 16, 0, 0, 0, 0, 0, 64, 180, 0, 0, 116, 3, 0, 0, 124, 3, 0, 0, 132, 3, 0, 0, 140, 3, 0, 0, 164, 3, 0, 0, 172, 3, 0, 0, 180, 3, 0, 0, 188, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 194, 3, 0, 0, 202, 3, 0, 0, + 210, 3, 0, 0, 218, 3, 0, 0, 226, 3, 0, 0, 234, 3, 0, 0, 230, 3, 0, 0, 238, 3, 0, 0, 246, 3, 0, 0, 254, 3, 0, 0, 249, 3, 0, 0, 1, 4, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 9, 4, 0, 0, 17, 4, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 23, 4, 0, 0, 31, 4, 0, 0, 39, 4, 0, 0, + 47, 4, 0, 0, 55, 4, 0, 0, 63, 4, 0, 0, 69, 4, 0, 0, 77, 4, 0, 0, 82, 4, 0, 0, 90, 4, 0, 0, 93, 4, 0, 0, 101, 4, 0, 0, 108, 4, 0, 0, 116, 4, 0, 0, 122, 4, 0, 0, 130, 4, 0, 0, 129, 4, 0, 0, 137, 4, 0, 0, 145, 4, 0, 0, 153, 4, 0, 0, 24, 9, 0, 0, 31, 9, 0, 0, 35, 9, 0, 0, 62, 4, 0, 0, 199, 9, 0, 0, 62, 4, 0, 0, 22, 11, 0, 0, 207, 9, 0, 0, + 161, 4, 0, 0, 163, 4, 0, 0, 171, 4, 0, 0, 179, 4, 0, 0, 187, 4, 0, 0, 188, 4, 0, 0, 196, 4, 0, 0, 204, 4, 0, 0, 212, 4, 0, 0, 188, 4, 0, 0, 220, 4, 0, 0, 225, 4, 0, 0, 212, 4, 0, 0, 188, 4, 0, 0, 233, 4, 0, 0, 241, 4, 0, 0, 187, 4, 0, 0, 249, 4, 0, 0, 1, 5, 0, 0, 179, 4, 0, 0, 9, 5, 0, 0, 148, 3, 0, 0, 17, 5, 0, 0, 21, 5, 0, 0, 29, 5, 0, 0, + 31, 5, 0, 0, 39, 5, 0, 0, 47, 5, 0, 0, 187, 4, 0, 0, 188, 4, 0, 0, 55, 5, 0, 0, 179, 4, 0, 0, 11, 4, 0, 0, 59, 5, 0, 0, 196, 4, 0, 0, 179, 4, 0, 0, 187, 4, 0, 0, 148, 3, 0, 0, 67, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 73, 5, 0, 0, 81, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 85, 5, 0, 0, 93, 5, 0, 0, 148, 3, 0, 0, 97, 5, 0, 0, 104, 5, 0, 0, + 148, 3, 0, 0, 112, 5, 0, 0, 120, 5, 0, 0, 127, 5, 0, 0, 8, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 135, 5, 0, 0, 143, 5, 0, 0, 151, 5, 0, 0, 159, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 167, 5, 0, 0, 148, 3, 0, 0, 175, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 183, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 191, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 199, 5, 0, 0, 200, 4, 0, 0, 200, 4, 0, 0, 200, 4, 0, 0, 148, 3, 0, 0, 205, 5, 0, 0, 213, 5, 0, 0, 175, 5, 0, 0, 221, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 228, 5, 0, 0, + 185, 4, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 236, 5, 0, 0, 244, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 246, 5, 0, 0, 231, 9, 0, 0, 254, 5, 0, 0, 148, 3, 0, 0, 5, 6, 0, 0, 13, 6, 0, 0, 148, 3, 0, 0, 21, 6, 0, 0, 27, 11, 0, 0, 148, 3, 0, 0, 248, 4, 0, 0, 29, 6, 0, 0, 9, 5, 0, 0, 37, 6, 0, 0, 11, 4, 0, 0, 45, 6, 0, 0, + 148, 3, 0, 0, 52, 6, 0, 0, 148, 3, 0, 0, 57, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 63, 6, 0, 0, 71, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 78, 6, 0, 0, 86, 6, 0, 0, 90, 6, 0, 0, 98, 6, 0, 0, 163, 9, 0, 0, 223, 9, 0, 0, 106, 6, 0, 0, 114, 6, 0, 0, 171, 9, 0, 0, 175, 9, 0, 0, 130, 5, 0, 0, 122, 6, 0, 0, 130, 6, 0, 0, 138, 6, 0, 0, 148, 3, 0, 0, 146, 6, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, + 147, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 237, 9, 0, 0, 152, 6, 0, 0, 148, 3, 0, 0, 158, 6, 0, 0, 165, 6, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 11, 7, 0, 0, 243, 9, 0, 0, 231, 9, 0, 0, 171, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 178, 6, 0, 0, 231, 9, 0, 0, + 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 183, 6, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 251, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 2, 10, 0, 0, 9, 10, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 17, 10, 0, 0, 231, 9, 0, 0, 24, 10, 0, 0, 31, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, + 39, 10, 0, 0, 45, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 191, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 199, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 226, 3, 0, 0, 231, 9, 0, 0, 53, 10, 0, 0, 56, 10, 0, 0, 148, 3, 0, 0, + 64, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 71, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 79, 10, 0, 0, 85, 10, 0, 0, 207, 6, 0, 0, 215, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 223, 6, 0, 0, 183, 5, 0, 0, 148, 3, 0, 0, 187, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 231, 9, 0, 0, 198, 6, 0, 0, 201, 3, 0, 0, 148, 3, 0, 0, 231, 6, 0, 0, 239, 6, 0, 0, 148, 3, 0, 0, 247, 6, 0, 0, 255, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 3, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 246, 5, 0, 0, 186, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 231, 9, 0, 0, 231, 9, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 231, 6, 0, 0, 231, 9, 0, 0, 11, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 16, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 21, 7, 0, 0, 29, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 99, 5, 0, 0, 231, 9, 0, 0, 245, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 37, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 45, 7, 0, 0, 52, 7, 0, 0, 148, 3, 0, 0, + 59, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 57, 5, 0, 0, 67, 7, 0, 0, 148, 3, 0, 0, 75, 7, 0, 0, 82, 7, 0, 0, 148, 3, 0, 0, 161, 4, 0, 0, 87, 7, 0, 0, 148, 3, 0, 0, 186, 4, 0, 0, 148, 3, 0, 0, 95, 7, 0, 0, 103, 7, 0, 0, 188, 4, 0, 0, 148, 3, 0, 0, 107, 7, 0, 0, 187, 4, 0, 0, 115, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 251, 5, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 122, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 126, 7, 0, 0, 42, 9, 0, 0, 46, 9, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, + 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 93, 10, 0, 0, 101, 10, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 106, 10, 0, 0, 110, 10, 0, 0, 118, 10, 0, 0, 179, 9, 0, 0, 183, 9, 0, 0, 155, 9, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 246, 10, 0, 0, 115, 9, 0, 0, 134, 7, 0, 0, 142, 7, 0, 0, 150, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 191, 9, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 144, 14, 0, 0, 208, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 8, 15, 0, 0, 72, 15, 0, 0, 136, 15, 0, 0, 152, 15, 0, 0, 216, 15, 0, 0, 228, 15, 0, 0, 80, 14, 0, 0, + 80, 14, 0, 0, 36, 16, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 92, 16, 0, 0, 156, 16, 0, 0, 220, 16, 0, 0, 20, 17, 0, 0, 72, 17, 0, 0, 116, 17, 0, 0, 176, 17, 0, 0, 232, 17, 0, 0, 4, 18, 0, 0, 68, 18, 0, 0, 32, 10, 0, 0, 192, 12, 0, 0, 96, 10, 0, 0, 159, 10, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 223, 10, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 31, 11, 0, 0, 160, 1, 0, 0, 69, 11, 0, 0, 128, 11, 0, 0, 192, 11, 0, 0, 0, 12, 0, 0, 253, 12, 0, 0, 64, 12, 0, 0, 61, 13, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 125, 13, 0, 0, 141, 13, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 158, 7, 0, 0, 148, 3, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 166, 7, 0, 0, 183, 5, 0, 0, 148, 3, 0, 0, 180, 4, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 123, 9, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 174, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 187, 4, 0, 0, 181, 7, 0, 0, 188, 7, 0, 0, 195, 7, 0, 0, 11, 4, 0, 0, 203, 7, 0, 0, 9, 5, 0, 0, 148, 3, 0, 0, 161, 4, 0, 0, 210, 7, 0, 0, 148, 3, 0, 0, 216, 7, 0, 0, 11, 4, 0, 0, 221, 7, 0, 0, 229, 7, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 234, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 199, 6, 0, 0, 242, 7, 0, 0, 11, 4, 0, 0, 59, 5, 0, 0, 30, 5, 0, 0, 249, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 181, 7, 0, 0, 1, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 9, 8, 0, 0, 17, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 21, 8, 0, 0, 29, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 37, 8, 0, 0, 30, 5, 0, 0, 170, 7, 0, 0, 148, 3, 0, 0, 45, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 167, 5, 0, 0, 53, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 58, 8, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 65, 8, 0, 0, 73, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 76, 8, 0, 0, 30, 5, 0, 0, 84, 8, 0, 0, 88, 8, 0, 0, 96, 8, 0, 0, 148, 3, 0, 0, 103, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 110, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 118, 8, 0, 0, 124, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 130, 8, 0, 0, 138, 8, 0, 0, 148, 3, 0, 0, 142, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 61, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 8, 0, 0, 156, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 161, 8, 0, 0, 148, 3, 0, 0, 167, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 217, 7, 0, 0, 148, 3, 0, 0, 173, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 181, 8, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 213, 4, 0, 0, 254, 10, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 226, 3, 0, 0, 35, 11, 0, 0, 189, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 196, 8, 0, 0, 204, 8, 0, 0, 210, 8, 0, 0, 148, 3, 0, 0, 216, 8, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 126, 10, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 240, 9, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 187, 3, 0, 0, 148, 3, 0, 0, 153, 7, 0, 0, 148, 3, 0, 0, 182, 3, 0, 0, 148, 3, 0, 0, 156, 7, 0, 0, 148, 3, 0, 0, 224, 8, 0, 0, 131, 9, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 226, 3, 0, 0, 232, 8, 0, 0, 226, 3, 0, 0, 239, 8, 0, 0, 246, 8, 0, 0, 43, 11, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 51, 11, 0, 0, 59, 11, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 167, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 5, 8, 0, 0, 148, 3, 0, 0, 254, 8, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 231, 9, 0, 0, 142, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 71, 10, 0, 0, 147, 10, 0, 0, 151, 10, 0, 0, 79, 10, 0, 0, 6, 9, 0, 0, 182, 3, 0, 0, 148, 3, 0, 0, + 12, 9, 0, 0, 148, 3, 0, 0, 155, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 156, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, + 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 156, 10, 0, 0, 166, 7, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 71, 10, 0, 0, 231, 9, 0, 0, + 231, 9, 0, 0, 164, 10, 0, 0, 172, 10, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 16, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, + 54, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 62, 9, 0, 0, 66, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 74, 9, 0, 0, 41, 4, 0, 0, 76, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, + 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 62, 4, 0, 0, 215, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 84, 9, 0, 0, 41, 4, 0, 0, 92, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 46, 9, 0, 0, + 137, 4, 0, 0, 50, 9, 0, 0, 100, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 104, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 107, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, + 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 46, 9, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 50, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, + 41, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 134, 10, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 142, 10, 0, 0, 231, 9, 0, 0, 180, 10, 0, 0, 231, 9, 0, 0, 188, 10, 0, 0, 193, 10, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 71, 10, 0, 0, 201, 10, 0, 0, 209, 10, 0, 0, 214, 10, 0, 0, 222, 10, 0, 0, 230, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 238, 10, 0, 0, 231, 9, 0, 0, 243, 9, 0, 0, 139, 9, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 16, 9, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 14, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, + 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, + 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, + 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 115, 3, 1, 0, 115, 3, 1, 0, 115, 3, 1, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 84, 0, 0, 0, 12, 0, + 0, 0, 84, 0, 0, 0, 88, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 84, 0, 0, 0, 88, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, + 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 41, 0, 58, 0, 40, 0, 57, 0, 0, 0, 56, 0, 0, 0, 28, 0, 0, 0, 20, 0, 0, 0, 28, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 20, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 58, 0, 0, 0, 56, 0, 91, 0, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 58, 0, 0, 0, 56, 0, 123, 0, 57, 0, 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 20, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 4, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 59, 15, 58, 0, 58, 15, 57, 0, 61, 15, 58, 0, 60, 15, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 22, 58, 0, 155, 22, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 16, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 44, 0, 0, 0, 76, 0, 0, 0, 36, 0, 0, 0, 64, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 56, 0, + 126, 32, 58, 0, 125, 32, 57, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 56, 0, 142, 32, 58, 0, 141, 32, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 42, 35, 58, 0, 41, 35, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 88, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 48, 58, 0, 8, 48, 57, 0, 11, 48, 58, 0, 10, 48, 57, 0, 13, 48, 58, 0, 12, 48, 57, 0, 15, 48, 58, 0, 14, 48, 57, 0, 17, 48, 58, 0, 16, 48, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 21, 48, 58, 0, 20, 48, 57, 0, 23, 48, 58, 0, 22, 48, 57, 0, 25, 48, 58, 0, + 24, 48, 57, 0, 27, 48, 58, 0, 26, 48, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 255, 58, 0, 0, 0, 56, 0, 59, 255, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 255, 58, 0, 0, 0, 56, 0, 91, 255, 57, 0, 0, 0, 56, 0, 96, 255, 58, 0, 95, 255, 57, 0, 0, 0, 56, 0, 99, 255, 58, 0, 98, 255, 57, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 28, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 56, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, + 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 9, 255, 58, 0, 8, 255, 57, 0, 0, 0, 56, 0, 0, 0, 28, 0, 0, 0, 20, 0, 0, 0, 28, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 20, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 28, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 88, 0, 0, 0, 12, 0, 0, 0, 40, 0, 0, 0, 72, 0, 0, 0, 60, 0, 0, 0, 48, 0, 0, 0, 80, 0, 0, 0, 20, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, + 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 20, 0, 0, 0, 56, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 20, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 90, 254, 58, 0, 89, 254, 57, 0, 92, 254, 58, 0, 91, 254, 57, 0, 94, 254, 58, 0, 93, 254, 57, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 8, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, + 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 20, 0, 70, 32, 58, 0, 69, 32, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 88, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 9, 35, 58, 0, 8, 35, 57, 0, 11, 35, 58, 0, 10, 35, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 105, 39, 58, 0, 104, 39, 57, 0, 107, 39, 58, 0, 106, 39, 57, 0, 109, 39, 58, 0, 108, 39, 57, 0, 111, 39, 58, 0, 110, 39, 57, 0, 113, 39, 58, 0, 112, 39, 57, 0, 115, 39, 58, 0, 114, 39, 57, 0, 117, 39, 58, 0, 116, 39, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 198, 39, 58, 0, 197, 39, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 231, 39, 58, 0, 230, 39, 57, 0, 233, 39, 58, 0, 232, 39, 57, 0, 235, 39, 58, 0, 234, 39, 57, 0, 237, 39, 58, 0, 236, 39, 57, 0, 239, 39, 58, 0, 238, 39, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 132, 41, 58, 0, 131, 41, 57, 0, 134, 41, 58, 0, 133, 41, 57, 0, 136, 41, 58, 0, 135, 41, 57, 0, 138, 41, 58, 0, 137, 41, 57, 0, 140, 41, 58, 0, 139, 41, 57, 0, 144, 41, 58, 0, + 143, 41, 57, 0, 142, 41, 58, 0, 141, 41, 57, 0, 146, 41, 58, 0, 145, 41, 57, 0, 148, 41, 58, 0, 147, 41, 57, 0, 150, 41, 58, 0, 149, 41, 57, 0, 152, 41, 58, 0, 151, 41, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 217, 41, 58, 0, 216, 41, 57, 0, 219, 41, 58, 0, 218, 41, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 253, 41, 58, 0, 252, 41, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 35, 46, 58, 0, 34, 46, 57, 0, 37, 46, 58, 0, 36, 46, 57, 0, 39, 46, 58, 0, 38, 46, 57, 0, 41, 46, 58, 0, 40, 46, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 86, 46, 58, 0, 85, 46, 57, 0, 88, 46, 58, 0, 87, 46, 57, 0, 90, 46, 58, 0, 89, 46, 57, 0, 92, 46, 58, 0, 91, 46, 57, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs index 2511807d9c..17ec9b1df2 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs @@ -66,7 +66,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The forward mapping maps the start index to the end index. /// The reverse mapping maps the end index to the start index. /// - private readonly Dictionary _isolatePairs = new Dictionary(); + private readonly BidiDictionary _isolatePairs = new BidiDictionary(); /// /// The working BiDi classes @@ -188,12 +188,6 @@ namespace Avalonia.Media.TextFormatting.Unicode { } - /// - /// Gets a per-thread instance that can be re-used as often - /// as necessary. - /// - public static ThreadLocal Instance { get; } = new ThreadLocal(() => new BidiAlgorithm()); - /// /// Gets the resolved levels. /// @@ -1414,35 +1408,37 @@ namespace Avalonia.Media.TextFormatting.Unicode /// Sets the direction of a bracket pair, including setting the direction of /// NSM's inside the brackets and following. /// - /// The paired brackets + /// The paired brackets /// The resolved direction for the bracket pair - private void SetPairedBracketDirection(in BracketPair bracketPair, BidiClass direction) + private void SetPairedBracketDirection(in BracketPair pairedBracket, BidiClass direction) { // Set the direction of the brackets - _runResolvedClasses[bracketPair.OpeningIndex] = direction; - _runResolvedClasses[bracketPair.ClosingIndex] = direction; + _runResolvedClasses[pairedBracket.OpeningIndex] = direction; + _runResolvedClasses[pairedBracket.ClosingIndex] = direction; // Set the directionality of NSM's inside the brackets - for (var i = bracketPair.OpeningIndex + 1; i < bracketPair.ClosingIndex; i++) + // BN characters (such as ZWJ or ZWSP) that appear between the base bracket character + // and the nonspacing mark should be ignored. + for (int i = pairedBracket.OpeningIndex + 1; i < pairedBracket.ClosingIndex; i++) { if (_runOriginalClasses[i] == BidiClass.NonspacingMark) { _runOriginalClasses[i] = direction; } - else + else if (_runOriginalClasses[i] != BidiClass.BoundaryNeutral) { break; } } // Set the directionality of NSM's following the brackets - for (var i = bracketPair.ClosingIndex + 1; i < _runLength; i++) + for (int i = pairedBracket.ClosingIndex + 1; i < _runLength; i++) { if (_runOriginalClasses[i] == BidiClass.NonspacingMark) { - _runResolvedClasses[i] = direction; + _runOriginalClasses[i] = direction; } - else + else if (_runOriginalClasses[i] != BidiClass.BoundaryNeutral) { break; } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs index 9d76d56376..65c348e928 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs @@ -18,17 +18,12 @@ namespace Avalonia.Media.TextFormatting.Unicode private ArrayBuilder _savedClasses; private ArrayBuilder _savedPairedBracketTypes; private ArrayBuilder _tempLevelBuffer; - - public BidiData(sbyte paragraphEmbeddingLevel = 0) + + public BidiData(sbyte paragraphEmbeddingLevel) { ParagraphEmbeddingLevel = paragraphEmbeddingLevel; } - public BidiData(ReadOnlySlice text, sbyte paragraphEmbeddingLevel = 0) : this(paragraphEmbeddingLevel) - { - Append(text); - } - public sbyte ParagraphEmbeddingLevel { get; private set; } public bool HasBrackets { get; private set; } @@ -64,13 +59,23 @@ namespace Avalonia.Media.TextFormatting.Unicode /// public ArraySlice PairedBracketValues { get; private set; } + /// + /// Appends text to the bidi data. + /// + /// The text to process. public void Append(ReadOnlySlice text) { _classes.Add(text.Length); _pairedBracketTypes.Add(text.Length); _pairedBracketValues.Add(text.Length); - var i = Length; + // Resolve the BidiCharacterType, paired bracket type and paired + // bracket values for all code points + HasBrackets = false; + HasEmbeddings = false; + HasIsolates = false; + + int i = Length; var codePointEnumerator = new CodepointEnumerator(text); @@ -115,13 +120,13 @@ namespace Avalonia.Media.TextFormatting.Unicode // Opening bracket types can never have a null pairing. codepoint.TryGetPairedBracket(out var paired); - _pairedBracketValues[i] = Codepoint.GetCanonicalType(paired).Value; + _pairedBracketValues[i] = (int)Codepoint.GetCanonicalType(paired).Value; HasBrackets = true; } else if (pbt == BidiPairedBracketType.Close) { - _pairedBracketValues[i] = Codepoint.GetCanonicalType(codepoint).Value; + _pairedBracketValues[i] = (int)Codepoint.GetCanonicalType(codepoint).Value; HasBrackets = true; } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/Codepoint.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/Codepoint.cs index 39440f6fcf..56a90f31ea 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/Codepoint.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/Codepoint.cs @@ -5,50 +5,52 @@ namespace Avalonia.Media.TextFormatting.Unicode { public readonly struct Codepoint { + private readonly uint _value; + /// /// The replacement codepoint that is used for non supported values. /// public static readonly Codepoint ReplacementCodepoint = new Codepoint('\uFFFD'); - public Codepoint(int value) + public Codepoint(uint value) { - Value = value; + _value = value; } /// /// Get the codepoint's value. /// - public int Value { get; } + public uint Value => _value; /// /// Gets the . /// - public GeneralCategory GeneralCategory => UnicodeData.GetGeneralCategory(Value); + public GeneralCategory GeneralCategory => UnicodeData.GetGeneralCategory(_value); /// /// Gets the . /// - public Script Script => UnicodeData.GetScript(Value); + public Script Script => UnicodeData.GetScript(_value); /// /// Gets the . /// - public BidiClass BiDiClass => UnicodeData.GetBiDiClass(Value); + public BidiClass BiDiClass => UnicodeData.GetBiDiClass(_value); /// /// Gets the . /// - public BidiPairedBracketType PairedBracketType => UnicodeData.GetBiDiPairedBracketType(Value); + public BidiPairedBracketType PairedBracketType => UnicodeData.GetBiDiPairedBracketType(_value); /// /// Gets the . /// - public LineBreakClass LineBreakClass => UnicodeData.GetLineBreakClass(Value); + public LineBreakClass LineBreakClass => UnicodeData.GetLineBreakClass(_value); /// /// Gets the . /// - public GraphemeBreakClass GraphemeBreakClass => UnicodeData.GetGraphemeClusterBreak(Value); + public GraphemeBreakClass GraphemeBreakClass => UnicodeData.GetGraphemeClusterBreak(_value); /// /// Determines whether this is a break char. @@ -60,7 +62,7 @@ namespace Avalonia.Media.TextFormatting.Unicode { get { - switch (Value) + switch (_value) { case '\u000A': case '\u000B': @@ -109,12 +111,12 @@ namespace Avalonia.Media.TextFormatting.Unicode [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Codepoint GetCanonicalType(Codepoint codePoint) { - if (codePoint.Value == 0x3008) + if (codePoint._value == 0x3008) { return new Codepoint(0x2329); } - if (codePoint.Value == 0x3009) + if (codePoint._value == 0x3009) { return new Codepoint(0x232A); } @@ -141,19 +143,19 @@ namespace Avalonia.Media.TextFormatting.Unicode return false; } - codepoint = UnicodeData.GetBiDiPairedBracket(Value); + codepoint = UnicodeData.GetBiDiPairedBracket(_value); return true; } public static implicit operator int(Codepoint codepoint) { - return codepoint.Value; + return (int)codepoint._value; } public static implicit operator uint(Codepoint codepoint) { - return (uint)codepoint.Value; + return codepoint._value; } /// @@ -191,7 +193,7 @@ namespace Avalonia.Media.TextFormatting.Unicode if (0xDC00 <= low && low <= 0xDFFF) { count = 2; - return new Codepoint((hi - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000); + return new Codepoint((uint)((hi - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000)); } return ReplacementCodepoint; @@ -212,7 +214,7 @@ namespace Avalonia.Media.TextFormatting.Unicode if (0xD800 <= hi && hi <= 0xDBFF) { count = 2; - return new Codepoint((hi - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000); + return new Codepoint((uint)((hi - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000)); } return ReplacementCodepoint; @@ -220,5 +222,13 @@ namespace Avalonia.Media.TextFormatting.Unicode return new Codepoint(code); } + + /// + /// Returns if is between + /// and , inclusive. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsInRangeInclusive(Codepoint cp, uint lowerBound, uint upperBound) + => (cp._value - lowerBound) <= (upperBound - lowerBound); } } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.cs new file mode 100644 index 0000000000..6986b908a1 --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.cs @@ -0,0 +1,7 @@ +namespace Avalonia.Media.TextFormatting.Unicode +{ + internal static class GraphemeBreak + { + public static byte[] Data => new byte[0]; + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.trie.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.trie.cs new file mode 100644 index 0000000000..05b7d55ad3 --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.trie.cs @@ -0,0 +1,409 @@ +using System; +namespace Avalonia.Media.TextFormatting.Unicode +{ + internal static class GraphemeBreakTrie + { + public static ReadOnlySpan Data => new byte[] + { + 0, 16, 14, 0, 0, 0, 0, 0, 144, 155, 0, 0, 89, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 113, 3, 0, 0, 137, 3, 0, 0, 145, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, + 97, 3, 0, 0, 105, 3, 0, 0, 153, 3, 0, 0, 161, 3, 0, 0, 157, 3, 0, 0, 165, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 173, 3, 0, 0, 181, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 185, 3, 0, 0, 193, 3, 0, 0, 201, 3, 0, 0, + 209, 3, 0, 0, 217, 3, 0, 0, 225, 3, 0, 0, 231, 3, 0, 0, 239, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 244, 3, 0, 0, 252, 3, 0, 0, 1, 4, 0, 0, 9, 4, 0, 0, 15, 4, 0, 0, 23, 4, 0, 0, 22, 4, 0, 0, 30, 4, 0, 0, 35, 4, 0, 0, 43, 4, 0, 0, 176, 4, 0, 0, 183, 4, 0, 0, 187, 4, 0, 0, 97, 3, 0, 0, 51, 4, 0, 0, 97, 3, 0, 0, 194, 4, 0, 0, 59, 4, 0, 0, + 202, 4, 0, 0, 204, 4, 0, 0, 212, 4, 0, 0, 220, 4, 0, 0, 228, 4, 0, 0, 229, 4, 0, 0, 237, 4, 0, 0, 245, 4, 0, 0, 253, 4, 0, 0, 254, 4, 0, 0, 6, 5, 0, 0, 11, 5, 0, 0, 253, 4, 0, 0, 254, 4, 0, 0, 19, 5, 0, 0, 27, 5, 0, 0, 228, 4, 0, 0, 35, 5, 0, 0, 43, 5, 0, 0, 220, 4, 0, 0, 51, 5, 0, 0, 203, 4, 0, 0, 59, 5, 0, 0, 97, 3, 0, 0, 67, 5, 0, 0, + 35, 5, 0, 0, 75, 5, 0, 0, 220, 4, 0, 0, 228, 4, 0, 0, 81, 5, 0, 0, 89, 5, 0, 0, 220, 4, 0, 0, 97, 5, 0, 0, 99, 5, 0, 0, 67, 4, 0, 0, 220, 4, 0, 0, 228, 4, 0, 0, 97, 3, 0, 0, 107, 5, 0, 0, 88, 8, 0, 0, 97, 3, 0, 0, 115, 5, 0, 0, 122, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 126, 5, 0, 0, 134, 5, 0, 0, 97, 3, 0, 0, 138, 5, 0, 0, 145, 5, 0, 0, + 97, 3, 0, 0, 153, 5, 0, 0, 161, 5, 0, 0, 168, 5, 0, 0, 50, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 176, 5, 0, 0, 184, 5, 0, 0, 192, 5, 0, 0, 200, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 124, 8, 0, 0, 124, 8, 0, 0, 124, 8, 0, 0, 133, 8, 0, 0, 133, 8, 0, 0, 139, 8, 0, 0, 157, 8, 0, 0, 157, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 182, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 208, 5, 0, 0, 214, 5, 0, 0, 23, 5, 0, 0, 23, 5, 0, 0, 97, 3, 0, 0, 220, 5, 0, 0, 228, 5, 0, 0, 97, 3, 0, 0, 127, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 79, 5, 0, 0, + 233, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 241, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 248, 5, 0, 0, 97, 3, 0, 0, 255, 5, 0, 0, 7, 6, 0, 0, 97, 3, 0, 0, 149, 3, 0, 0, 14, 4, 0, 0, 97, 3, 0, 0, 15, 6, 0, 0, 18, 6, 0, 0, 26, 6, 0, 0, 32, 6, 0, 0, 40, 6, 0, 0, 48, 6, 0, 0, + 97, 3, 0, 0, 55, 6, 0, 0, 97, 3, 0, 0, 62, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 68, 6, 0, 0, 76, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 133, 4, 0, 0, 139, 4, 0, 0, 94, 6, 0, 0, 93, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 149, 3, 0, 0, 171, 5, 0, 0, 97, 3, 0, 0, 180, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 187, 8, 0, 0, 194, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 197, 8, 0, 0, 204, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 204, 8, 0, 0, 97, 3, 0, 0, 209, 8, 0, 0, 215, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 223, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 229, 8, 0, 0, 237, 8, 0, 0, 239, 8, 0, 0, 247, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 3, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 10, 9, 0, 0, 17, 9, 0, 0, 24, 9, 0, 0, 32, 9, 0, 0, 35, 9, 0, 0, 43, 9, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 51, 9, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 58, 9, 0, 0, 97, 3, 0, 0, 66, 9, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 83, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 226, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 153, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 89, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 72, 9, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 104, 6, 0, 0, 24, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 140, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 112, 6, 0, 0, 120, 6, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 237, 7, 0, 0, 93, 8, 0, 0, 128, 6, 0, 0, 136, 6, 0, 0, 97, 3, 0, 0, 144, 6, 0, 0, 151, 6, 0, 0, 125, 8, 0, 0, 202, 4, 0, 0, 156, 6, 0, 0, 101, 8, 0, 0, 164, 6, 0, 0, 97, 3, 0, 0, 170, 6, 0, 0, 178, 6, 0, 0, 182, 6, 0, 0, 97, 3, 0, 0, 190, 6, 0, 0, 5, 4, 0, 0, 198, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 206, 6, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, + 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, + 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, + 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, + 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, + 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, + 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, + 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, + 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, + 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, + 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, + 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, + 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, + 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, + 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 147, 8, 0, 0, 154, 8, 0, 0, 158, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 210, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 165, 3, 0, 0, 165, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 113, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 24, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 147, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 228, 13, 0, 0, 228, 13, 0, 0, 36, 14, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 100, 14, 0, 0, 116, 14, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, + 132, 13, 0, 0, 180, 14, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 228, 14, 0, 0, 36, 15, 0, 0, 100, 15, 0, 0, 156, 15, 0, 0, 132, 13, 0, 0, 208, 15, 0, 0, 4, 16, 0, 0, 60, 16, 0, 0, 88, 16, 0, 0, 140, 16, 0, 0, 64, 11, 0, 0, 112, 11, 0, 0, 226, 9, 0, 0, 33, 10, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 89, 10, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 173, 11, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 123, 10, 0, 0, 149, 1, 0, 0, 237, 11, 0, 0, 176, 10, 0, 0, 40, 12, 0, 0, 104, 12, 0, 0, 162, 12, 0, 0, 226, 12, 0, 0, 34, 13, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 240, 10, 0, 0, 0, 11, 0, 0, 6, 7, 0, 0, 7, 4, 0, 0, 16, 4, 0, 0, 10, 7, 0, 0, 40, 6, 0, 0, 73, 4, 0, 0, 81, 4, 0, 0, 97, 3, 0, 0, 17, 4, 0, 0, 16, 7, 0, 0, 108, 8, 0, 0, 22, 7, 0, 0, 40, 6, 0, 0, 27, 7, 0, 0, 89, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 35, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 226, 3, 0, 0, 43, 7, 0, 0, 97, 5, 0, 0, 99, 5, 0, 0, 51, 7, 0, 0, 59, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 65, 7, 0, 0, 73, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 81, 7, 0, 0, 89, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 94, 7, 0, 0, 102, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 110, 7, 0, 0, 34, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 118, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 182, 3, 0, 0, 126, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 131, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 93, 4, 0, 0, 101, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 138, 7, 0, 0, 146, 7, 0, 0, 154, 7, 0, 0, 105, 4, 0, 0, 161, 7, 0, 0, 97, 3, 0, 0, 113, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 168, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 176, 7, 0, 0, 182, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 188, 7, 0, 0, 121, 4, 0, 0, 97, 3, 0, 0, 196, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 202, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 154, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 238, 7, 0, 0, 96, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 161, 4, 0, 0, 254, 7, 0, 0, 252, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 6, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 137, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 168, 4, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, + 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, + 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, + 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 218, 6, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 34, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 226, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 234, 6, 0, 0, 238, 6, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 79, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 236, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 246, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 30, 4, 0, 0, 97, 3, 0, 0, 254, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 208, 7, 0, 0, 97, 3, 0, 0, 214, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 220, 7, 0, 0, 116, 8, 0, 0, 226, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 233, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 153, 3, 0, 0, 246, 7, 0, 0, 16, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 153, 3, 0, 0, 14, 8, 0, 0, 153, 3, 0, 0, 21, 8, 0, 0, 28, 8, 0, 0, 36, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 44, 8, 0, 0, 52, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 214, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 214, 6, 0, 0, 97, 3, 0, 0, 57, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 214, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 64, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 79, 9, 0, 0, 209, 8, 0, 0, 97, 3, 0, 0, 84, 9, 0, 0, 92, 9, 0, 0, 99, 9, 0, 0, 252, 8, 0, 0, 80, 8, 0, 0, 107, 9, 0, 0, 114, 9, 0, 0, 122, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, + 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 72, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 253, 8, 0, 0, 130, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, + 252, 8, 0, 0, 134, 9, 0, 0, 97, 3, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 67, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 138, 9, 0, 0, 252, 8, 0, 0, 146, 9, 0, 0, 97, 3, 0, 0, 152, 9, 0, 0, 97, 3, 0, 0, 160, 9, 0, 0, 165, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 69, 8, 0, 0, 169, 9, 0, 0, + 176, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, + 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, + 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 253, 8, 0, 0, 88, 3, 1, 0, 88, 3, 1, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, + 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, + 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, + 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, + 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, + 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, + 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, + 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, + 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakClass.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakClass.cs index 8b2e3f41e3..bd77c398bd 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakClass.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakClass.cs @@ -35,7 +35,6 @@ namespace Avalonia.Media.TextFormatting.Unicode EModifier, //EM ZWJ, //ZWJ ContingentBreak, //CB - Unknown, //XX Ambiguous, //AI MandatoryBreak, //BK diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs index 0f6b81975a..e12a7c06f1 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs @@ -450,6 +450,20 @@ namespace Avalonia.Media.TextFormatting.Unicode _lb30a = 0; } + // Rule LB30b + if (_nextClass == LineBreakClass.EModifier && _lastPosition > 0) + { + // Mahjong Tiles (Unicode block) are extended pictographics but have a class of ID + // Unassigned codepoints with Line_Break=ID in some blocks are also assigned the Extended_Pictographic property. + // Those blocks are intended for future allocation of emoji characters. + var cp = Codepoint.ReadAt(_text, _lastPosition - 1, out int _); + + if (Codepoint.IsInRangeInclusive(cp, 0x1F000, 0x1F02F)) + { + shouldBreak = false; + } + } + _currentClass = _nextClass; return shouldBreak; diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/Script.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/Script.cs index 2593a77848..bc14c2563c 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/Script.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/Script.cs @@ -30,6 +30,7 @@ namespace Avalonia.Media.TextFormatting.Unicode Cherokee, //Cher Chorasmian, //Chrs Coptic, //Copt + CyproMinoan, //Cpmn Cypriot, //Cprt Cyrillic, //Cyrl Devanagari, //Deva @@ -109,6 +110,7 @@ namespace Avalonia.Media.TextFormatting.Unicode Oriya, //Orya Osage, //Osge Osmanya, //Osma + OldUyghur, //Ougr Palmyrene, //Palm PauCinHau, //Pauc OldPermic, //Perm @@ -151,8 +153,11 @@ namespace Avalonia.Media.TextFormatting.Unicode Thai, //Thai Tibetan, //Tibt Tirhuta, //Tirh + Tangsa, //Tnsa + Toto, //Toto Ugaritic, //Ugar Vai, //Vaii + Vithkuqi, //Vith WarangCiti, //Wara Wancho, //Wcho OldPersian, //Xpeo diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.cs index 471cb52bea..0142a20790 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.cs @@ -1,4 +1,5 @@ -using System.Runtime.CompilerServices; +using System.IO; +using System.Runtime.CompilerServices; namespace Avalonia.Media.TextFormatting.Unicode { @@ -17,14 +18,14 @@ namespace Avalonia.Media.TextFormatting.Unicode internal const int SCRIPT_SHIFT = CATEGORY_BITS; internal const int LINEBREAK_SHIFT = CATEGORY_BITS + SCRIPT_BITS; - + internal const int BIDIPAIREDBRACKEDTYPE_SHIFT = BIDIPAIREDBRACKED_BITS; internal const int BIDICLASS_SHIFT = BIDIPAIREDBRACKED_BITS + BIDIPAIREDBRACKEDTYPE_BITS; - + internal const int CATEGORY_MASK = (1 << CATEGORY_BITS) - 1; internal const int SCRIPT_MASK = (1 << SCRIPT_BITS) - 1; internal const int LINEBREAK_MASK = (1 << LINEBREAK_BITS) - 1; - + internal const int BIDIPAIREDBRACKED_MASK = (1 << BIDIPAIREDBRACKED_BITS) - 1; internal const int BIDIPAIREDBRACKEDTYPE_MASK = (1 << BIDIPAIREDBRACKEDTYPE_BITS) - 1; internal const int BIDICLASS_MASK = (1 << BIDICLASS_BITS) - 1; @@ -35,9 +36,9 @@ namespace Avalonia.Media.TextFormatting.Unicode static UnicodeData() { - s_unicodeDataTrie = new UnicodeTrie(typeof(UnicodeData).Assembly.GetManifestResourceStream("Avalonia.Assets.UnicodeData.trie")!); - s_graphemeBreakTrie = new UnicodeTrie(typeof(UnicodeData).Assembly.GetManifestResourceStream("Avalonia.Assets.GraphemeBreak.trie")!); - s_biDiTrie = new UnicodeTrie(typeof(UnicodeData).Assembly.GetManifestResourceStream("Avalonia.Assets.BiDi.trie")!); + s_unicodeDataTrie = new UnicodeTrie(UnicodeDataTrie.Data); + s_graphemeBreakTrie = new UnicodeTrie(GraphemeBreakTrie.Data); + s_biDiTrie = new UnicodeTrie(BidiTrie.Data); } /// @@ -46,7 +47,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The codepoint in question. /// The code point's general category. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static GeneralCategory GetGeneralCategory(int codepoint) + public static GeneralCategory GetGeneralCategory(uint codepoint) { return (GeneralCategory)(s_unicodeDataTrie.Get(codepoint) & CATEGORY_MASK); } @@ -57,7 +58,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The codepoint in question. /// The code point's script. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Script GetScript(int codepoint) + public static Script GetScript(uint codepoint) { return (Script)((s_unicodeDataTrie.Get(codepoint) >> SCRIPT_SHIFT) & SCRIPT_MASK); } @@ -68,31 +69,31 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The codepoint in question. /// The code point's biDi class. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static BidiClass GetBiDiClass(int codepoint) + public static BidiClass GetBiDiClass(uint codepoint) { return (BidiClass)((s_biDiTrie.Get(codepoint) >> BIDICLASS_SHIFT) & BIDICLASS_MASK); } - + /// /// Gets the for a Unicode codepoint. /// /// The codepoint in question. /// The code point's paired bracket type. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static BidiPairedBracketType GetBiDiPairedBracketType(int codepoint) + public static BidiPairedBracketType GetBiDiPairedBracketType(uint codepoint) { return (BidiPairedBracketType)((s_biDiTrie.Get(codepoint) >> BIDIPAIREDBRACKEDTYPE_SHIFT) & BIDIPAIREDBRACKEDTYPE_MASK); } - + /// /// Gets the paired bracket for a Unicode codepoint. /// /// The codepoint in question. /// The code point's paired bracket. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Codepoint GetBiDiPairedBracket(int codepoint) + public static Codepoint GetBiDiPairedBracket(uint codepoint) { - return new Codepoint((int)(s_biDiTrie.Get(codepoint) & BIDIPAIREDBRACKED_MASK)); + return new Codepoint((s_biDiTrie.Get(codepoint) & BIDIPAIREDBRACKED_MASK)); } /// @@ -101,7 +102,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The codepoint in question. /// The code point's line break class. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static LineBreakClass GetLineBreakClass(int codepoint) + public static LineBreakClass GetLineBreakClass(uint codepoint) { return (LineBreakClass)((s_unicodeDataTrie.Get(codepoint) >> LINEBREAK_SHIFT) & LINEBREAK_MASK); } @@ -112,7 +113,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The codepoint in question. /// The code point's grapheme break type. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static GraphemeBreakClass GetGraphemeClusterBreak(int codepoint) + public static GraphemeBreakClass GetGraphemeClusterBreak(uint codepoint) { return (GraphemeBreakClass)s_graphemeBreakTrie.Get(codepoint); } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.trie.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.trie.cs new file mode 100644 index 0000000000..6ef41e3a0b --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.trie.cs @@ -0,0 +1,1086 @@ +using System; +namespace Avalonia.Media.TextFormatting.Unicode +{ + internal static class UnicodeDataTrie + { + public static ReadOnlySpan Data => new byte[] + { + 0, 0, 16, 0, 0, 0, 0, 0, 0, 164, 1, 0, 108, 4, 0, 0, 116, 4, 0, 0, 124, 4, 0, 0, 132, 4, 0, 0, 156, 4, 0, 0, 164, 4, 0, 0, 172, 4, 0, 0, 180, 4, 0, 0, 188, 4, 0, 0, 196, 4, 0, 0, 202, 4, 0, 0, 210, 4, 0, 0, 218, 4, 0, 0, 226, 4, 0, 0, 234, 4, 0, 0, 242, 4, 0, 0, 248, 4, 0, 0, 0, 5, 0, 0, 8, 5, 0, 0, 16, 5, 0, 0, 19, 5, 0, 0, 27, 5, 0, 0, + 35, 5, 0, 0, 43, 5, 0, 0, 51, 5, 0, 0, 59, 5, 0, 0, 64, 5, 0, 0, 72, 5, 0, 0, 80, 5, 0, 0, 88, 5, 0, 0, 93, 5, 0, 0, 101, 5, 0, 0, 109, 5, 0, 0, 117, 5, 0, 0, 121, 5, 0, 0, 129, 5, 0, 0, 137, 5, 0, 0, 145, 5, 0, 0, 153, 5, 0, 0, 161, 5, 0, 0, 157, 5, 0, 0, 165, 5, 0, 0, 170, 5, 0, 0, 178, 5, 0, 0, 184, 5, 0, 0, 192, 5, 0, 0, 200, 5, 0, 0, + 208, 5, 0, 0, 216, 5, 0, 0, 224, 5, 0, 0, 232, 5, 0, 0, 240, 5, 0, 0, 245, 5, 0, 0, 253, 5, 0, 0, 0, 6, 0, 0, 8, 6, 0, 0, 16, 6, 0, 0, 24, 6, 0, 0, 30, 6, 0, 0, 38, 6, 0, 0, 46, 6, 0, 0, 54, 6, 0, 0, 62, 6, 0, 0, 70, 6, 0, 0, 22, 19, 0, 0, 78, 6, 0, 0, 86, 6, 0, 0, 94, 6, 0, 0, 100, 6, 0, 0, 224, 5, 0, 0, 30, 19, 0, 0, 252, 22, 0, 0, + 163, 19, 0, 0, 165, 19, 0, 0, 173, 19, 0, 0, 38, 19, 0, 0, 108, 6, 0, 0, 114, 6, 0, 0, 122, 6, 0, 0, 130, 6, 0, 0, 138, 6, 0, 0, 144, 6, 0, 0, 152, 6, 0, 0, 160, 6, 0, 0, 168, 6, 0, 0, 174, 6, 0, 0, 182, 6, 0, 0, 190, 6, 0, 0, 198, 6, 0, 0, 204, 6, 0, 0, 212, 6, 0, 0, 220, 6, 0, 0, 228, 6, 0, 0, 236, 6, 0, 0, 244, 6, 0, 0, 251, 6, 0, 0, 3, 7, 0, 0, + 9, 7, 0, 0, 17, 7, 0, 0, 25, 7, 0, 0, 33, 7, 0, 0, 39, 7, 0, 0, 47, 7, 0, 0, 55, 7, 0, 0, 63, 7, 0, 0, 181, 19, 0, 0, 71, 7, 0, 0, 79, 7, 0, 0, 87, 7, 0, 0, 94, 7, 0, 0, 102, 7, 0, 0, 110, 7, 0, 0, 118, 7, 0, 0, 122, 7, 0, 0, 130, 7, 0, 0, 137, 7, 0, 0, 145, 7, 0, 0, 152, 7, 0, 0, 160, 7, 0, 0, 137, 7, 0, 0, 189, 19, 0, 0, 4, 23, 0, 0, + 168, 7, 0, 0, 173, 7, 0, 0, 181, 7, 0, 0, 188, 7, 0, 0, 196, 7, 0, 0, 137, 7, 0, 0, 197, 19, 0, 0, 203, 19, 0, 0, 211, 19, 0, 0, 219, 19, 0, 0, 227, 19, 0, 0, 175, 17, 0, 0, 204, 7, 0, 0, 167, 18, 0, 0, 235, 19, 0, 0, 235, 19, 0, 0, 235, 19, 0, 0, 243, 19, 0, 0, 243, 19, 0, 0, 249, 19, 0, 0, 251, 19, 0, 0, 251, 19, 0, 0, 3, 20, 0, 0, 3, 20, 0, 0, 212, 7, 0, 0, + 3, 20, 0, 0, 220, 7, 0, 0, 224, 7, 0, 0, 232, 7, 0, 0, 3, 20, 0, 0, 238, 7, 0, 0, 3, 20, 0, 0, 244, 7, 0, 0, 252, 7, 0, 0, 4, 8, 0, 0, 183, 17, 0, 0, 183, 17, 0, 0, 12, 8, 0, 0, 11, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, + 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 17, 20, 0, 0, 20, 8, 0, 0, 25, 20, 0, 0, 25, 20, 0, 0, 28, 8, 0, 0, 36, 8, 0, 0, 44, 8, 0, 0, 52, 8, 0, 0, 60, 8, 0, 0, 33, 20, 0, 0, 36, 20, 0, 0, 68, 8, 0, 0, 76, 8, 0, 0, 84, 8, 0, 0, 44, 20, 0, 0, 46, 19, 0, 0, 92, 8, 0, 0, 51, 20, 0, 0, + 100, 8, 0, 0, 12, 20, 0, 0, 104, 8, 0, 0, 112, 8, 0, 0, 120, 8, 0, 0, 128, 8, 0, 0, 133, 8, 0, 0, 59, 20, 0, 0, 141, 8, 0, 0, 147, 8, 0, 0, 226, 24, 0, 0, 155, 8, 0, 0, 67, 20, 0, 0, 163, 8, 0, 0, 171, 8, 0, 0, 179, 8, 0, 0, 187, 8, 0, 0, 195, 8, 0, 0, 137, 7, 0, 0, 75, 20, 0, 0, 78, 20, 0, 0, 203, 8, 0, 0, 211, 8, 0, 0, 86, 20, 0, 0, 94, 20, 0, 0, + 102, 20, 0, 0, 219, 8, 0, 0, 110, 20, 0, 0, 227, 8, 0, 0, 235, 8, 0, 0, 54, 19, 0, 0, 243, 8, 0, 0, 247, 8, 0, 0, 255, 8, 0, 0, 7, 9, 0, 0, 12, 5, 0, 0, 175, 18, 0, 0, 62, 19, 0, 0, 183, 18, 0, 0, 190, 18, 0, 0, 70, 19, 0, 0, 51, 5, 0, 0, 51, 5, 0, 0, 188, 4, 0, 0, 188, 4, 0, 0, 188, 4, 0, 0, 188, 4, 0, 0, 191, 17, 0, 0, 188, 4, 0, 0, 188, 4, 0, 0, + 188, 4, 0, 0, 15, 9, 0, 0, 199, 17, 0, 0, 19, 9, 0, 0, 27, 9, 0, 0, 198, 18, 0, 0, 35, 9, 0, 0, 43, 9, 0, 0, 51, 9, 0, 0, 195, 23, 0, 0, 203, 23, 0, 0, 211, 23, 0, 0, 59, 9, 0, 0, 67, 9, 0, 0, 210, 24, 0, 0, 75, 9, 0, 0, 83, 9, 0, 0, 207, 17, 0, 0, 215, 17, 0, 0, 223, 17, 0, 0, 84, 23, 0, 0, 91, 9, 0, 0, 48, 24, 0, 0, 53, 24, 0, 0, 59, 24, 0, 0, + 67, 24, 0, 0, 75, 24, 0, 0, 83, 24, 0, 0, 91, 24, 0, 0, 99, 24, 0, 0, 106, 24, 0, 0, 114, 24, 0, 0, 119, 24, 0, 0, 251, 23, 0, 0, 3, 24, 0, 0, 234, 24, 0, 0, 127, 24, 0, 0, 135, 24, 0, 0, 142, 24, 0, 0, 147, 24, 0, 0, 155, 24, 0, 0, 234, 24, 0, 0, 98, 9, 0, 0, 106, 9, 0, 0, 111, 23, 0, 0, 112, 23, 0, 0, 242, 24, 0, 0, 242, 24, 0, 0, 119, 23, 0, 0, 242, 24, 0, 0, + 242, 24, 0, 0, 247, 24, 0, 0, 251, 24, 0, 0, 3, 25, 0, 0, 163, 24, 0, 0, 171, 24, 0, 0, 179, 24, 0, 0, 11, 25, 0, 0, 19, 25, 0, 0, 27, 25, 0, 0, 187, 24, 0, 0, 28, 25, 0, 0, 36, 25, 0, 0, 44, 25, 0, 0, 52, 25, 0, 0, 60, 25, 0, 0, 234, 24, 0, 0, 64, 25, 0, 0, 127, 23, 0, 0, 133, 23, 0, 0, 234, 24, 0, 0, 11, 24, 0, 0, 18, 24, 0, 0, 72, 25, 0, 0, 72, 25, 0, 0, + 72, 25, 0, 0, 72, 25, 0, 0, 72, 25, 0, 0, 72, 25, 0, 0, 72, 25, 0, 0, 72, 25, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 26, 24, 0, 0, 114, 24, 0, 0, 33, 24, 0, 0, 40, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 234, 24, 0, 0, 195, 24, 0, 0, 202, 24, 0, 0, + 114, 9, 0, 0, 120, 9, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 231, 17, 0, 0, 235, 17, 0, 0, 206, 18, 0, 0, 243, 17, 0, 0, 251, 17, 0, 0, 251, 17, 0, 0, 251, 17, 0, 0, 128, 9, 0, 0, 214, 18, 0, 0, 136, 9, 0, 0, 118, 20, 0, 0, 142, 9, 0, 0, 150, 9, 0, 0, 158, 9, 0, 0, 158, 9, 0, 0, 12, 23, 0, 0, 243, 23, 0, 0, 78, 19, 0, 0, 166, 9, 0, 0, 137, 7, 0, 0, + 174, 9, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 181, 9, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 189, 9, 0, 0, 195, 9, 0, 0, 86, 19, 0, 0, 94, 19, 0, 0, 203, 9, 0, 0, 126, 20, 0, 0, 211, 9, 0, 0, 134, 20, 0, 0, 142, 20, 0, 0, 102, 19, 0, 0, 219, 9, 0, 0, 223, 9, 0, 0, 150, 20, 0, 0, 150, 20, 0, 0, 228, 9, 0, 0, + 158, 20, 0, 0, 88, 25, 0, 0, 235, 9, 0, 0, 243, 9, 0, 0, 141, 23, 0, 0, 147, 23, 0, 0, 96, 25, 0, 0, 141, 23, 0, 0, 155, 23, 0, 0, 104, 25, 0, 0, 108, 25, 0, 0, 116, 25, 0, 0, 116, 25, 0, 0, 118, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 234, 24, 0, 0, 234, 24, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 110, 19, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, + 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 251, 9, 0, 0, 126, 25, 0, 0, 2, 10, 0, 0, 118, 19, 0, 0, 182, 20, 0, 0, 182, 20, 0, 0, + 182, 20, 0, 0, 182, 20, 0, 0, 182, 20, 0, 0, 182, 20, 0, 0, 182, 20, 0, 0, 182, 20, 0, 0, 126, 19, 0, 0, 10, 10, 0, 0, 129, 5, 0, 0, 3, 18, 0, 0, 11, 18, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 18, 10, 0, 0, 134, 19, 0, 0, 19, 18, 0, 0, 188, 4, 0, 0, 24, 18, 0, 0, 32, 18, 0, 0, 38, 18, 0, 0, 26, 10, 0, 0, 33, 10, 0, 0, 198, 20, 0, 0, 41, 10, 0, 0, 206, 20, 0, 0, + 49, 10, 0, 0, 214, 20, 0, 0, 217, 20, 0, 0, 57, 10, 0, 0, 225, 20, 0, 0, 233, 20, 0, 0, 240, 20, 0, 0, 65, 10, 0, 0, 73, 10, 0, 0, 248, 20, 0, 0, 252, 20, 0, 0, 81, 10, 0, 0, 89, 10, 0, 0, 4, 21, 0, 0, 97, 10, 0, 0, 105, 10, 0, 0, 142, 19, 0, 0, 12, 21, 0, 0, 16, 21, 0, 0, 113, 10, 0, 0, 121, 10, 0, 0, 129, 10, 0, 0, 137, 10, 0, 0, 222, 18, 0, 0, 144, 10, 0, 0, + 230, 18, 0, 0, 230, 18, 0, 0, 24, 21, 0, 0, 152, 10, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, + 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, + 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, + 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, + 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, + 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, + 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, + 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, + 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, + 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, + 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, + 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, + 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, + 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, + 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 160, 10, 0, 0, 167, 10, 0, 0, 170, 10, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, + 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, + 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 178, 10, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 182, 10, 0, 0, 189, 10, 0, 0, 197, 10, 0, 0, 205, 10, 0, 0, 213, 10, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 46, 21, 0, 0, 221, 10, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, + 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 54, 21, 0, 0, 62, 21, 0, 0, 224, 5, 0, 0, 226, 10, 0, 0, 224, 5, 0, 0, 232, 10, 0, 0, 236, 10, 0, 0, 244, 10, 0, 0, 20, 23, 0, 0, 252, 10, 0, 0, 4, 11, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 10, 11, 0, 0, 18, 11, 0, 0, 46, 18, 0, 0, 238, 18, 0, 0, 150, 19, 0, 0, 155, 19, 0, 0, 26, 11, 0, 0, 34, 11, 0, 0, + 42, 11, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, + 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 48, 18, 0, 0, 48, 18, 0, 0, 112, 18, 0, 0, 176, 18, 0, 0, 240, 18, 0, 0, 40, 19, 0, 0, 104, 19, 0, 0, 168, 19, 0, 0, 224, 19, 0, 0, 32, 20, 0, 0, 76, 20, 0, 0, 140, 20, 0, 0, 204, 20, 0, 0, 0, 21, 0, 0, 64, 21, 0, 0, 116, 21, 0, 0, 180, 21, 0, 0, + 228, 21, 0, 0, 36, 22, 0, 0, 100, 22, 0, 0, 116, 22, 0, 0, 168, 22, 0, 0, 224, 22, 0, 0, 32, 23, 0, 0, 96, 23, 0, 0, 160, 23, 0, 0, 212, 23, 0, 0, 0, 24, 0, 0, 64, 24, 0, 0, 120, 24, 0, 0, 184, 24, 0, 0, 248, 24, 0, 0, 96, 10, 0, 0, 160, 10, 0, 0, 224, 10, 0, 0, 32, 11, 0, 0, 96, 11, 0, 0, 139, 11, 0, 0, 203, 11, 0, 0, 237, 11, 0, 0, 13, 12, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 77, 12, 0, 0, 112, 17, 0, 0, 112, 17, 0, 0, 141, 12, 0, 0, 205, 12, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 246, 12, 0, 0, 54, 13, 0, 0, 86, 13, 0, 0, 237, 11, 0, 0, 124, 13, 0, 0, 188, 13, 0, 0, 252, 13, 0, 0, 60, 14, 0, 0, 124, 14, 0, 0, 188, 14, 0, 0, 252, 14, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 60, 15, 0, 0, 160, 1, 0, 0, 116, 15, 0, 0, 180, 15, 0, 0, 160, 1, 0, 0, 191, 15, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 245, 15, 0, 0, 21, 16, 0, 0, 85, 16, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 149, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, + 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 176, 16, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 240, 16, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, + 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 48, 17, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, + 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, + 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, + 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 50, 11, 0, 0, 57, 11, 0, 0, 65, 11, 0, 0, 137, 7, 0, 0, 70, 21, 0, 0, 70, 21, 0, 0, 70, 21, 0, 0, 73, 11, 0, 0, 81, 11, 0, 0, 84, 11, 0, 0, 92, 23, 0, 0, 95, 23, 0, 0, 92, 11, 0, 0, 100, 11, 0, 0, 110, 9, 0, 0, 108, 11, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 116, 11, 0, 0, 78, 21, 0, 0, 124, 11, 0, 0, 132, 11, 0, 0, 86, 21, 0, 0, 140, 11, 0, 0, 148, 11, 0, 0, 152, 11, 0, 0, 160, 11, 0, 0, 94, 21, 0, 0, 168, 11, 0, 0, 137, 7, 0, 0, 54, 18, 0, 0, 60, 18, 0, 0, 246, 18, 0, 0, 102, 21, 0, 0, 176, 11, 0, 0, 184, 11, 0, 0, 188, 11, 0, 0, 194, 11, 0, 0, 110, 21, 0, 0, + 202, 11, 0, 0, 118, 21, 0, 0, 209, 11, 0, 0, 213, 11, 0, 0, 221, 11, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 229, 11, 0, 0, 237, 11, 0, 0, 245, 11, 0, 0, 253, 11, 0, 0, 1, 12, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 9, 12, 0, 0, 12, 12, 0, 0, + 20, 12, 0, 0, 134, 21, 0, 0, 28, 12, 0, 0, 36, 12, 0, 0, 137, 7, 0, 0, 44, 12, 0, 0, 52, 12, 0, 0, 60, 12, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 142, 21, 0, 0, 68, 12, 0, 0, 76, 12, 0, 0, 163, 23, 0, 0, 84, 12, 0, 0, 91, 12, 0, 0, 99, 12, 0, 0, 150, 21, 0, 0, 158, 21, 0, 0, 137, 7, 0, 0, 166, 21, 0, 0, 107, 12, 0, 0, 174, 21, 0, 0, 115, 12, 0, 0, 123, 12, 0, 0, + 131, 12, 0, 0, 139, 12, 0, 0, 147, 12, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 182, 21, 0, 0, 182, 21, 0, 0, 155, 12, 0, 0, 137, 7, 0, 0, 68, 18, 0, 0, 163, 12, 0, 0, 254, 18, 0, 0, 171, 12, 0, 0, 190, 21, 0, 0, 179, 12, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 187, 12, 0, 0, + 198, 21, 0, 0, 195, 12, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 206, 21, 0, 0, 203, 12, 0, 0, 210, 12, 0, 0, 217, 12, 0, 0, 225, 12, 0, 0, 229, 12, 0, 0, 236, 12, 0, 0, 244, 12, 0, 0, 214, 21, 0, 0, 216, 21, 0, 0, 252, 12, 0, 0, 3, 13, 0, 0, 224, 21, 0, 0, 228, 21, 0, 0, 11, 13, 0, 0, 17, 13, 0, 0, 236, 21, 0, 0, 25, 13, 0, 0, 33, 13, 0, 0, 37, 13, 0, 0, 244, 21, 0, 0, + 248, 21, 0, 0, 0, 22, 0, 0, 45, 13, 0, 0, 53, 13, 0, 0, 58, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 66, 13, 0, 0, 74, 13, 0, 0, 8, 22, 0, 0, 82, 13, 0, 0, 90, 13, 0, 0, 96, 13, 0, 0, 104, 13, 0, 0, 112, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 16, 22, 0, 0, 19, 22, 0, 0, 120, 13, 0, 0, 128, 13, 0, 0, 27, 22, 0, 0, 31, 22, 0, 0, + 136, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 39, 22, 0, 0, 144, 13, 0, 0, 152, 13, 0, 0, 137, 7, 0, 0, 47, 22, 0, 0, 51, 22, 0, 0, 160, 13, 0, 0, 168, 13, 0, 0, 59, 22, 0, 0, 176, 13, 0, 0, 184, 13, 0, 0, 137, 7, 0, 0, 192, 13, 0, 0, 200, 13, 0, 0, 208, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 67, 22, 0, 0, 216, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 76, 18, 0, 0, 6, 19, 0, 0, 224, 13, 0, 0, 232, 13, 0, 0, 238, 13, 0, 0, 246, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 254, 13, 0, 0, 2, 14, 0, 0, 10, 14, 0, 0, 75, 22, 0, 0, 79, 22, 0, 0, 18, 14, 0, 0, 87, 22, 0, 0, 93, 22, 0, 0, 26, 14, 0, 0, 101, 22, 0, 0, 34, 14, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 42, 14, 0, 0, 47, 14, 0, 0, 55, 14, 0, 0, 62, 14, 0, 0, 67, 14, 0, 0, 73, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 81, 14, 0, 0, 85, 14, 0, 0, 93, 14, 0, 0, 101, 14, 0, 0, 107, 14, 0, 0, 115, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 123, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 130, 14, 0, 0, 171, 23, 0, 0, 138, 14, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, + 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 146, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 103, 23, 0, 0, 103, 23, 0, 0, 103, 23, 0, 0, + 154, 14, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 162, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 166, 14, 0, 0, 117, 22, 0, 0, 117, 22, 0, 0, 170, 14, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, + 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 127, 22, 0, 0, 125, 22, 0, 0, 135, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 138, 22, 0, 0, + 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 178, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, + 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 151, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 186, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 194, 14, 0, 0, 202, 14, 0, 0, 210, 14, 0, 0, 159, 22, 0, 0, 214, 14, 0, 0, 222, 14, 0, 0, + 227, 14, 0, 0, 167, 22, 0, 0, 171, 22, 0, 0, 235, 14, 0, 0, 243, 14, 0, 0, 251, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 84, 18, 0, 0, 14, 19, 0, 0, 3, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 179, 22, 0, 0, 179, 22, 0, 0, 11, 15, 0, 0, 68, 23, 0, 0, 17, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 25, 15, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 33, 15, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 41, 15, 0, 0, 137, 7, 0, 0, 49, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 53, 15, 0, 0, 203, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 61, 15, 0, 0, 65, 15, 0, 0, 72, 15, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, + 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 76, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 220, 22, 0, 0, + 220, 22, 0, 0, 220, 22, 0, 0, 84, 15, 0, 0, 89, 15, 0, 0, 97, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 51, 5, 0, 0, 105, 15, 0, 0, 112, 15, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 119, 15, 0, 0, 137, 7, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, + 234, 24, 0, 0, 127, 15, 0, 0, 234, 24, 0, 0, 135, 15, 0, 0, 234, 24, 0, 0, 28, 23, 0, 0, 36, 23, 0, 0, 42, 23, 0, 0, 234, 24, 0, 0, 106, 9, 0, 0, 134, 25, 0, 0, 134, 25, 0, 0, 143, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 151, 15, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 159, 15, 0, 0, 167, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 92, 18, 0, 0, 99, 18, 0, 0, 175, 15, 0, 0, 102, 18, 0, 0, 183, 15, 0, 0, 191, 15, 0, 0, 199, 15, 0, 0, 96, 18, 0, 0, 207, 15, 0, 0, 215, 15, 0, 0, 223, 15, 0, 0, 101, 18, 0, 0, 109, 18, 0, 0, 92, 18, 0, 0, 99, 18, 0, 0, 95, 18, 0, 0, 102, 18, 0, 0, 110, 18, 0, 0, 93, 18, 0, 0, 100, 18, 0, 0, 96, 18, 0, 0, 230, 15, 0, 0, 118, 18, 0, 0, 126, 18, 0, 0, + 133, 18, 0, 0, 140, 18, 0, 0, 121, 18, 0, 0, 129, 18, 0, 0, 136, 18, 0, 0, 143, 18, 0, 0, 238, 15, 0, 0, 76, 23, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 50, 23, 0, 0, + 53, 23, 0, 0, 50, 23, 0, 0, 60, 23, 0, 0, 246, 15, 0, 0, 254, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 6, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 14, 16, 0, 0, 22, 16, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 228, 22, 0, 0, 30, 16, 0, 0, 38, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 42, 16, 0, 0, 47, 16, 0, 0, 236, 22, 0, 0, 55, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 63, 16, 0, 0, 244, 22, 0, 0, 244, 22, 0, 0, 244, 22, 0, 0, 244, 22, 0, 0, 244, 22, 0, 0, 244, 22, 0, 0, 71, 16, 0, 0, 137, 7, 0, 0, 151, 18, 0, 0, 159, 18, 0, 0, 79, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 87, 16, 0, 0, 179, 23, 0, 0, 92, 16, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 100, 16, 0, 0, 105, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 113, 16, 0, 0, 121, 16, 0, 0, 129, 16, 0, 0, 137, 16, 0, 0, 145, 16, 0, 0, 153, 16, 0, 0, 137, 7, 0, 0, 160, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 88, 25, 0, 0, 168, 16, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 172, 16, 0, 0, 180, 16, 0, 0, 184, 16, 0, 0, 189, 16, 0, 0, 187, 23, 0, 0, 150, 25, 0, 0, 242, 24, 0, 0, 156, 25, 0, 0, 242, 24, 0, 0, 197, 16, 0, 0, 189, 10, 0, 0, 204, 16, 0, 0, 212, 16, 0, 0, 216, 16, 0, 0, 224, 16, 0, 0, 232, 16, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 88, 25, 0, 0, + 88, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 164, 25, 0, 0, 172, 25, 0, 0, 180, 25, 0, 0, 218, 24, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 188, 25, 0, 0, 195, 25, 0, 0, 203, 25, 0, 0, 211, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 219, 25, 0, 0, 226, 25, 0, 0, 232, 25, 0, 0, 235, 25, 0, 0, 242, 25, 0, 0, 88, 25, 0, 0, 248, 25, 0, 0, 255, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, + 6, 26, 0, 0, 10, 26, 0, 0, 88, 25, 0, 0, 18, 26, 0, 0, 240, 16, 0, 0, 248, 16, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 0, 17, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 8, 17, 0, 0, 16, 17, 0, 0, 24, 17, 0, 0, 234, 24, 0, 0, 30, 17, 0, 0, 234, 24, 0, 0, 38, 17, 0, 0, 43, 17, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 26, 26, 0, 0, 34, 26, 0, 0, 88, 25, 0, 0, + 42, 26, 0, 0, 88, 25, 0, 0, 48, 26, 0, 0, 55, 26, 0, 0, 88, 25, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 0, 17, 0, 0, 51, 17, 0, 0, 59, 17, 0, 0, 64, 17, 0, 0, 72, 17, 0, 0, 80, 17, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 88, 17, 0, 0, 234, 24, 0, 0, 106, 9, 0, 0, 96, 17, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 104, 17, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 189, 10, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 112, 17, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 120, 17, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 127, 17, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 135, 17, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 120, 17, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 104, 17, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 143, 17, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 104, 17, 0, 0, 151, 17, 0, 0, 219, 23, 0, 0, 219, 23, 0, 0, 219, 23, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 51, 5, 0, 0, 51, 5, 0, 0, 51, 5, 0, 0, + 51, 5, 0, 0, 51, 5, 0, 0, 51, 5, 0, 0, 51, 5, 0, 0, 159, 17, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 167, 17, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 4, 0, 65, 128, 9, 0, 65, 192, 8, 0, 65, 192, 8, 0, 65, 64, 9, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, + 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 101, 128, 10, 0, 91, 128, 1, 0, 91, 192, 0, 0, 91, 0, 3, 0, 94, 64, 2, 0, 91, 128, 2, 0, 91, 0, 3, 0, 91, 192, 0, 0, 92, 0, 0, 0, 88, 128, 0, 0, 91, 0, 3, 0, 96, 64, 2, 0, + 91, 0, 2, 0, 87, 0, 4, 0, 91, 0, 2, 0, 91, 192, 1, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 91, 0, 2, 0, 91, 0, 2, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 91, 128, 1, 0, 91, 0, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, + 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 92, 0, 0, 0, 91, 64, 2, 0, 88, 128, 0, 0, + 95, 0, 3, 0, 86, 0, 3, 0, 95, 0, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 92, 0, 0, 0, 96, 64, 4, 0, 88, 64, 0, 0, 96, 0, 3, 0, 65, 64, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 64, 5, 0, 65, 64, 5, 0, + 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 192, 9, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, + 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 101, 0, 1, 0, 91, 0, 0, 0, 94, 128, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 97, 0, 3, 0, 91, 128, 8, 0, 95, 128, 8, 0, 97, 0, 3, 0, 10, 146, 8, 0, 90, 192, 0, 0, 96, 0, 3, 0, 66, 64, 4, 0, 97, 0, 3, 0, 95, 0, 3, 0, 97, 128, 2, 0, 96, 64, 2, 0, 84, 128, 8, 0, 84, 128, 8, 0, + 95, 128, 4, 0, 72, 0, 3, 0, 91, 128, 8, 0, 91, 128, 8, 0, 95, 128, 8, 0, 84, 128, 8, 0, 10, 146, 8, 0, 89, 192, 0, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 91, 0, 0, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, + 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 96, 128, 8, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 96, 128, 8, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 12, 18, 3, 0, 11, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 11, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 11, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 11, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 73, 0, 3, 0, 73, 128, 8, 0, 73, 128, 4, 0, 73, 128, 8, 0, 73, 128, 8, 0, 73, 128, 8, 0, + 73, 128, 4, 0, 73, 128, 8, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 128, 8, 0, 73, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 128, 8, 0, 95, 128, 8, 0, 95, 128, 8, 0, 95, 128, 8, 0, 95, 0, 3, 0, 95, 128, 8, 0, 95, 0, 3, 0, 95, 128, 4, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 31, 4, 3, 0, 31, 4, 3, 0, 73, 0, 3, 0, 95, 0, 3, 0, 73, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, + 95, 0, 3, 0, 95, 0, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 0, 1, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 73, 0, 3, 0, 159, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 137, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 91, 0, 2, 0, 140, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 159, 11, 3, 0, 95, 0, 3, 0, 140, 11, 3, 0, + 91, 0, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, + 140, 11, 3, 0, 140, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, + 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 160, 11, 3, 0, + 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, + 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, + 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, + 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, + 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 161, 7, 3, 0, 144, 71, 5, 0, + 144, 71, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 71, 5, 0, 143, 71, 5, 0, 143, 71, 5, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, + 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, + 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, + 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, + 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 3, 0, 0, 0, + 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, + 12, 2, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 9, 2, 3, 0, 27, 2, 3, 0, 27, 2, 3, 0, 27, 2, 3, 0, 27, 2, 3, 0, 27, 2, 3, 0, 27, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, + 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 27, 2, 2, 0, 23, 66, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 33, 2, 3, 0, 33, 2, 3, 0, 30, 66, 2, 0, + 3, 0, 0, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, + 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 87, 77, 4, 0, 80, 77, 5, 0, 91, 13, 3, 0, 80, 77, 5, 0, + 80, 77, 5, 0, 91, 13, 3, 0, 80, 77, 5, 0, 80, 77, 5, 0, 91, 141, 1, 0, 80, 77, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, + 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 91, 13, 3, 0, + 91, 13, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 130, 1, 3, 0, 130, 1, 3, 0, 130, 1, 3, 0, 130, 1, 3, 0, 130, 1, 3, 0, 66, 0, 3, 0, 160, 1, 3, 0, 160, 1, 3, 0, 160, 1, 3, 0, 155, 129, 2, 0, 155, 129, 2, 0, 158, 129, 2, 0, 91, 0, 2, 0, + 155, 1, 2, 0, 161, 1, 3, 0, 161, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 91, 128, 1, 0, 130, 65, 5, 0, 155, 129, 1, 0, 155, 129, 1, 0, 91, 128, 1, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 73, 0, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, + 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 155, 129, 2, 0, 155, 193, 2, 0, 155, 193, 2, 0, 155, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 144, 64, 5, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 155, 129, 1, 0, 138, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, + 144, 65, 5, 0, 66, 0, 3, 0, 161, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 137, 1, 3, 0, 137, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 161, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 138, 1, 3, 0, 138, 1, 3, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, + 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 138, 1, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, + 3, 0, 0, 0, 2, 34, 3, 0, 10, 34, 3, 0, 16, 98, 5, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, + 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, + 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, + 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, + 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 202, 36, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, + 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, + 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 9, 25, 3, 0, 9, 25, 3, 0, 33, 25, 3, 0, + 27, 25, 3, 0, 27, 25, 2, 0, 27, 153, 1, 0, 9, 25, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 89, 5, 0, 30, 89, 2, 0, 30, 89, 2, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 73, 30, 3, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 73, 30, 3, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 3, 0, 0, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, + 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 144, 84, 5, 0, 144, 84, 5, 0, 144, 84, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 20, 3, 0, 3, 0, 0, 0, 10, 34, 3, 0, 10, 34, 3, 0, + 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 159, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 130, 1, 3, 0, 130, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, + 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 138, 3, 3, 0, 144, 67, 5, 0, 142, 67, 5, 0, 142, 67, 5, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, + 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 138, 3, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 67, 5, 0, 138, 3, 3, 0, 142, 67, 5, 0, 142, 67, 5, 0, 142, 67, 5, 0, 144, 67, 5, 0, 144, 67, 5, 0, 144, 67, 5, 0, 144, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 67, 5, 0, 142, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 67, 5, 0, 142, 67, 5, 0, 144, 67, 5, 0, 138, 3, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 144, 67, 5, 0, 144, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 146, 195, 2, 0, 146, 195, 2, 0, + 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 138, 3, 3, 0, 138, 3, 3, 0, 158, 131, 2, 0, 158, 131, 2, 0, 148, 3, 3, 0, 148, 3, 3, 0, 148, 3, 3, 0, 148, 3, 3, 0, 148, 3, 3, 0, 148, 131, 2, 0, 161, 3, 3, 0, 158, 67, 2, 0, 138, 3, 3, 0, 155, 3, 3, 0, 144, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 16, 76, 5, 0, 16, 76, 5, 0, 14, 76, 5, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, + 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 16, 76, 5, 0, 3, 0, 0, 0, 14, 76, 5, 0, 14, 76, 5, 0, 14, 76, 5, 0, 16, 76, 5, 0, 16, 76, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 76, 5, 0, 16, 76, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 76, 5, 0, 16, 76, 5, 0, 16, 76, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 76, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 10, 12, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, + 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, 16, 76, 5, 0, 16, 76, 5, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 16, 76, 5, 0, 27, 12, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 208, 75, 5, 0, 208, 75, 5, 0, 206, 75, 5, 0, 3, 0, 0, 0, 202, 11, 3, 0, + 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, + 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 208, 75, 5, 0, 202, 11, 3, 0, 206, 75, 5, 0, 206, 75, 5, 0, + 206, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 3, 0, 0, 0, 208, 75, 5, 0, 208, 75, 5, 0, 206, 75, 5, 0, 3, 0, 0, 0, 206, 75, 5, 0, 206, 75, 5, 0, 208, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 208, 75, 5, 0, 208, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 219, 11, 3, 0, 222, 75, 2, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 11, 3, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 3, 0, 0, 0, 80, 90, 5, 0, 78, 90, 5, 0, 78, 90, 5, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, + 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, + 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 90, 5, 0, 74, 26, 3, 0, 78, 90, 5, 0, 80, 90, 5, 0, 78, 90, 5, 0, 80, 90, 5, 0, 80, 90, 5, 0, 80, 90, 5, 0, 80, 90, 5, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 78, 90, 5, 0, 78, 90, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 90, 5, 0, 78, 90, 5, 0, 80, 90, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 90, 5, 0, 80, 90, 5, 0, 78, 90, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, + 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 80, 90, 5, 0, 80, 90, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 97, 26, 3, 0, 74, 26, 3, 0, 84, 26, 3, 0, 84, 26, 3, 0, 84, 26, 3, 0, 84, 26, 3, 0, 84, 26, 3, 0, + 84, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 99, 5, 0, 74, 35, 3, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, + 74, 35, 3, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 74, 35, 3, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, + 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 99, 5, 0, 78, 99, 5, 0, 80, 99, 5, 0, 78, 99, 5, 0, + 78, 99, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 99, 5, 0, 78, 99, 5, 0, 78, 99, 5, 0, 3, 0, 0, 0, 78, 99, 5, 0, 78, 99, 5, 0, 78, 99, 5, 0, 80, 99, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 99, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, + 97, 35, 3, 0, 94, 99, 2, 0, 97, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 100, 5, 0, 14, 100, 5, 0, 14, 100, 5, 0, 14, 100, 5, 0, 16, 100, 5, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 3, 0, 0, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, + 3, 0, 0, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 3, 0, 0, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, + 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 100, 5, 0, 10, 36, 3, 0, 16, 100, 5, 0, 16, 100, 5, 0, 16, 100, 5, 0, 14, 100, 5, 0, 14, 100, 5, 0, 14, 100, 5, 0, 14, 100, 5, 0, 3, 0, 0, 0, 16, 100, 5, 0, 16, 100, 5, 0, 16, 100, 5, 0, 3, 0, 0, 0, 16, 100, 5, 0, + 16, 100, 5, 0, 16, 100, 5, 0, 16, 100, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 100, 5, 0, 16, 100, 5, 0, 3, 0, 0, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 36, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 36, 3, 0, 10, 36, 3, 0, 16, 100, 5, 0, 16, 100, 5, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 164, 4, 0, 20, 36, 3, 0, 20, 36, 3, 0, 20, 36, 3, 0, 20, 36, 3, 0, 20, 36, 3, 0, + 20, 36, 3, 0, 20, 36, 3, 0, 33, 36, 3, 0, 10, 17, 3, 0, 16, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 27, 145, 4, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, + 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, + 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 81, 5, 0, 10, 17, 3, 0, 14, 81, 5, 0, 16, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 3, 0, 0, 0, 16, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 3, 0, 0, 0, 14, 81, 5, 0, 14, 81, 5, 0, 16, 81, 5, 0, 16, 81, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 14, 81, 5, 0, 14, 81, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 16, 81, 5, 0, 16, 81, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, + 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 86, 5, 0, 80, 86, 5, 0, + 78, 86, 5, 0, 78, 86, 5, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 3, 0, 0, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 3, 0, 0, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, + 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 78, 86, 5, 0, 80, 86, 5, 0, 80, 86, 5, 0, 80, 86, 5, 0, 80, 86, 5, 0, 3, 0, 0, 0, 78, 86, 5, 0, 78, 86, 5, 0, 78, 86, 5, 0, 3, 0, 0, 0, 78, 86, 5, 0, 78, 86, 5, 0, 78, 86, 5, 0, 80, 86, 5, 0, 74, 22, 3, 0, 97, 22, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 78, 86, 5, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 80, 86, 5, 0, 80, 86, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, + 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 97, 150, 2, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 3, 0, 0, 0, 80, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 3, 0, 0, 0, 74, 32, 3, 0, + 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, + 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 3, 0, 0, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, + 3, 0, 0, 0, 74, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 96, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 80, 96, 5, 0, 80, 96, 5, 0, 80, 96, 5, 0, + 3, 0, 0, 0, 80, 96, 5, 0, 3, 0, 0, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, + 82, 224, 2, 0, 82, 224, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 96, 5, 0, 78, 96, 5, 0, 91, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, + 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, + 10, 37, 10, 0, 16, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 94, 64, 2, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 9, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, + 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 27, 37, 3, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 27, 101, 4, 0, 27, 101, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 3, 0, 0, 0, 202, 17, 10, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, + 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 3, 0, 0, 0, 202, 17, 10, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 208, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 208, 17, 10, 0, + 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 202, 17, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 3, 0, 0, 0, 201, 17, 10, 0, 3, 0, 0, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, + 74, 37, 3, 0, 3, 0, 0, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, + 74, 37, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 78, 101, 4, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, + 91, 101, 4, 0, 80, 101, 5, 0, 80, 101, 5, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 3, 0, 0, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, + 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, + 80, 101, 5, 0, 80, 101, 5, 0, 3, 0, 0, 0, 97, 101, 4, 0, 97, 101, 4, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 80, 101, 5, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 3, 0, 0, 0, 97, 37, 3, 0, 97, 37, 3, 0, 91, 165, 4, 0, 91, 165, 4, 0, 91, 101, 4, 0, 91, 165, 4, 0, + 91, 37, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 91, 37, 1, 0, 91, 37, 1, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 3, 0, 0, 0, 12, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 12, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, + 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 208, 73, 5, 0, 208, 73, 5, 0, 208, 73, 5, 0, 219, 9, 3, 0, 219, 73, 4, 0, 219, 9, 3, 0, 219, 9, 3, 0, 219, 9, 3, 0, 219, 9, 3, 0, 219, 9, 3, 0, 219, 9, 3, 0, 219, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, + 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, + 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 165, 89, 4, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, + 138, 25, 3, 0, 138, 25, 3, 0, 156, 25, 0, 0, 152, 89, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 19, 30, 3, 0, 19, 30, 3, 0, 19, 30, 3, 0, 10, 30, 3, 0, + 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, + 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 144, 100, 5, 0, 144, 100, 5, 0, 144, 100, 5, 0, 142, 100, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 36, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, + 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 208, 76, 5, 0, 208, 76, 5, 0, 206, 76, 5, 0, 91, 64, 4, 0, 91, 64, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 16, 69, 5, 0, 16, 69, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 3, 0, 0, 0, 74, 34, 3, 0, + 74, 34, 3, 0, 74, 34, 3, 0, 3, 0, 0, 0, 80, 98, 5, 0, 80, 98, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 16, 10, 0, 78, 16, 10, 0, 78, 16, 10, 0, 78, 16, 10, 0, 78, 16, 10, 0, 78, 16, 10, 0, 80, 16, 10, 0, 78, 16, 10, 0, + 78, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 91, 80, 4, 0, 91, 80, 4, 0, 91, 80, 1, 0, 73, 16, 10, 0, 91, 80, 4, 0, 91, 16, 3, 0, 91, 80, 4, 0, 94, 80, 2, 0, 74, 16, 10, 0, 80, 16, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 208, 2, 0, + 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 22, 3, 0, 219, 22, 3, 0, 91, 128, 1, 0, 91, 128, 1, 0, 219, 86, 4, 0, 91, 64, 4, 0, 215, 150, 4, 0, 219, 22, 3, 0, 219, 150, 1, 0, 219, 150, 1, 0, 219, 22, 3, 0, 208, 86, 5, 0, 208, 86, 5, 0, 208, 86, 5, 0, 194, 22, 1, 0, 208, 86, 5, 0, 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, + 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 208, 86, 5, 0, 202, 22, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, + 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, + 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 3, 0, 0, 0, + 144, 82, 5, 0, 144, 82, 5, 0, 144, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 144, 82, 5, 0, 144, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 82, 5, 0, 142, 82, 5, 0, 144, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, + 144, 82, 5, 0, 144, 82, 5, 0, 144, 82, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 161, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 146, 1, 0, 155, 146, 1, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 202, 34, 10, 0, 202, 34, 10, 0, + 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 227, 2, 0, + 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 20, 35, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 33, 35, 10, 0, 33, 35, 10, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, + 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 208, 68, 5, 0, 208, 68, 5, 0, 206, 68, 5, 0, 206, 68, 5, 0, 208, 68, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 4, 3, 0, 219, 4, 3, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, + 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 142, 17, 10, 0, 144, 17, 10, 0, 142, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, + 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 3, 0, 0, 0, 144, 17, 10, 0, 142, 17, 10, 0, 144, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, + 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 81, 5, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, + 137, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 143, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 66, 5, 0, 142, 66, 5, 0, 144, 66, 5, 0, 142, 66, 5, 0, 142, 66, 5, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 146, 194, 2, 0, 146, 194, 2, 0, + 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 155, 66, 4, 0, 155, 66, 4, 0, 155, 2, 3, 0, 155, 66, 4, 0, 155, 66, 4, 0, 155, 66, 4, 0, 155, 66, 4, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, + 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 155, 66, 4, 0, 155, 66, 4, 0, 3, 0, 0, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, + 74, 3, 3, 0, 74, 3, 3, 0, 80, 67, 5, 0, 78, 67, 5, 0, 80, 67, 5, 0, 80, 67, 5, 0, 78, 67, 5, 0, 78, 67, 5, 0, 78, 67, 5, 0, 80, 67, 5, 0, 78, 67, 5, 0, 80, 67, 5, 0, 80, 67, 5, 0, 80, 67, 5, 0, 78, 67, 5, 0, 78, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 91, 3, 3, 0, + 91, 3, 3, 0, 91, 3, 3, 0, 91, 3, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, + 80, 82, 5, 0, 80, 82, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 91, 82, 4, 0, 91, 82, 4, 0, 91, 82, 4, 0, 91, 82, 4, 0, 91, 82, 4, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 18, 3, 0, 74, 18, 3, 0, + 74, 18, 3, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, + 136, 7, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, + 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 91, 0, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 78, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 144, 64, 5, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 144, 64, 5, 0, 74, 0, 3, 0, 74, 0, 3, 0, 78, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 74, 0, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, + 3, 0, 0, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, + 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 139, 11, 3, 0, 159, 11, 3, 0, 136, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, + 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 139, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 3, 0, 0, 0, 159, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, + 140, 11, 3, 0, 139, 11, 3, 0, 159, 139, 4, 0, 159, 11, 3, 0, 3, 0, 0, 0, 66, 128, 5, 0, 66, 0, 3, 0, 66, 0, 3, 0, 66, 0, 3, 0, 66, 0, 3, 0, 3, 0, 0, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 84, 0, 3, 0, 9, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 84, 128, 8, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 9, 146, 8, 0, 84, 0, 3, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 3, 0, 0, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 94, 128, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, + 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 143, 64, 5, 0, 143, 64, 5, 0, + 143, 64, 5, 0, 143, 64, 5, 0, 144, 64, 5, 0, 143, 64, 5, 0, 143, 64, 5, 0, 143, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 84, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 96, 128, 8, 0, + 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 200, 6, 3, 0, 225, 6, 3, 0, 225, 6, 3, 0, 225, 6, 3, 0, 225, 6, 3, 0, 225, 6, 3, 0, 225, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 208, 70, 5, 0, 208, 70, 5, 0, 208, 70, 5, 0, 204, 6, 3, 0, + 200, 6, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 134, 1, 0, 219, 70, 4, 0, 219, 70, 4, 0, 219, 70, 4, 0, 212, 6, 3, 0, 219, 134, 1, 0, 219, 70, 4, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 3, 0, 0, 0, 8, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 8, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 73, 36, 3, 0, 91, 100, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 100, 5, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 87, 64, 4, 0, 91, 64, 4, 0, 92, 0, 0, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 91, 0, 3, 0, 91, 128, 1, 0, 91, 128, 1, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 87, 64, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, + 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 3, 0, 0, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, + 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, + 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, + 138, 141, 3, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 13, 9, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 144, 64, 5, 0, 95, 64, 1, 0, 95, 64, 1, 0, 137, 77, 1, 0, 137, 77, 1, 0, 138, 141, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, + 10, 132, 3, 0, 10, 132, 3, 0, 3, 0, 0, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 97, 128, 3, 0, 97, 128, 3, 0, 84, 128, 3, 0, + 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, + 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 3, 0, 0, 0, 74, 168, 3, 0, 74, 168, 3, 0, + 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, + 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, + 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 138, 38, 3, 0, 138, 38, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, + 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 208, 66, 5, 0, 208, 66, 5, 0, 219, 2, 3, 0, 219, 66, 4, 0, 219, 66, 4, 0, 219, 66, 4, 0, 219, 66, 4, 0, 219, 66, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 18, 3, 0, 8, 18, 3, 0, 3, 0, 0, 0, 8, 18, 3, 0, 3, 0, 0, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 206, 97, 5, 0, 206, 97, 5, 0, 208, 97, 5, 0, 208, 97, 5, 0, 206, 97, 5, 0, 225, 33, 3, 0, 225, 33, 3, 0, 225, 33, 3, 0, 225, 33, 3, 0, 208, 97, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 94, 128, 2, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, + 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 27, 156, 4, 0, 27, 156, 4, 0, 27, 156, 1, 0, 27, 156, 1, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, + 208, 94, 5, 0, 208, 94, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 94, 4, 0, 219, 94, 4, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 142, 93, 5, 0, 142, 93, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 29, 3, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, + 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 79, 5, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 79, 4, 0, + 91, 79, 4, 0, 91, 79, 4, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 3, 0, 0, 0, 73, 0, 3, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 91, 15, 3, 0, 91, 15, 3, 0, 202, 23, 10, 0, + 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 208, 23, 10, 0, 201, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, + 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 3, 0, 0, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 16, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, 14, 70, 5, 0, 14, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, + 14, 70, 5, 0, 14, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 16, 70, 5, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, + 16, 70, 5, 0, 14, 70, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 6, 3, 0, 27, 70, 4, 0, 27, 70, 4, 0, 27, 70, 4, 0, 202, 35, 10, 0, 208, 35, 10, 0, 202, 35, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 35, 10, 0, 202, 35, 10, 0, 201, 35, 10, 0, + 219, 35, 10, 0, 219, 35, 10, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 78, 87, 5, 0, 80, 87, 5, 0, 80, 87, 5, 0, 78, 87, 5, 0, 78, 87, 5, 0, 91, 87, 4, 0, 91, 87, 4, 0, 74, 23, 3, 0, 73, 23, 3, 0, 73, 23, 3, 0, 78, 87, 5, 0, 80, 87, 5, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 136, 11, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 9, 18, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, + 72, 6, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 78, 87, 5, 0, 78, 87, 5, 0, 80, 87, 5, 0, 78, 87, 5, 0, 78, 87, 5, 0, 80, 87, 5, 0, 78, 87, 5, 0, 78, 87, 5, 0, 91, 87, 4, 0, 78, 87, 5, 0, 80, 87, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, + 82, 215, 2, 0, 82, 215, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 140, 6, 0, + 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, + 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, + 74, 204, 6, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 77, 3, 0, 80, 77, 5, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 96, 13, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, + 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 3, 0, 0, 0, 74, 77, 3, 0, 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, + 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 161, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 158, 129, 2, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 91, 0, 2, 0, 91, 64, 0, 0, 91, 64, 0, 0, 91, 0, 2, 0, 91, 0, 2, 0, 91, 128, 1, 0, 91, 128, 1, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 192, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 128, 3, 0, 91, 128, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 128, 3, 0, 91, 128, 3, 0, 91, 128, 3, 0, 91, 128, 3, 0, 86, 128, 3, 0, 86, 128, 3, 0, 86, 128, 3, 0, 91, 64, 0, 0, 91, 128, 3, 0, 91, 64, 0, 0, 3, 0, 0, 0, 91, 64, 1, 0, 91, 64, 1, 0, 91, 128, 1, 0, 91, 128, 1, 0, + 87, 128, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 128, 3, 0, 91, 128, 3, 0, 91, 128, 3, 0, 96, 128, 3, 0, 87, 128, 3, 0, 96, 128, 3, 0, 96, 128, 3, 0, 96, 128, 3, 0, 3, 0, 0, 0, 91, 128, 3, 0, 94, 64, 2, 0, 91, 128, 2, 0, 91, 128, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 66, 128, 5, 0, 3, 0, 0, 0, 91, 128, 1, 0, 91, 128, 3, 0, 91, 128, 3, 0, 94, 64, 2, 0, 91, 128, 2, 0, 91, 128, 3, 0, 91, 128, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 128, 3, 0, + 96, 128, 3, 0, 91, 64, 0, 0, 87, 128, 3, 0, 91, 64, 0, 0, 91, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 91, 64, 1, 0, 91, 64, 1, 0, 96, 128, 3, 0, 96, 128, 3, 0, 96, 128, 3, 0, 91, 128, 1, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, + 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, + 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, + 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 94, 128, 2, 0, 94, 64, 2, 0, 96, 128, 3, 0, 95, 128, 3, 0, 97, 128, 3, 0, 94, 64, 2, 0, 94, 64, 2, 0, 3, 0, 0, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 97, 0, 8, 0, 97, 128, 8, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 148, 11, 3, 0, 148, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, + 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 161, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, + 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, + 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 20, 15, 3, 0, 20, 15, 3, 0, 20, 15, 3, 0, 20, 15, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, + 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 19, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 19, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 208, 91, 5, 0, 208, 91, 5, 0, 208, 91, 5, 0, + 208, 91, 5, 0, 208, 91, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, + 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 3, 0, 0, 0, 91, 102, 4, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, + 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 155, 103, 4, 0, 147, 39, 3, 0, 147, 39, 3, 0, 147, 39, 3, 0, 147, 39, 3, 0, 147, 39, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, + 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, + 202, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, + 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, + 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, + 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 1, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, + 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 3, 0, 0, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 3, 0, 0, 0, 204, 38, 3, 0, 204, 38, 3, 0, 3, 0, 0, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, + 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 3, 0, 0, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 3, 0, 0, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, + 200, 38, 3, 0, 200, 38, 3, 0, 3, 0, 0, 0, 200, 38, 3, 0, 200, 38, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, + 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, + 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, + 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 3, 0, 0, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 3, 0, 0, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 7, 3, 0, 3, 0, 0, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, + 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 3, 0, 0, 0, 74, 7, 3, 0, 74, 7, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 7, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 7, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, + 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 3, 0, 0, 0, 219, 65, 4, 0, 212, 1, 3, 0, 212, 1, 3, 0, 212, 1, 3, 0, 212, 1, 3, 0, 212, 1, 3, 0, + 212, 1, 3, 0, 212, 1, 3, 0, 212, 1, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, + 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, + 148, 24, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, + 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 3, 0, 0, 0, 10, 13, 3, 0, 10, 13, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 20, 13, 3, 0, 20, 13, 3, 0, 20, 13, 3, 0, 20, 13, 3, 0, 20, 13, 3, 0, 202, 28, 3, 0, + 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 212, 28, 3, 0, 212, 28, 3, 0, 212, 28, 3, 0, 212, 28, 3, 0, + 212, 28, 3, 0, 212, 28, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 92, 4, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, + 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 19, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, + 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 212, 21, 3, 0, 212, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, + 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, + 212, 21, 3, 0, 212, 21, 3, 0, 10, 16, 3, 0, 16, 80, 5, 0, 16, 80, 5, 0, 16, 80, 5, 0, 3, 0, 0, 0, 16, 80, 5, 0, 16, 80, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 80, 5, 0, 16, 80, 5, 0, 16, 80, 5, 0, 16, 80, 5, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 3, 0, 0, 0, 10, 16, 3, 0, 10, 16, 3, 0, + 10, 16, 3, 0, 3, 0, 0, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, + 10, 16, 3, 0, 10, 16, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 80, 5, 0, 16, 80, 5, 0, 16, 80, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 80, 5, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 16, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 208, 84, 5, 0, + 208, 84, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 212, 20, 3, 0, 212, 20, 3, 0, 212, 20, 3, 0, 212, 20, 3, 0, 212, 20, 3, 0, 219, 84, 4, 0, 219, 84, 4, 0, 219, 84, 4, 0, 219, 84, 4, 0, 219, 84, 4, 0, 219, 84, 4, 0, 219, 212, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 91, 66, 4, 0, 91, 66, 4, 0, 91, 66, 4, 0, 91, 66, 4, 0, 91, 66, 4, 0, 91, 66, 4, 0, 91, 66, 4, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, + 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, + 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, + 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 28, 3, 0, 155, 28, 3, 0, 155, 28, 3, 0, + 155, 28, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 148, 28, 3, 0, 148, 28, 3, 0, 148, 28, 3, 0, 148, 28, 3, 0, 148, 28, 3, 0, 148, 28, 3, 0, 148, 28, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, + 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 212, 14, 3, 0, 212, 14, 3, 0, 212, 14, 3, 0, 212, 14, 3, 0, 212, 14, 3, 0, 212, 14, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 208, 93, 5, 0, 208, 93, 5, 0, 208, 93, 5, 0, 208, 93, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 210, 221, 2, 0, 210, 221, 2, 0, + 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, + 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 3, 0, 0, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, + 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 3, 0, 0, 0, 16, 104, 5, 0, 16, 104, 5, 0, 23, 104, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 40, 3, 0, 10, 40, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 202, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, + 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 148, 32, 3, 0, 148, 32, 3, 0, + 148, 32, 3, 0, 148, 32, 3, 0, 155, 32, 3, 0, 155, 32, 3, 0, 155, 32, 3, 0, 155, 32, 3, 0, 155, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 16, 91, 5, 0, 16, 91, 5, 0, 16, 91, 5, 0, 16, 91, 5, 0, 27, 27, 3, 0, 27, 27, 3, 0, 27, 27, 3, 0, + 27, 27, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 6, 3, 0, 138, 6, 3, 0, + 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, + 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 68, 5, 0, + 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 91, 68, 4, 0, 91, 68, 4, 0, 91, 4, 3, 0, 91, 4, 3, 0, 91, 4, 3, 0, 91, 4, 3, 0, 91, 4, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, + 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 80, 68, 5, 0, 74, 4, 3, 0, 74, 4, 3, 0, 80, 68, 5, 0, 80, 68, 5, 0, 74, 4, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 68, 5, 0, 91, 81, 4, 0, 91, 81, 4, 0, 80, 81, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 66, 17, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 225, 2, 0, + 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, + 80, 69, 5, 0, 80, 69, 5, 0, 78, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 3, 0, 0, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 91, 69, 4, 0, 91, 69, 4, 0, 91, 69, 4, 0, + 91, 69, 4, 0, 74, 5, 3, 0, 78, 69, 5, 0, 78, 69, 5, 0, 74, 5, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, + 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 16, 84, 5, 0, 27, 20, 3, 0, 27, 148, 4, 0, 10, 20, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, + 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 3, 0, 0, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, + 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 142, 80, 5, 0, 142, 80, 5, 0, 142, 80, 5, 0, 144, 80, 5, 0, 144, 80, 5, 0, 144, 80, 5, 0, 142, 80, 5, 0, 142, 80, 5, 0, 144, 80, 5, 0, 142, 80, 5, 0, 144, 80, 5, 0, 144, 80, 5, 0, 155, 80, 4, 0, 155, 80, 4, 0, 155, 16, 3, 0, 155, 80, 4, 0, + 155, 80, 4, 0, 155, 16, 3, 0, 144, 80, 5, 0, 3, 0, 0, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 3, 0, 0, 0, 138, 23, 3, 0, 3, 0, 0, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 3, 0, 0, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, + 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 3, 0, 0, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 155, 87, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 14, 96, 5, 0, 14, 96, 5, 0, 14, 96, 5, 0, 16, 96, 5, 0, 16, 96, 5, 0, 16, 96, 5, 0, 16, 96, 5, 0, + 16, 96, 5, 0, 16, 96, 5, 0, 16, 96, 5, 0, 16, 96, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 80, 75, 5, 0, 80, 75, 5, 0, 78, 75, 5, 0, 78, 75, 5, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, + 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, + 3, 0, 0, 0, 144, 64, 5, 0, 80, 75, 5, 0, 74, 11, 3, 0, 78, 75, 5, 0, 78, 75, 5, 0, 80, 75, 5, 0, 78, 75, 5, 0, 78, 75, 5, 0, 78, 75, 5, 0, 78, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 75, 5, 0, 78, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 75, 5, 0, 78, 75, 5, 0, 78, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 78, 75, 5, 0, 78, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, + 80, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 206, 88, 5, 0, 206, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, + 206, 88, 5, 0, 208, 88, 5, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 219, 88, 4, 0, 219, 88, 4, 0, 219, 88, 4, 0, 219, 88, 4, 0, 219, 24, 3, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 219, 88, 4, 0, 219, 88, 4, 0, 3, 0, 0, 0, 219, 24, 3, 0, + 208, 88, 5, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 101, 5, 0, 142, 101, 5, 0, 144, 101, 5, 0, 144, 101, 5, 0, 138, 37, 3, 0, 138, 37, 3, 0, 155, 37, 3, 0, 138, 37, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, + 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 206, 95, 5, 0, 206, 95, 5, 0, 206, 95, 5, 0, 208, 95, 5, 0, 208, 95, 5, 0, 208, 95, 5, 0, 208, 95, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 206, 95, 5, 0, 206, 95, 5, 0, 206, 95, 5, 0, 206, 95, 5, 0, 208, 95, 5, 0, 208, 95, 5, 0, 206, 95, 5, 0, 208, 95, 5, 0, 208, 95, 5, 0, 219, 159, 4, 0, + 219, 95, 4, 0, 219, 95, 4, 0, 219, 159, 1, 0, 219, 159, 1, 0, 219, 31, 3, 0, 219, 31, 3, 0, 219, 31, 3, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, + 202, 31, 3, 0, 208, 95, 5, 0, 208, 95, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 86, 5, 0, 155, 86, 4, 0, 155, 86, 4, 0, 155, 22, 3, 0, 138, 22, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, + 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, + 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 144, 98, 5, 0, 142, 98, 5, 0, 144, 98, 5, 0, 142, 98, 5, 0, 142, 98, 5, 0, 144, 98, 5, 0, 144, 98, 5, 0, 144, 98, 5, 0, 144, 98, 5, 0, 144, 98, 5, 0, 144, 98, 5, 0, 142, 98, 5, 0, 144, 98, 5, 0, 138, 34, 3, 0, 155, 34, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, + 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, 78, 1, 10, 0, 78, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, 78, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, + 80, 1, 10, 0, 80, 1, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 84, 1, 10, 0, 84, 1, 10, 0, 91, 65, 4, 0, 91, 65, 4, 0, 91, 65, 4, 0, 97, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, + 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 78, 72, 5, 0, 78, 72, 5, 0, 78, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, + 80, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 78, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 91, 8, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 20, 39, 3, 0, 20, 39, 3, 0, 20, 39, 3, 0, 20, 39, 3, 0, + 20, 39, 3, 0, 20, 39, 3, 0, 20, 39, 3, 0, 20, 39, 3, 0, 20, 39, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 39, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 10, 8, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 3, 0, 0, 0, 10, 8, 3, 0, 10, 8, 3, 0, 3, 0, 0, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, + 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 14, 72, 5, 0, 14, 72, 5, 0, 14, 72, 5, 0, 14, 72, 5, 0, 14, 72, 5, 0, 14, 72, 5, 0, 3, 0, 0, 0, 14, 72, 5, 0, 14, 72, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 72, 5, 0, 16, 72, 5, 0, 14, 72, 5, 0, 16, 72, 5, 0, 10, 8, 3, 0, 14, 72, 5, 0, + 10, 8, 3, 0, 14, 72, 5, 0, 16, 72, 5, 0, 27, 72, 4, 0, 27, 72, 4, 0, 27, 72, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, + 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 14, 88, 5, 0, 14, 88, 5, 0, 14, 88, 5, 0, 16, 88, 5, 0, 16, 88, 5, 0, 16, 88, 5, 0, 16, 88, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 88, 5, 0, 16, 88, 5, 0, + 14, 88, 5, 0, 14, 88, 5, 0, 14, 88, 5, 0, 14, 88, 5, 0, 16, 88, 5, 0, 10, 24, 3, 0, 27, 152, 4, 0, 10, 24, 3, 0, 14, 88, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 40, 3, 0, 155, 104, 4, 0, 155, 104, 4, 0, 155, 104, 4, 0, 155, 104, 4, 0, 155, 168, 4, 0, 155, 40, 3, 0, 144, 104, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 74, 33, 3, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 78, 97, 5, 0, 78, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 91, 161, 4, 0, 91, 97, 4, 0, 91, 97, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, + 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 3, 0, 0, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, + 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 206, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, + 3, 0, 0, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 206, 67, 5, 0, 208, 67, 5, 0, 202, 3, 3, 0, 219, 67, 4, 0, 219, 67, 4, 0, 219, 67, 4, 0, 219, 67, 4, 0, 219, 67, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 149, 4, 0, 27, 149, 1, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 3, 0, 0, 0, 14, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 14, 85, 5, 0, 16, 85, 5, 0, + 16, 85, 5, 0, 14, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 3, 0, 0, 0, 202, 10, 3, 0, 202, 10, 3, 0, 3, 0, 0, 0, 202, 10, 3, 0, + 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, + 208, 74, 5, 0, 208, 74, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 208, 74, 5, 0, 3, 0, 0, 0, 208, 74, 5, 0, 208, 74, 5, 0, 3, 0, 0, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 202, 10, 3, 0, 208, 74, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 3, 0, 0, 0, + 138, 10, 3, 0, 138, 10, 3, 0, 3, 0, 0, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, + 138, 10, 3, 0, 138, 10, 3, 0, 142, 74, 5, 0, 142, 74, 5, 0, 142, 74, 5, 0, 142, 74, 5, 0, 142, 74, 5, 0, 3, 0, 0, 0, 144, 74, 5, 0, 144, 74, 5, 0, 3, 0, 0, 0, 142, 74, 5, 0, 142, 74, 5, 0, 144, 74, 5, 0, 142, 74, 5, 0, 144, 74, 5, 0, 138, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 146, 202, 2, 0, + 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, + 80, 84, 5, 0, 80, 84, 5, 0, 78, 84, 5, 0, 78, 84, 5, 0, 91, 20, 3, 0, 91, 20, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 74, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 94, 163, 2, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, + 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 91, 99, 4, 0, 202, 39, 3, 0, 202, 39, 3, 0, + 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 3, 0, 0, 0, 219, 103, 4, 0, 219, 103, 4, 0, 219, 103, 4, 0, 219, 103, 4, 0, + 219, 103, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, + 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 27, 7, 3, 0, 27, 7, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 3, 0, 0, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 0, 0, + 2, 73, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, + 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, + 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, + 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 3, 0, 0, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 87, 4, 0, 27, 87, 4, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, + 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, + 202, 37, 3, 0, 3, 0, 0, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, + 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 67, 5, 0, 16, 67, 5, 0, 16, 67, 5, 0, 16, 67, 5, 0, 16, 67, 5, 0, 27, 67, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 9, 14, 3, 0, 9, 14, 3, 0, 9, 14, 3, 0, 9, 14, 3, 0, 27, 78, 4, 0, 33, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, + 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, 3, 0, 0, 0, 20, 14, 3, 0, 20, 14, 3, 0, 20, 14, 3, 0, 20, 14, 3, 0, 20, 14, 3, 0, 20, 14, 3, 0, 20, 14, 3, 0, 3, 0, 0, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, + 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, + 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 91, 85, 4, 0, 91, 85, 4, 0, + 91, 21, 3, 0, 91, 21, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 93, 5, 0, 10, 29, 3, 0, 14, 93, 5, 0, + 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 93, 5, 0, 16, 93, 5, 0, 16, 93, 5, 0, 16, 93, 5, 0, + 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 137, 99, 1, 0, 73, 89, 1, 0, 155, 76, 1, 0, 137, 76, 1, 0, 208, 16, 1, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 76, 5, 0, 142, 76, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, + 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 201, 15, 3, 0, 201, 15, 3, 0, 201, 15, 3, 0, 201, 15, 3, 0, 3, 0, 0, 0, 201, 15, 3, 0, 201, 15, 3, 0, 201, 15, 3, 0, 201, 15, 3, 0, + 201, 15, 3, 0, 201, 15, 3, 0, 201, 15, 3, 0, 3, 0, 0, 0, 201, 15, 3, 0, 201, 15, 3, 0, 3, 0, 0, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 13, 9, 0, 138, 13, 9, 0, 138, 13, 9, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, + 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 8, 3, 0, + 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, + 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 225, 8, 3, 0, 208, 72, 5, 0, 208, 72, 5, 0, + 219, 72, 4, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 144, 75, 5, 0, 144, 75, 5, 0, 144, 75, 5, 0, 161, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 76, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 76, 0, 3, 0, 72, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, + 33, 31, 3, 0, 16, 95, 5, 0, 33, 31, 3, 0, 33, 31, 3, 0, 27, 95, 4, 0, 27, 95, 4, 0, 27, 95, 4, 0, 27, 95, 4, 0, 27, 31, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 95, 5, 0, + 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 3, 0, 0, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 3, 0, 0, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, + 3, 0, 0, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, + 80, 74, 5, 0, 80, 74, 5, 0, 3, 0, 0, 0, 80, 74, 5, 0, 80, 74, 5, 0, 3, 0, 0, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 78, 5, 0, 80, 78, 5, 0, + 80, 78, 5, 0, 80, 78, 5, 0, 80, 78, 5, 0, 80, 78, 5, 0, 80, 78, 5, 0, 73, 14, 3, 0, 73, 14, 3, 0, 73, 14, 3, 0, 73, 14, 3, 0, 73, 14, 3, 0, 73, 14, 3, 0, 73, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 14, 3, 0, 97, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, + 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 16, 102, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 80, 103, 5, 0, 80, 103, 5, 0, 80, 103, 5, 0, 80, 103, 5, 0, 82, 231, 2, 0, 82, 231, 2, 0, + 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 94, 103, 2, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, + 138, 21, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 144, 85, 5, 0, 144, 85, 5, 0, 144, 85, 5, 0, 144, 85, 5, 0, 144, 85, 5, 0, 144, 85, 5, 0, 144, 85, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 208, 64, 5, 0, 208, 64, 5, 0, 208, 64, 5, 0, 208, 64, 5, 0, 208, 64, 5, 0, 208, 64, 5, 0, 208, 64, 5, 0, 201, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, + 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 0, 0, 0, 219, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 97, 128, 2, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 94, 128, 2, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 97, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, + 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 160, 1, 3, 0, 160, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, + 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 161, 141, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, + 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 0, 0, 0, 66, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, + 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, + 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, + 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 76, 0, 3, 0, 97, 128, 2, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 76, 0, 3, 0, 97, 0, 3, 0, 97, 128, 2, 0, 72, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 128, 8, 0, 97, 0, 3, 0, 76, 0, 3, 0, 97, 64, 2, 0, 97, 0, 3, 0, 96, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, + 76, 0, 3, 0, 97, 0, 3, 0, 140, 11, 3, 0, 97, 0, 3, 0, 76, 0, 3, 0, 97, 0, 3, 0, 12, 18, 3, 0, 12, 146, 8, 0, 76, 0, 3, 0, 76, 0, 3, 0, 97, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 12, 18, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 72, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 8, 18, 3, 0, 97, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 128, 8, 0, 84, 128, 8, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 128, 8, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 128, 8, 0, 84, 0, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, + 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, + 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, + 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, + 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 138, 7, 3, 0, 144, 71, 5, 0, 143, 71, 5, 0, 143, 71, 5, 0, 143, 71, 5, 0, 155, 7, 3, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, + 144, 71, 5, 0, 144, 71, 5, 0, 155, 7, 3, 0, 137, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, + 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 137, 7, 3, 0, 137, 7, 3, 0, 144, 71, 5, 0, 144, 71, 5, 0, 95, 0, 3, 0, 95, 0, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 9, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 73, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, + 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 91, 128, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, + 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 92, 0, 0, 0, 91, 128, 3, 0, 88, 64, 0, 0, 95, 128, 3, 0, + 86, 128, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, + 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, + 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, + 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, + 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, + 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, + 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, + 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, + 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, + 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, + 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 91, 0, 3, 0, 9, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 7, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 137, 11, 3, 0, 137, 11, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 137, 11, 3, 0, 137, 11, 3, 0, + 137, 11, 3, 0, 137, 11, 3, 0, 137, 11, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 137, 7, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, + 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, + 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 95, 0, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, + 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 95, 128, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, + 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 92, 0, 0, 0, 96, 128, 3, 0, 88, 64, 0, 0, 96, 128, 3, 0, 92, 0, 0, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, + 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, + 74, 31, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, + 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, + 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, + 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, + 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 73, 30, 3, 0, 80, 94, 5, 0, + 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 137, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, + 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 202, 7, 3, 0, 202, 7, 3, 0, 208, 71, 5, 0, 208, 71, 5, 0, 91, 64, 4, 0, 91, 64, 4, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, + 210, 199, 2, 0, 210, 199, 2, 0, 219, 7, 3, 0, 201, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 201, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 201, 25, 3, 0, + 201, 25, 3, 0, 201, 25, 3, 0, 201, 25, 3, 0, 201, 25, 3, 0, 201, 25, 3, 0, 219, 89, 4, 0, 219, 89, 4, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 137, 11, 3, 0, 137, 11, 3, 0, 137, 11, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 137, 11, 3, 0, 90, 192, 0, 0, 89, 192, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 128, 1, 0, 73, 0, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 87, 192, 4, 0, 87, 192, 4, 0, 91, 64, 4, 0, + 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, 101, 64, 4, 0, 91, 64, 0, 0, 91, 64, 0, 0, 91, 128, 3, 0, 97, 128, 3, 0, 137, 76, 1, 0, 74, 128, 3, 0, 147, 140, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 97, 128, 3, 0, 97, 128, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 87, 64, 1, 0, 92, 0, 0, 0, 88, 64, 0, 0, 88, 64, 0, 0, 97, 128, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 78, 76, 5, 0, + 78, 76, 5, 0, 87, 128, 3, 0, 73, 128, 3, 0, 73, 128, 3, 0, 73, 128, 3, 0, 73, 128, 3, 0, 73, 64, 5, 0, 97, 128, 3, 0, 97, 128, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 137, 76, 1, 0, 74, 64, 1, 0, 91, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 15, 9, 0, + 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 91, 64, 1, 0, 73, 0, 9, 0, 201, 79, 1, 0, 201, 79, 1, 0, 202, 143, 3, 0, 74, 168, 3, 0, + 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 73, 104, 1, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, + 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, + 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 73, 19, 3, 0, 73, 19, 3, 0, 73, 19, 3, 0, 73, 19, 3, 0, 73, 19, 3, 0, 73, 19, 3, 0, 91, 83, 4, 0, 91, 83, 4, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, + 137, 38, 3, 0, 155, 102, 4, 0, 155, 166, 1, 0, 155, 102, 4, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, + 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, + 73, 0, 3, 0, 73, 0, 3, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 201, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, + 225, 23, 10, 0, 225, 23, 10, 0, 225, 23, 10, 0, 202, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 88, 64, 0, 0, 91, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 64, 0, 0, 91, 64, 1, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, + 73, 0, 9, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, + 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 73, 64, 1, 0, 73, 64, 1, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 206, 71, 5, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, + 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 208, 71, 5, 0, 206, 71, 5, 0, 208, 71, 5, 0, 202, 7, 3, 0, 206, 71, 5, 0, + 206, 71, 5, 0, 206, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 206, 71, 5, 0, 206, 71, 5, 0, 206, 71, 5, 0, 206, 71, 5, 0, 208, 71, 5, 0, 206, 71, 5, 0, 206, 71, 5, 0, 202, 7, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, + 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, + 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 80, 86, 5, 0, 80, 86, 5, 0, 74, 22, 3, 0, 78, 86, 5, 0, 78, 86, 5, 0, 74, 37, 3, 0, 97, 165, 4, 0, 97, 165, 4, 0, 97, 165, 4, 0, 91, 165, 4, 0, 91, 37, 3, 0, 91, 165, 4, 0, 91, 165, 4, 0, 91, 37, 1, 0, 91, 165, 4, 0, + 91, 165, 4, 0, 91, 101, 4, 0, 91, 37, 1, 0, 91, 165, 1, 0, 91, 165, 1, 0, 91, 165, 1, 0, 91, 165, 1, 0, 91, 165, 1, 0, 91, 37, 1, 0, 97, 37, 3, 0, 91, 165, 1, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 80, 101, 5, 0, 80, 101, 5, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, + 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, + 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, + 208, 23, 10, 0, 208, 23, 10, 0, 202, 23, 10, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 219, 87, 4, 0, 219, 87, 4, 0, 219, 23, 3, 0, 219, 23, 3, 0, 219, 23, 3, 0, 219, 23, 3, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, + 206, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 202, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 202, 23, 10, 0, + 202, 23, 10, 0, 202, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, + 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 202, 23, 10, 0, 206, 23, 10, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 225, 23, 10, 0, 225, 23, 10, 0, 74, 76, 6, 0, + 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, + 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, + 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, + 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 151, 69, 4, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, + 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 161, 5, 3, 0, 155, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, + 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, + 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, + 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 78, 16, 10, 0, + 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 78, 16, 10, 0, 78, 16, 10, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 208, 86, 5, 0, 208, 86, 5, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, + 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, + 10, 35, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, + 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 142, 66, 5, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, + 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 144, 66, 5, 0, 142, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 142, 66, 5, 0, 144, 66, 5, 0, 142, 66, 5, 0, + 142, 66, 5, 0, 142, 66, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 142, 97, 5, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, + 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 142, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 142, 97, 5, 0, 142, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 142, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 138, 33, 3, 0, 138, 33, 3, 0, + 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, + 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, + 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, + 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, + 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, + 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 87, 64, 1, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 15, 9, 0, + 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, + 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, + 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, + 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, + 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, + 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, + 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, + 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, + 202, 33, 3, 0, 202, 33, 3, 0, 208, 97, 5, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 208, 97, 5, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 208, 97, 5, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, + 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, + 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 206, 94, 5, 0, 206, 94, 5, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, + 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, + 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, + 208, 71, 5, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 219, 7, 3, 0, 219, 7, 3, 0, 219, 7, 3, 0, 202, 7, 3, 0, 219, 135, 4, 0, 202, 7, 3, 0, 202, 7, 3, 0, 208, 71, 5, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, + 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 144, 79, 5, 0, + 144, 79, 5, 0, 144, 79, 5, 0, 144, 79, 5, 0, 144, 79, 5, 0, 144, 79, 5, 0, 144, 79, 5, 0, 144, 79, 5, 0, 91, 64, 4, 0, 155, 79, 4, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, + 80, 79, 5, 0, 80, 79, 5, 0, 80, 79, 5, 0, 78, 79, 5, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, + 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 80, 79, 5, 0, 78, 79, 5, 0, 78, 79, 5, 0, 80, 79, 5, 0, 80, 79, 5, 0, 80, 79, 5, 0, 80, 79, 5, 0, 78, 79, 5, 0, 78, 79, 5, 0, 80, 79, 5, 0, 80, 79, 5, 0, 78, 79, 5, 0, 78, 79, 5, 0, 10, 6, 3, 0, 10, 6, 3, 0, + 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, + 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, + 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 208, 35, 10, 0, 202, 35, 10, 0, 208, 35, 10, 0, 208, 35, 10, 0, 208, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 208, 35, 10, 0, 208, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, + 202, 35, 10, 0, 208, 35, 10, 0, 208, 35, 10, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, + 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 204, 5, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, + 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 204, 5, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, + 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 88, 64, 0, 0, 92, 0, 0, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, + 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, + 202, 5, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, + 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, + 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, + 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, + 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, + 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, + 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, + 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, + 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 97, 27, 3, 0, 97, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, + 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, + 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, + 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 148, 30, 3, 0, 148, 30, 3, 0, 155, 30, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, + 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 84, 24, 3, 0, 84, 24, 3, 0, 84, 24, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, + 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 225, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, + 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, + 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, + 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, + 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 10, 40, 3, 0, + 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, + 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, + 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 78, 68, 5, 0, 80, 68, 5, 0, 78, 68, 5, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, + 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, + 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 81, 5, 0, 80, 81, 5, 0, 78, 81, 5, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, + 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 78, 81, 5, 0, 78, 81, 5, 0, 78, 81, 5, 0, 80, 81, 5, 0, 80, 81, 5, 0, 80, 81, 5, 0, 80, 81, 5, 0, 78, 81, 5, 0, 78, 81, 5, 0, 80, 81, 5, 0, 80, 81, 5, 0, 91, 17, 3, 0, 91, 17, 3, 0, 66, 17, 3, 0, 91, 81, 4, 0, + 91, 81, 4, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, + 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 144, 95, 5, 0, 144, 95, 5, 0, 142, 95, 5, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, + 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 142, 95, 5, 0, 142, 95, 5, 0, 142, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, + 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 142, 95, 5, 0, 142, 95, 5, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 155, 95, 4, 0, 155, 95, 4, 0, 155, 31, 3, 0, 155, 95, 4, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 155, 31, 3, 0, 142, 95, 5, 0, 144, 95, 5, 0, 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, + 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, 138, 31, 3, 0, 155, 159, 4, 0, 138, 31, 3, 0, 155, 95, 4, 0, 155, 95, 4, 0, 155, 95, 4, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, + 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 16, 96, 5, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, + 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, + 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 206, 88, 5, 0, 206, 88, 5, 0, 206, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, + 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 142, 101, 5, 0, 142, 101, 5, 0, 142, 101, 5, 0, 144, 101, 5, 0, + 144, 101, 5, 0, 144, 101, 5, 0, 144, 101, 5, 0, 144, 101, 5, 0, 144, 101, 5, 0, 142, 101, 5, 0, 144, 101, 5, 0, 142, 101, 5, 0, 142, 101, 5, 0, 142, 101, 5, 0, 142, 101, 5, 0, 144, 101, 5, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, + 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, + 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, + 138, 22, 3, 0, 142, 86, 5, 0, 142, 86, 5, 0, 142, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 142, 86, 5, 0, 142, 86, 5, 0, 144, 86, 5, 0, 142, 86, 5, 0, 144, 86, 5, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, + 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 74, 8, 3, 0, + 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, + 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 138, 40, 3, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, + 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 142, 104, 5, 0, 138, 40, 3, 0, 144, 104, 5, 0, + 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 155, 168, 4, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, + 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, + 80, 97, 5, 0, 78, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 91, 97, 4, 0, 91, 97, 4, 0, 91, 97, 4, 0, 74, 33, 3, 0, 91, 161, 4, 0, 91, 161, 4, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, + 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, + 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 10, 7, 3, 0, + 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, + 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, + 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 0, 0, 10, 9, 0, 0, 10, 9, 0, 0, 10, 73, 0, 0, 10, 73, 0, 0, 10, 73, 0, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 73, 0, 0, 10, 9, 3, 0, + 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 0, 0, 10, 73, 0, 0, 10, 9, 0, 0, 10, 73, 0, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, + 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 0, 0, 10, 73, 0, 0, 10, 73, 0, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, + 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 0, 0, + 202, 77, 0, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, + 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 10, 14, 3, 0, + 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, + 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 16, 78, 5, 0, 16, 78, 5, 0, 16, 78, 5, 0, 16, 78, 5, 0, 16, 78, 5, 0, 16, 78, 5, 0, 16, 78, 5, 0, 27, 78, 4, 0, 27, 78, 4, 0, 27, 78, 4, 0, 27, 14, 3, 0, 27, 14, 3, 0, 33, 14, 3, 0, 33, 14, 3, 0, 33, 14, 3, 0, 33, 14, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, + 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, + 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, + 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, + 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 143, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, + 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, + 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, + 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, + 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, + 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, + 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, + 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, + 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 66, 0, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, + 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, + 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 97, 101, 4, 0, 80, 101, 5, 0, 97, 37, 3, 0, 80, 101, 5, 0, 97, 37, 3, 0, 80, 101, 5, 0, 92, 37, 0, 0, 88, 101, 0, 0, 92, 37, 0, 0, + 88, 101, 0, 0, 78, 101, 5, 0, 78, 101, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, + 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 71, 5, 0, + 144, 71, 5, 0, 91, 128, 3, 0, 87, 128, 3, 0, 87, 128, 3, 0, 86, 128, 3, 0, 86, 128, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 78, 64, 5, 0, 78, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 78, 64, 5, 0, 78, 64, 5, 0, 78, 64, 5, 0, 78, 64, 5, 0, 78, 64, 5, 0, 78, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 97, 0, 3, 0, 97, 0, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, + 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, + 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 16, 95, 5, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, + 33, 31, 3, 0, 33, 31, 3, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, + 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, + 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, + 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, + 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, + 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 148, 11, 3, 0, 148, 11, 3, 0, 148, 11, 3, 0, 148, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, + 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 84, 128, 8, 0, + 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, + 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, + 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 0, 3, 0, 97, 192, 0, 0, 97, 0, 3, 0, 97, 128, 1, 0, 97, 128, 1, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, + 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, + 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 97, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, + 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, + 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, + 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 94, 163, 2, 0, 94, 163, 2, 0, 94, 163, 2, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 0, 1, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 66, 0, 5, 0, 130, 64, 5, 0, 130, 192, 7, 0, 66, 64, 5, 0, + 66, 64, 5, 0, 87, 64, 4, 0, 87, 0, 1, 0, 87, 64, 4, 0, 87, 64, 4, 0, 87, 192, 4, 0, 87, 128, 8, 0, 91, 128, 8, 0, 91, 0, 3, 0, 90, 192, 0, 0, 89, 192, 0, 0, 92, 0, 0, 0, 90, 192, 0, 0, 90, 192, 0, 0, 89, 192, 0, 0, 92, 0, 0, 0, 90, 192, 0, 0, 91, 128, 8, 0, 91, 128, 8, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 192, 3, 0, 91, 192, 3, 0, 91, 192, 3, 0, 91, 64, 4, 0, + 99, 192, 8, 0, 100, 192, 8, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 101, 0, 1, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 0, 3, 0, 90, 192, 0, 0, 89, 192, 0, 0, 91, 128, 8, 0, 91, 64, 1, 0, 91, 64, 1, 0, 91, 0, 3, 0, 86, 0, 3, 0, 86, 0, 3, 0, + 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 96, 0, 2, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 64, 1, 0, 91, 64, 1, 0, 91, 64, 1, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 96, 0, 3, 0, 91, 0, 3, 0, 86, 0, 3, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, + 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, 101, 64, 4, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, + 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, + 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, + 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, + 5, 64, 10, 0, 5, 64, 10, 0, 91, 192, 0, 0, 91, 192, 0, 0, 90, 192, 0, 0, 89, 192, 0, 0, 90, 192, 0, 0, 89, 192, 0, 0, 91, 192, 0, 0, 91, 192, 0, 0, 91, 192, 0, 0, 90, 192, 0, 0, 89, 192, 0, 0, 91, 192, 0, 0, 90, 192, 0, 0, 89, 192, 0, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, + 87, 64, 4, 0, 91, 0, 0, 0, 91, 64, 4, 0, 87, 0, 3, 0, 91, 0, 3, 0, 90, 192, 0, 0, 89, 192, 0, 0, 91, 0, 3, 0, 91, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 128, 8, 0, 97, 0, 3, 0, 96, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 128, 8, 0, + 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 64, 2, 0, 96, 64, 2, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, + 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, + 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 192, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 96, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 96, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 96, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, + 94, 64, 2, 0, 94, 128, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 128, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 128, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 128, 2, 0, + 94, 64, 2, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 95, 128, 7, 0, 95, 128, 7, 0, 95, 128, 7, 0, 95, 128, 7, 0, 95, 128, 7, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, + 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 192, 0, 0, 97, 192, 0, 0, 97, 192, 0, 0, 97, 192, 0, 0, 97, 192, 0, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, + 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, + 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, + 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, + 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, + 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 97, 128, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, + 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, + 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, + 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, + 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, + 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, + 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, + 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 192, 0, 0, 97, 192, 0, 0, 97, 192, 0, 0, 97, 64, 1, 0, 97, 64, 1, 0, 97, 64, 1, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, + 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrie.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrie.cs index 08b019ed33..cf03ed7cd3 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrie.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrie.cs @@ -15,92 +15,119 @@ // Ported from: https://github.com/foliojs/unicode-trie // Copied from: https://github.com/toptensoftware/RichTextKit +using System; using System.IO; -using System.IO.Compression; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Text; namespace Avalonia.Media.TextFormatting.Unicode { internal class UnicodeTrie { - private readonly int[] _data; + private readonly uint[] _data; private readonly int _highStart; private readonly uint _errorValue; + /// + /// Initializes a new instance of the class. + /// + /// The uncompressed trie data. + public UnicodeTrie(ReadOnlySpan rawData) + { + var header = UnicodeTrieHeader.Parse(rawData); + int length = header.DataLength; + uint[] data = new uint[length / sizeof(uint)]; + + MemoryMarshal.Cast(rawData.Slice(rawData.Length - length)) + .CopyTo(data); + + _highStart = header.HighStart; + _errorValue = header.ErrorValue; + _data = data; + } + + /// + /// Initializes a new instance of the class. + /// + /// The stream containing the data. public UnicodeTrie(Stream stream) { - int dataLength; - using (var bw = new BinaryReader(stream, Encoding.UTF8, true)) + // Read the header info + using (var br = new BinaryReader(stream, Encoding.UTF8, true)) { - _highStart = bw.ReadInt32BE(); - _errorValue = bw.ReadUInt32BE(); - dataLength = bw.ReadInt32BE() / 4; + _highStart = br.ReadInt32(); + _errorValue = br.ReadUInt32(); + _data = new uint[br.ReadInt32() / sizeof(uint)]; } - using (var infl1 = new DeflateStream(stream, CompressionMode.Decompress, true)) - using (var infl2 = new DeflateStream(infl1, CompressionMode.Decompress, true)) - using (var bw = new BinaryReader(infl2, Encoding.UTF8, true)) + // Read the data in compressed format. + using (var br = new BinaryReader(stream, Encoding.UTF8, true)) { - _data = new int[dataLength]; for (int i = 0; i < _data.Length; i++) { - _data[i] = bw.ReadInt32(); + _data[i] = br.ReadUInt32(); } } } - public UnicodeTrie(byte[] buf) : this(new MemoryStream(buf)) - { - } - - internal UnicodeTrie(int[] data, int highStart, uint errorValue) + /// + /// Initializes a new instance of the class. + /// + /// The uncompressed trie data. + /// The start of the last range which ends at U+10ffff. + /// The value for out-of-range code points and illegal UTF-8. + public UnicodeTrie(uint[] data, int highStart, uint errorValue) { _data = data; _highStart = highStart; _errorValue = errorValue; } + /// + /// Saves the to the stream in a compressed format. + /// + /// The output stream. internal void Save(Stream stream) { // Write the header info using (var bw = new BinaryWriter(stream, Encoding.UTF8, true)) { - bw.WriteBE(_highStart); - bw.WriteBE(_errorValue); - bw.WriteBE(_data.Length * 4); + bw.Write(_highStart); + bw.Write(_errorValue); + bw.Write(_data.Length * sizeof(uint)); } - // Double compress the data - using (var def1 = new DeflateStream(stream, CompressionLevel.Optimal, true)) - using (var def2 = new DeflateStream(def1, CompressionLevel.Optimal, true)) - using (var bw = new BinaryWriter(def2, Encoding.UTF8, true)) + // Write the data. + using (var bw = new BinaryWriter(stream, Encoding.UTF8, true)) { - foreach (var v in _data) + for (int i = 0; i < _data.Length; i++) { - bw.Write(v); + bw.Write(_data[i]); } - bw.Flush(); - def2.Flush(); - def1.Flush(); } } - public uint Get(int codePoint) + /// + /// Get the value for a code point as stored in the trie. + /// + /// The code point. + /// The value. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public uint Get(uint codePoint) { - int index; - if ((codePoint < 0) || (codePoint > 0x10ffff)) - { - return _errorValue; - } + uint index; + ref uint dataBase = ref MemoryMarshal.GetReference(_data.AsSpan()); - if ((codePoint < 0xd800) || ((codePoint > 0xdbff) && (codePoint <= 0xffff))) + if (codePoint is < 0x0d800 or (> 0x0dbff and <= 0x0ffff)) { // Ordinary BMP code point, excluding leading surrogates. - // BMP uses a single level lookup. BMP index starts at offset 0 in the index. - // data is stored in the index array itself. - index = (_data[codePoint >> UnicodeTrieBuilder.SHIFT_2] << UnicodeTrieBuilder.INDEX_SHIFT) + (codePoint & UnicodeTrieBuilder.DATA_MASK); - return (uint)_data[index]; + // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index. + // 16 bit data is stored in the index array itself. + index = _data[codePoint >> UnicodeTrieBuilder.SHIFT_2]; + index = (index << UnicodeTrieBuilder.INDEX_SHIFT) + (codePoint & UnicodeTrieBuilder.DATA_MASK); + return Unsafe.Add(ref dataBase, (nint)index); } if (codePoint <= 0xffff) @@ -109,20 +136,57 @@ namespace Avalonia.Media.TextFormatting.Unicode // lead surrogate code units and code points. // The main index has the code unit data. // For this function, we need the code point data. - index = (_data[UnicodeTrieBuilder.LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UnicodeTrieBuilder.SHIFT_2)] << UnicodeTrieBuilder.INDEX_SHIFT) + (codePoint & UnicodeTrieBuilder.DATA_MASK); - return (uint)_data[index]; + // Note: this expression could be refactored for slightly improved efficiency, but + // surrogate code points will be so rare in practice that it's not worth it. + index = _data[UnicodeTrieBuilder.LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UnicodeTrieBuilder.SHIFT_2)]; + index = (index << UnicodeTrieBuilder.INDEX_SHIFT) + (codePoint & UnicodeTrieBuilder.DATA_MASK); + return Unsafe.Add(ref dataBase, (nint)index); } if (codePoint < _highStart) { // Supplemental code point, use two-level lookup. - index = _data[(UnicodeTrieBuilder.INDEX_1_OFFSET - UnicodeTrieBuilder.OMITTED_BMP_INDEX_1_LENGTH) + (codePoint >> UnicodeTrieBuilder.SHIFT_1)]; - index = _data[index + ((codePoint >> UnicodeTrieBuilder.SHIFT_2) & UnicodeTrieBuilder.INDEX_2_MASK)]; + index = UnicodeTrieBuilder.INDEX_1_OFFSET - UnicodeTrieBuilder.OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UnicodeTrieBuilder.SHIFT_1); + index = _data[index]; + index += (codePoint >> UnicodeTrieBuilder.SHIFT_2) & UnicodeTrieBuilder.INDEX_2_MASK; + index = _data[index]; index = (index << UnicodeTrieBuilder.INDEX_SHIFT) + (codePoint & UnicodeTrieBuilder.DATA_MASK); - return (uint)_data[index]; + return Unsafe.Add(ref dataBase, (nint)index); + } + + if (codePoint <= 0x10ffff) + { + return Unsafe.Add(ref dataBase, (nint)(_data.Length - UnicodeTrieBuilder.DATA_GRANULARITY)); + } + + // Fall through. The code point is outside of the legal range of 0..0x10ffff. + return _errorValue; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + private struct UnicodeTrieHeader + { + public int HighStart + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get; + } + + public uint ErrorValue + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get; + } + + public int DataLength + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get; } - return (uint)_data[_data.Length - UnicodeTrieBuilder.DATA_GRANULARITY]; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static UnicodeTrieHeader Parse(ReadOnlySpan data) + => MemoryMarshal.Cast(data)[0]; } } } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrieBuilder.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrieBuilder.cs index a60bac4ce4..87f96984c5 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrieBuilder.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrieBuilder.cs @@ -368,24 +368,24 @@ namespace Avalonia.Media.TextFormatting.Unicode // calculate the sizes of, and allocate, the index and data arrays var indexLength = allIndexesLength + _dataLength; - var data = new int[indexLength]; + var data = new uint[indexLength]; // write the index-2 array values shifted right by INDEX_SHIFT, after adding dataMove var destIdx = 0; for (i = 0; i < INDEX_2_BMP_LENGTH; i++) { - data[destIdx++] = ((_index2[i] + dataMove) >> INDEX_SHIFT); + data[destIdx++] = (uint)((_index2[i] + dataMove) >> INDEX_SHIFT); } // write UTF-8 2-byte index-2 values, not right-shifted for (i = 0; i < 0xc2 - 0xc0; i++) { // C0..C1 - data[destIdx++] = (dataMove + BAD_UTF8_DATA_OFFSET); + data[destIdx++] = (uint)(dataMove + BAD_UTF8_DATA_OFFSET); } for (; i < 0xe0 - 0xc0; i++) { // C2..DF - data[destIdx++] = (dataMove + _index2[i << (6 - SHIFT_2)]); + data[destIdx++] = (uint)(dataMove + _index2[i << (6 - SHIFT_2)]); } if (_highStart > 0x10000) @@ -396,21 +396,21 @@ namespace Avalonia.Media.TextFormatting.Unicode // write 16-bit index-1 values for supplementary code points for (i = 0; i < index1Length; i++) { - data[destIdx++] = (INDEX_2_OFFSET + _index1[i + OMITTED_BMP_INDEX_1_LENGTH]); + data[destIdx++] = (uint)(INDEX_2_OFFSET + _index1[i + OMITTED_BMP_INDEX_1_LENGTH]); } // write the index-2 array values for supplementary code points, // shifted right by INDEX_SHIFT, after adding dataMove for (i = 0; i < _index2Length - index2Offset; i++) { - data[destIdx++] = ((dataMove + _index2[index2Offset + i]) >> INDEX_SHIFT); + data[destIdx++] = (uint)((dataMove + _index2[index2Offset + i]) >> INDEX_SHIFT); } } // write 16-bit data values for (i = 0; i < _dataLength; i++) { - data[destIdx++] = (int)_data[i]; + data[destIdx++] = _data[i]; } return new UnicodeTrie(data, _highStart, _errorValue); diff --git a/src/Avalonia.Base/Point.cs b/src/Avalonia.Base/Point.cs index fbdf0db800..0c789ff20f 100644 --- a/src/Avalonia.Base/Point.cs +++ b/src/Avalonia.Base/Point.cs @@ -188,7 +188,7 @@ namespace Avalonia } /// - /// Returns a boolean indicating whether the point is equal to the other given point. + /// Returns a boolean indicating whether the point is equal to the other given point (bitwise). /// /// The other point to test equality against. /// True if this point is equal to other; False otherwise. @@ -200,6 +200,18 @@ namespace Avalonia // ReSharper enable CompareOfFloatsByEqualityOperator } + /// + /// Returns a boolean indicating whether the point is equal to the other given point + /// (numerically). + /// + /// The other point to test equality against. + /// True if this point is equal to other; False otherwise. + public bool NearlyEquals(Point other) + { + return MathUtilities.AreClose(_x, other._x) && + MathUtilities.AreClose(_y, other._y); + } + /// /// Checks for equality between a point and an object. /// diff --git a/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs b/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs index 5dc426ab06..e4d5a1ca68 100644 --- a/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs +++ b/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs @@ -158,6 +158,7 @@ namespace Avalonia.Rendering.SceneGraph if (result != null && result.Parent != parent) { Deindex(scene, result); + ((VisualNode?)result.Parent)?.RemoveChild(result); result = null; } diff --git a/src/Avalonia.Base/Utilities/ArrayBuilder.cs b/src/Avalonia.Base/Utilities/ArrayBuilder.cs index 7048659431..60bf2c7586 100644 --- a/src/Avalonia.Base/Utilities/ArrayBuilder.cs +++ b/src/Avalonia.Base/Utilities/ArrayBuilder.cs @@ -101,7 +101,7 @@ namespace Avalonia.Utilities /// /// The array slice. /// The . - public ArraySlice Add(in ReadOnlySlice value) + public ArraySlice Add(in ArraySlice value) { var position = _size; diff --git a/src/Avalonia.Base/Utilities/ArraySlice.cs b/src/Avalonia.Base/Utilities/ArraySlice.cs index f5a9d3a98d..482f807fe0 100644 --- a/src/Avalonia.Base/Utilities/ArraySlice.cs +++ b/src/Avalonia.Base/Utilities/ArraySlice.cs @@ -116,7 +116,7 @@ namespace Avalonia.Utilities /// public static implicit operator ReadOnlySlice(ArraySlice slice) { - return new ReadOnlySlice(slice._data).AsSlice(slice.Start, slice.Length); + return new ReadOnlySlice(slice._data, 0, slice.Length, slice.Start); } /// diff --git a/src/Avalonia.Base/Utilities/BidiDictionary.cs b/src/Avalonia.Base/Utilities/BidiDictionary.cs new file mode 100644 index 0000000000..654fbc9807 --- /dev/null +++ b/src/Avalonia.Base/Utilities/BidiDictionary.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; + +namespace Avalonia.Utilities +{ + /// + /// A simple bi-directional dictionary. + /// + /// Key type + /// Value type + internal sealed class BidiDictionary where T1 : notnull where T2 : notnull + { + public Dictionary Forward { get; } = new Dictionary(); + + public Dictionary Reverse { get; } = new Dictionary(); + + public void Clear() + { + Forward.Clear(); + Reverse.Clear(); + } + + public void Add(T1 key, T2 value) + { + Forward.Add(key, value); + Reverse.Add(value, key); + } + +#pragma warning disable CS8601 + public bool TryGetValue(T1 key, out T2 value) => Forward.TryGetValue(key, out value); +#pragma warning restore CS8601 + +#pragma warning disable CS8601 + public bool TryGetKey(T2 value, out T1 key) => Reverse.TryGetValue(value, out key); +#pragma warning restore CS8601 + + public bool ContainsKey(T1 key) => Forward.ContainsKey(key); + + public bool ContainsValue(T2 value) => Reverse.ContainsKey(value); + } +} diff --git a/src/Avalonia.Base/Visual.cs b/src/Avalonia.Base/Visual.cs index 4fd21f02f9..bdf8723b81 100644 --- a/src/Avalonia.Base/Visual.cs +++ b/src/Avalonia.Base/Visual.cs @@ -376,7 +376,9 @@ namespace Avalonia if (e.OldValue is IAffectsRender oldValue) { if (sender._affectsRenderWeakSubscriber != null) + { InvalidatedWeakEvent.Unsubscribe(oldValue, sender._affectsRenderWeakSubscriber); + } } if (e.NewValue is IAffectsRender newValue) diff --git a/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs b/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs index fa437de186..b39ceab1b6 100644 --- a/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs +++ b/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs @@ -49,9 +49,9 @@ namespace Avalonia.Build.Tasks string projectDirectory, string output, bool verifyIl, MessageImportance logImportance, string strongNameKey, bool patchCom, bool skipXamlCompilation, bool debuggerLaunch) { - var typeSystem = new CecilTypeSystem(references - .Where(r => !r.ToLowerInvariant().EndsWith("avalonia.build.tasks.dll")) - .Concat(new[] { input }), input); + var typeSystem = new CecilTypeSystem( + references.Where(r => !r.ToLowerInvariant().EndsWith("avalonia.build.tasks.dll")), + input); var asm = typeSystem.TargetAssemblyDefinition; diff --git a/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs b/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs index 245592207e..7e6b70a146 100644 --- a/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs +++ b/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs @@ -128,8 +128,8 @@ namespace Avalonia.Controls.Primitives if (_inputTarget != null) { - _inputTarget.PointerEnter += InputTarget_PointerEnter; - _inputTarget.PointerLeave += InputTarget_PointerLeave; + _inputTarget.PointerEntered += InputTarget_PointerEntered; + _inputTarget.PointerExited += InputTarget_PointerExited; _inputTarget.PointerPressed += InputTarget_PointerPressed; _inputTarget.PointerMoved += InputTarget_PointerMoved; _inputTarget.PointerReleased += InputTarget_PointerReleased; @@ -194,8 +194,8 @@ namespace Avalonia.Controls.Primitives if (_inputTarget != null) { - _inputTarget.PointerEnter -= InputTarget_PointerEnter; - _inputTarget.PointerLeave -= InputTarget_PointerLeave; + _inputTarget.PointerEntered -= InputTarget_PointerEntered; + _inputTarget.PointerExited -= InputTarget_PointerExited; _inputTarget.PointerPressed -= InputTarget_PointerPressed; _inputTarget.PointerMoved -= InputTarget_PointerMoved; _inputTarget.PointerReleased -= InputTarget_PointerReleased; @@ -362,7 +362,7 @@ namespace Avalonia.Controls.Primitives } /// - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { // We only want to bother with the color name tool tip if we can provide color names. if (_selectionEllipsePanel != null && @@ -373,7 +373,7 @@ namespace Avalonia.Controls.Primitives UpdatePseudoClasses(); - base.OnPointerLeave(e); + base.OnPointerExited(e); } /// @@ -848,16 +848,16 @@ namespace Avalonia.Controls.Primitives UpdatePseudoClasses(); } - /// - private void InputTarget_PointerEnter(object? sender, PointerEventArgs args) + /// + private void InputTarget_PointerEntered(object? sender, PointerEventArgs args) { _isPointerOver = true; UpdatePseudoClasses(); args.Handled = true; } - /// - private void InputTarget_PointerLeave(object? sender, PointerEventArgs args) + /// + private void InputTarget_PointerExited(object? sender, PointerEventArgs args) { _isPointerOver = false; UpdatePseudoClasses(); diff --git a/src/Avalonia.Controls.DataGrid/DataGridCell.cs b/src/Avalonia.Controls.DataGrid/DataGridCell.cs index 67183781d3..f9685b3682 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridCell.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridCell.cs @@ -139,18 +139,18 @@ namespace Avalonia.Controls } } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { - base.OnPointerEnter(e); + base.OnPointerEntered(e); if (OwningRow != null) { IsMouseOver = true; } } - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { - base.OnPointerLeave(e); + base.OnPointerExited(e); if (OwningRow != null) { @@ -178,9 +178,9 @@ namespace Avalonia.Controls { var handled = OwningGrid.UpdateStateOnMouseLeftButtonDown(e, ColumnIndex, OwningRow.Slot, !e.Handled); - // Do not handle PointerPressed with touch, + // Do not handle PointerPressed with touch or pen, // so we can start scroll gesture on the same event. - if (e.Pointer.Type != PointerType.Touch) + if (e.Pointer.Type != PointerType.Touch && e.Pointer.Type != PointerType.Pen) { e.Handled = handled; } diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumn.cs b/src/Avalonia.Controls.DataGrid/DataGridColumn.cs index f3ea48ff80..c415f477d4 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridColumn.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridColumn.cs @@ -855,7 +855,7 @@ namespace Avalonia.Controls if (OwningGrid != null && OwningGrid.UseLayoutRounding) { var scale = LayoutHelper.GetLayoutScale(HeaderCell); - var roundSize = LayoutHelper.RoundLayoutSize(new Size(leftEdge + ActualWidth, 1), scale, scale); + var roundSize = LayoutHelper.RoundLayoutSizeUp(new Size(leftEdge + ActualWidth, 1), scale, scale); LayoutRoundedWidth = roundSize.Width - leftEdge; } else diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs b/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs index 915b36687c..d3bd968d62 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs @@ -83,9 +83,9 @@ namespace Avalonia.Controls { PointerPressed += DataGridColumnHeader_PointerPressed; PointerReleased += DataGridColumnHeader_PointerReleased; - PointerMoved += DataGridColumnHeader_PointerMove; - PointerEnter += DataGridColumnHeader_PointerEnter; - PointerLeave += DataGridColumnHeader_PointerLeave; + PointerMoved += DataGridColumnHeader_PointerMoved; + PointerEntered += DataGridColumnHeader_PointerEntered; + PointerExited += DataGridColumnHeader_PointerExited; } private void OnAreSeparatorsVisibleChanged(AvaloniaPropertyChangedEventArgs e) @@ -452,7 +452,7 @@ namespace Avalonia.Controls SetDragCursor(mousePosition); } - private void DataGridColumnHeader_PointerEnter(object sender, PointerEventArgs e) + private void DataGridColumnHeader_PointerEntered(object sender, PointerEventArgs e) { if (!IsEnabled) { @@ -464,7 +464,7 @@ namespace Avalonia.Controls UpdatePseudoClasses(); } - private void DataGridColumnHeader_PointerLeave(object sender, PointerEventArgs e) + private void DataGridColumnHeader_PointerExited(object sender, PointerEventArgs e) { if (!IsEnabled) { @@ -506,7 +506,7 @@ namespace Avalonia.Controls UpdatePseudoClasses(); } - private void DataGridColumnHeader_PointerMove(object sender, PointerEventArgs e) + private void DataGridColumnHeader_PointerMoved(object sender, PointerEventArgs e) { if (OwningGrid == null || !IsEnabled) { diff --git a/src/Avalonia.Controls.DataGrid/DataGridRow.cs b/src/Avalonia.Controls.DataGrid/DataGridRow.cs index b062a14e39..1559763a1b 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridRow.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridRow.cs @@ -607,15 +607,15 @@ namespace Avalonia.Controls } } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { - base.OnPointerEnter(e); + base.OnPointerEntered(e); IsMouseOver = true; } - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { IsMouseOver = false; - base.OnPointerLeave(e); + base.OnPointerExited(e); } internal void ApplyCellsState() diff --git a/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs b/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs index a3dfa44fc9..9f37e8a6aa 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs @@ -375,7 +375,7 @@ namespace Avalonia.Controls ApplyHeaderStatus(); } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { if (IsEnabled) { @@ -383,10 +383,10 @@ namespace Avalonia.Controls UpdatePseudoClasses(); } - base.OnPointerEnter(e); + base.OnPointerEntered(e); } - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { if (IsEnabled) { @@ -394,7 +394,7 @@ namespace Avalonia.Controls UpdatePseudoClasses(); } - base.OnPointerLeave(e); + base.OnPointerExited(e); } private void SetIsCheckedNoCallBack(bool value) diff --git a/src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs b/src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs index 03299bbf35..fe3ba0abf6 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs @@ -158,23 +158,23 @@ namespace Avalonia.Controls.Primitives } } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { if (OwningRow != null) { OwningRow.IsMouseOver = true; } - base.OnPointerEnter(e); + base.OnPointerEntered(e); } - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { if (OwningRow != null) { OwningRow.IsMouseOver = false; } - base.OnPointerLeave(e); + base.OnPointerExited(e); } //TODO TabStop diff --git a/src/Avalonia.Controls/Calendar/CalendarItem.cs b/src/Avalonia.Controls/Calendar/CalendarItem.cs index bcac6324ba..4c958c83b7 100644 --- a/src/Avalonia.Controls/Calendar/CalendarItem.cs +++ b/src/Avalonia.Controls/Calendar/CalendarItem.cs @@ -189,7 +189,7 @@ namespace Avalonia.Controls.Primitives EventHandler cellMouseLeftButtonDown = Cell_MouseLeftButtonDown; EventHandler cellMouseLeftButtonUp = Cell_MouseLeftButtonUp; - EventHandler cellMouseEnter = Cell_MouseEnter; + EventHandler cellMouseEntered = Cell_MouseEntered; EventHandler cellClick = Cell_Click; for (int i = 1; i < Calendar.RowsPerMonth; i++) @@ -206,7 +206,7 @@ namespace Avalonia.Controls.Primitives cell.SetValue(Grid.ColumnProperty, j); cell.CalendarDayButtonMouseDown += cellMouseLeftButtonDown; cell.CalendarDayButtonMouseUp += cellMouseLeftButtonUp; - cell.PointerEnter += cellMouseEnter; + cell.PointerEntered += cellMouseEntered; cell.Click += cellClick; children.Add(cell); } @@ -222,7 +222,7 @@ namespace Avalonia.Controls.Primitives EventHandler monthCalendarButtonMouseDown = Month_CalendarButtonMouseDown; EventHandler monthCalendarButtonMouseUp = Month_CalendarButtonMouseUp; - EventHandler monthMouseEnter = Month_MouseEnter; + EventHandler monthMouseEntered = Month_MouseEntered; for (int i = 0; i < Calendar.RowsPerYear; i++) { @@ -238,7 +238,7 @@ namespace Avalonia.Controls.Primitives month.SetValue(Grid.ColumnProperty, j); month.CalendarLeftMouseButtonDown += monthCalendarButtonMouseDown; month.CalendarLeftMouseButtonUp += monthCalendarButtonMouseUp; - month.PointerEnter += monthMouseEnter; + month.PointerEntered += monthMouseEntered; children.Add(month); } } @@ -876,7 +876,7 @@ namespace Avalonia.Controls.Primitives } } - internal void Cell_MouseEnter(object? sender, PointerEventArgs e) + internal void Cell_MouseEntered(object? sender, PointerEventArgs e) { if (Owner != null) { @@ -1162,7 +1162,7 @@ namespace Avalonia.Controls.Primitives } } - private void Month_MouseEnter(object? sender, PointerEventArgs e) + private void Month_MouseEntered(object? sender, PointerEventArgs e) { if (_isMouseLeftButtonDownYearView) { diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs index 16d4ef5c15..083182a370 100644 --- a/src/Avalonia.Controls/Control.cs +++ b/src/Avalonia.Controls/Control.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.ComponentModel; using Avalonia.Automation.Peers; using Avalonia.Controls.Documents; @@ -10,6 +11,7 @@ using Avalonia.Interactivity; using Avalonia.Media; using Avalonia.Rendering; using Avalonia.Styling; +using Avalonia.Threading; using Avalonia.VisualTree; namespace Avalonia.Controls @@ -53,21 +55,57 @@ namespace Avalonia.Controls /// Event raised when an element wishes to be scrolled into view. /// public static readonly RoutedEvent RequestBringIntoViewEvent = - RoutedEvent.Register("RequestBringIntoView", RoutingStrategies.Bubble); + RoutedEvent.Register( + "RequestBringIntoView", + RoutingStrategies.Bubble); /// /// Provides event data for the event. /// public static readonly RoutedEvent ContextRequestedEvent = - RoutedEvent.Register(nameof(ContextRequested), + RoutedEvent.Register( + nameof(ContextRequested), RoutingStrategies.Tunnel | RoutingStrategies.Bubble); + /// + /// Defines the event. + /// + public static readonly RoutedEvent LoadedEvent = + RoutedEvent.Register( + nameof(Loaded), + RoutingStrategies.Direct); + + /// + /// Defines the event. + /// + public static readonly RoutedEvent UnloadedEvent = + RoutedEvent.Register( + nameof(Unloaded), + RoutingStrategies.Direct); + /// /// Defines the property. /// public static readonly AttachedProperty FlowDirectionProperty = - AvaloniaProperty.RegisterAttached(nameof(FlowDirection), inherits: true); - + AvaloniaProperty.RegisterAttached( + nameof(FlowDirection), + inherits: true); + + // Note the following: + // _loadedQueue : + // Is the queue where any control will be added to indicate that its loaded + // event should be scheduled and called later. + // _loadedProcessingQueue : + // Contains a copied snapshot of the _loadedQueue at the time when processing + // starts and individual events are being fired. This was needed to avoid + // exceptions if new controls were added in the Loaded event itself. + + private static bool _isLoadedProcessing = false; + private static readonly HashSet _loadedQueue = new HashSet(); + private static readonly HashSet _loadedProcessingQueue = new HashSet(); + + private bool _isAttachedToVisualTree = false; + private bool _isLoaded = false; private DataTemplates? _dataTemplates; private IControl? _focusAdorner; private AutomationPeer? _automationPeer; @@ -108,6 +146,15 @@ namespace Avalonia.Controls set => SetValue(ContextFlyoutProperty, value); } + /// + /// Gets a value indicating whether the control is fully constructed in the visual tree + /// and both layout and render are complete. + /// + /// + /// This is set to true while raising the event. + /// + public bool IsLoaded => _isLoaded; + /// /// Gets or sets a user-defined object attached to the control. /// @@ -135,6 +182,35 @@ namespace Avalonia.Controls remove => RemoveHandler(ContextRequestedEvent, value); } + /// + /// Occurs when the control has been fully constructed in the visual tree and both + /// layout and render are complete. + /// + /// + /// This event is guaranteed to occur after the control template is applied and references + /// to objects created after the template is applied are available. This makes it different + /// from OnAttachedToVisualTree which doesn't have these references. This event occurs at the + /// latest possible time in the control creation life-cycle. + /// + public event EventHandler? Loaded + { + add => AddHandler(LoadedEvent, value); + remove => RemoveHandler(LoadedEvent, value); + } + + /// + /// Occurs when the control is removed from the visual tree. + /// + /// + /// This is API symmetrical with and exists for compatibility with other + /// XAML frameworks; however, it behaves the same as OnDetachedFromVisualTree. + /// + public event EventHandler? Unloaded + { + add => AddHandler(UnloadedEvent, value); + remove => RemoveHandler(UnloadedEvent, value); + } + public new IControl? Parent => (IControl?)base.Parent; /// @@ -215,18 +291,124 @@ namespace Avalonia.Controls /// The control that receives the focus adorner. protected virtual IControl? GetTemplateFocusTarget() => this; + private static Action loadedProcessingAction = () => + { + // Copy the loaded queue for processing + // There was a possibility of the "Collection was modified; enumeration operation may not execute." + // exception when only a single hash set was used. This could happen when new controls are added + // within the Loaded callback/event itself. To fix this, two hash sets are used and while one is + // being processed the other accepts adding new controls to process next. + _loadedProcessingQueue.Clear(); + foreach (Control control in _loadedQueue) + { + _loadedProcessingQueue.Add(control); + } + _loadedQueue.Clear(); + + foreach (Control control in _loadedProcessingQueue) + { + control.OnLoadedCore(); + } + + _loadedProcessingQueue.Clear(); + _isLoadedProcessing = false; + + // Restart if any controls were added to the queue while processing + if (_loadedQueue.Count > 0) + { + _isLoadedProcessing = true; + Dispatcher.UIThread.Post(loadedProcessingAction!, DispatcherPriority.Loaded); + } + }; + + /// + /// Schedules to be called for this control. + /// For performance, it will be queued with other controls. + /// + internal void ScheduleOnLoadedCore() + { + if (_isLoaded == false) + { + bool isAdded = _loadedQueue.Add(this); + + if (isAdded && + _isLoadedProcessing == false) + { + _isLoadedProcessing = true; + Dispatcher.UIThread.Post(loadedProcessingAction!, DispatcherPriority.Loaded); + } + } + } + + /// + /// Invoked as the first step of marking the control as loaded and raising the + /// event. + /// + internal void OnLoadedCore() + { + if (_isLoaded == false && + _isAttachedToVisualTree) + { + _isLoaded = true; + OnLoaded(); + } + } + + /// + /// Invoked as the first step of marking the control as unloaded and raising the + /// event. + /// + internal void OnUnloadedCore() + { + if (_isLoaded) + { + // Remove from the loaded event queue here as a failsafe in case the control + // is detached before the dispatcher runs the Loaded jobs. + _loadedQueue.Remove(this); + + _isLoaded = false; + OnUnloaded(); + } + } + + /// + /// Invoked just before the event. + /// + protected virtual void OnLoaded() + { + var eventArgs = new RoutedEventArgs(LoadedEvent); + eventArgs.Source = null; + RaiseEvent(eventArgs); + } + + /// + /// Invoked just before the event. + /// + protected virtual void OnUnloaded() + { + var eventArgs = new RoutedEventArgs(UnloadedEvent); + eventArgs.Source = null; + RaiseEvent(eventArgs); + } + /// protected sealed override void OnAttachedToVisualTreeCore(VisualTreeAttachmentEventArgs e) { base.OnAttachedToVisualTreeCore(e); + _isAttachedToVisualTree = true; InitializeIfNeeded(); + + ScheduleOnLoadedCore(); } /// protected sealed override void OnDetachedFromVisualTreeCore(VisualTreeAttachmentEventArgs e) { base.OnDetachedFromVisualTreeCore(e); + _isAttachedToVisualTree = false; + + OnUnloadedCore(); } /// @@ -324,7 +506,9 @@ namespace Avalonia.Controls var keymap = AvaloniaLocator.Current.GetService()?.OpenContextMenu; if (keymap is null) + { return; + } var matches = false; diff --git a/src/Avalonia.Controls/Converters/MenuScrollingVisibilityConverter.cs b/src/Avalonia.Controls/Converters/MenuScrollingVisibilityConverter.cs index 6ab2f4c517..9d859a753a 100644 --- a/src/Avalonia.Controls/Converters/MenuScrollingVisibilityConverter.cs +++ b/src/Avalonia.Controls/Converters/MenuScrollingVisibilityConverter.cs @@ -26,7 +26,7 @@ namespace Avalonia.Controls.Converters if (visibility == ScrollBarVisibility.Auto) { - if (extent == viewport) + if (MathUtilities.AreClose(extent, viewport)) { return false; } diff --git a/src/Avalonia.Controls/DateTimePickers/TimePickerPresenter.cs b/src/Avalonia.Controls/DateTimePickers/TimePickerPresenter.cs index 7f2abb7e98..46c5eaeaaa 100644 --- a/src/Avalonia.Controls/DateTimePickers/TimePickerPresenter.cs +++ b/src/Avalonia.Controls/DateTimePickers/TimePickerPresenter.cs @@ -194,7 +194,7 @@ namespace Avalonia.Controls if (ClockIdentifier == "12HourClock") { - hr = per == 1 ? hr + 12 : per == 0 && hr == 12 ? 0 : hr; + hr = per == 1 ? (hr == 12) ? 12 : hr + 12 : per == 0 && hr == 12 ? 0 : hr; } Time = new TimeSpan(hr, min, 0); diff --git a/src/Avalonia.Controls/GridSplitter.cs b/src/Avalonia.Controls/GridSplitter.cs index 784d33ed58..85dad894fd 100644 --- a/src/Avalonia.Controls/GridSplitter.cs +++ b/src/Avalonia.Controls/GridSplitter.cs @@ -349,9 +349,9 @@ namespace Avalonia.Controls } } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { - base.OnPointerEnter(e); + base.OnPointerEntered(e); GridResizeDirection direction = GetEffectiveResizeDirection(); diff --git a/src/Avalonia.Controls/MenuItem.cs b/src/Avalonia.Controls/MenuItem.cs index 58229a1772..11c42f2ef3 100644 --- a/src/Avalonia.Controls/MenuItem.cs +++ b/src/Avalonia.Controls/MenuItem.cs @@ -79,25 +79,33 @@ namespace Avalonia.Controls /// Defines the event. /// public static readonly RoutedEvent ClickEvent = - RoutedEvent.Register(nameof(Click), RoutingStrategies.Bubble); + RoutedEvent.Register( + nameof(Click), + RoutingStrategies.Bubble); /// - /// Defines the event. + /// Defines the event. /// - public static readonly RoutedEvent PointerEnterItemEvent = - RoutedEvent.Register(nameof(PointerEnterItem), RoutingStrategies.Bubble); + public static readonly RoutedEvent PointerEnteredItemEvent = + RoutedEvent.Register( + nameof(PointerEnteredItem), + RoutingStrategies.Bubble); /// - /// Defines the event. + /// Defines the event. /// - public static readonly RoutedEvent PointerLeaveItemEvent = - RoutedEvent.Register(nameof(PointerLeaveItem), RoutingStrategies.Bubble); + public static readonly RoutedEvent PointerExitedItemEvent = + RoutedEvent.Register( + nameof(PointerExitedItem), + RoutingStrategies.Bubble); /// /// Defines the event. /// public static readonly RoutedEvent SubmenuOpenedEvent = - RoutedEvent.Register(nameof(SubmenuOpened), RoutingStrategies.Bubble); + RoutedEvent.Register( + nameof(SubmenuOpened), + RoutingStrategies.Bubble); /// /// The default value for the property. @@ -174,24 +182,24 @@ namespace Avalonia.Controls /// Occurs when the pointer enters a menu item. /// /// - /// A bubbling version of the event for menu items. + /// A bubbling version of the event for menu items. /// - public event EventHandler? PointerEnterItem + public event EventHandler? PointerEnteredItem { - add { AddHandler(PointerEnterItemEvent, value); } - remove { RemoveHandler(PointerEnterItemEvent, value); } + add { AddHandler(PointerEnteredItemEvent, value); } + remove { RemoveHandler(PointerEnteredItemEvent, value); } } /// /// Raised when the pointer leaves a menu item. /// /// - /// A bubbling version of the event for menu items. + /// A bubbling version of the event for menu items. /// - public event EventHandler? PointerLeaveItem + public event EventHandler? PointerExitedItem { - add { AddHandler(PointerLeaveItemEvent, value); } - remove { RemoveHandler(PointerLeaveItemEvent, value); } + add { AddHandler(PointerExitedItemEvent, value); } + remove { RemoveHandler(PointerExitedItemEvent, value); } } /// @@ -437,22 +445,22 @@ namespace Avalonia.Controls } /// - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { - base.OnPointerEnter(e); + base.OnPointerEntered(e); var point = e.GetCurrentPoint(null); - RaiseEvent(new PointerEventArgs(PointerEnterItemEvent, this, e.Pointer, this.VisualRoot, point.Position, + RaiseEvent(new PointerEventArgs(PointerEnteredItemEvent, this, e.Pointer, this.VisualRoot, point.Position, e.Timestamp, point.Properties, e.KeyModifiers)); } /// - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { - base.OnPointerLeave(e); + base.OnPointerExited(e); var point = e.GetCurrentPoint(null); - RaiseEvent(new PointerEventArgs(PointerLeaveItemEvent, this, e.Pointer, this.VisualRoot, point.Position, + RaiseEvent(new PointerEventArgs(PointerExitedItemEvent, this, e.Pointer, this.VisualRoot, point.Position, e.Timestamp, point.Properties, e.KeyModifiers)); } diff --git a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs index 3a6d06f150..868cce879a 100644 --- a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs +++ b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs @@ -53,9 +53,9 @@ namespace Avalonia.Controls.Platform Menu.PointerPressed += PointerPressed; Menu.PointerReleased += PointerReleased; Menu.AddHandler(AccessKeyHandler.AccessKeyPressedEvent, AccessKeyPressed); - Menu.AddHandler(Avalonia.Controls.Menu.MenuOpenedEvent, this.MenuOpened); - Menu.AddHandler(MenuItem.PointerEnterItemEvent, PointerEnter); - Menu.AddHandler(MenuItem.PointerLeaveItemEvent, PointerLeave); + Menu.AddHandler(Avalonia.Controls.Menu.MenuOpenedEvent, MenuOpened); + Menu.AddHandler(MenuItem.PointerEnteredItemEvent, PointerEntered); + Menu.AddHandler(MenuItem.PointerExitedItemEvent, PointerExited); Menu.AddHandler(InputElement.PointerMovedEvent, PointerMoved); _root = Menu.VisualRoot; @@ -89,9 +89,9 @@ namespace Avalonia.Controls.Platform Menu.PointerPressed -= PointerPressed; Menu.PointerReleased -= PointerReleased; Menu.RemoveHandler(AccessKeyHandler.AccessKeyPressedEvent, AccessKeyPressed); - Menu.RemoveHandler(Avalonia.Controls.Menu.MenuOpenedEvent, this.MenuOpened); - Menu.RemoveHandler(MenuItem.PointerEnterItemEvent, PointerEnter); - Menu.RemoveHandler(MenuItem.PointerLeaveItemEvent, PointerLeave); + Menu.RemoveHandler(Avalonia.Controls.Menu.MenuOpenedEvent, MenuOpened); + Menu.RemoveHandler(MenuItem.PointerEnteredItemEvent, PointerEntered); + Menu.RemoveHandler(MenuItem.PointerExitedItemEvent, PointerExited); Menu.RemoveHandler(InputElement.PointerMovedEvent, PointerMoved); if (_root is InputElement inputRoot) @@ -297,7 +297,7 @@ namespace Avalonia.Controls.Platform e.Handled = true; } - protected internal virtual void PointerEnter(object? sender, PointerEventArgs e) + protected internal virtual void PointerEntered(object? sender, PointerEventArgs e) { var item = GetMenuItem(e.Source as IControl); @@ -358,7 +358,7 @@ namespace Avalonia.Controls.Platform } } - protected internal virtual void PointerLeave(object? sender, PointerEventArgs e) + protected internal virtual void PointerExited(object? sender, PointerEventArgs e) { var item = GetMenuItem(e.Source as IControl); diff --git a/src/Avalonia.Controls/Presenters/ContentPresenter.cs b/src/Avalonia.Controls/Presenters/ContentPresenter.cs index 12a8dd747d..39888c1239 100644 --- a/src/Avalonia.Controls/Presenters/ContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ContentPresenter.cs @@ -635,8 +635,8 @@ namespace Avalonia.Controls.Presenters if (useLayoutRounding) { - sizeForChild = LayoutHelper.RoundLayoutSize(sizeForChild, scale, scale); - availableSize = LayoutHelper.RoundLayoutSize(availableSize, scale, scale); + sizeForChild = LayoutHelper.RoundLayoutSizeUp(sizeForChild, scale, scale); + availableSize = LayoutHelper.RoundLayoutSizeUp(availableSize, scale, scale); } switch (horizontalContentAlignment) diff --git a/src/Avalonia.Controls/Primitives/ScrollBar.cs b/src/Avalonia.Controls/Primitives/ScrollBar.cs index e5c3392faf..e524db5444 100644 --- a/src/Avalonia.Controls/Primitives/ScrollBar.cs +++ b/src/Avalonia.Controls/Primitives/ScrollBar.cs @@ -218,9 +218,9 @@ namespace Avalonia.Controls.Primitives } } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { - base.OnPointerEnter(e); + base.OnPointerEntered(e); if (AllowAutoHide) { @@ -228,9 +228,9 @@ namespace Avalonia.Controls.Primitives } } - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { - base.OnPointerLeave(e); + base.OnPointerExited(e); if (AllowAutoHide) { diff --git a/src/Avalonia.Controls/Selection/InternalSelectionModel.cs b/src/Avalonia.Controls/Selection/InternalSelectionModel.cs index d92ffb0d1a..d0715e402d 100644 --- a/src/Avalonia.Controls/Selection/InternalSelectionModel.cs +++ b/src/Avalonia.Controls/Selection/InternalSelectionModel.cs @@ -168,7 +168,7 @@ namespace Avalonia.Controls.Selection { if (_writableSelectedItems is INotifyCollectionChanged incc) { - incc.CollectionChanged += OnSelectedItemsCollectionChanged; + incc.CollectionChanged -= OnSelectedItemsCollectionChanged; } } diff --git a/src/Avalonia.Controls/TextBlock.cs b/src/Avalonia.Controls/TextBlock.cs index 1a69d1218c..db315d3aaf 100644 --- a/src/Avalonia.Controls/TextBlock.cs +++ b/src/Avalonia.Controls/TextBlock.cs @@ -113,7 +113,9 @@ namespace Avalonia.Controls /// Defines the property. /// public static readonly AttachedProperty TextAlignmentProperty = - AvaloniaProperty.RegisterAttached(nameof(TextAlignment), + AvaloniaProperty.RegisterAttached( + nameof(TextAlignment), + defaultValue: TextAlignment.Start, inherits: true); /// @@ -748,14 +750,14 @@ namespace Avalonia.Controls { if (textSourceIndex > _text.Length) { - return null; + return new TextEndOfParagraph(); } var runText = _text.Skip(textSourceIndex); if (runText.IsEmpty) { - return null; + return new TextEndOfParagraph(); } return new TextCharacters(runText, _defaultProperties); diff --git a/src/Avalonia.Controls/ToolTipService.cs b/src/Avalonia.Controls/ToolTipService.cs index a3100ff296..c6efe10488 100644 --- a/src/Avalonia.Controls/ToolTipService.cs +++ b/src/Avalonia.Controls/ToolTipService.cs @@ -26,14 +26,14 @@ namespace Avalonia.Controls if (e.OldValue != null) { - control.PointerEnter -= ControlPointerEnter; - control.PointerLeave -= ControlPointerLeave; + control.PointerEntered -= ControlPointerEntered; + control.PointerExited -= ControlPointerExited; } if (e.NewValue != null) { - control.PointerEnter += ControlPointerEnter; - control.PointerLeave += ControlPointerLeave; + control.PointerEntered += ControlPointerEntered; + control.PointerExited += ControlPointerExited; } if (ToolTip.GetIsOpen(control) && e.NewValue != e.OldValue && !(e.NewValue is ToolTip)) @@ -80,7 +80,7 @@ namespace Avalonia.Controls /// /// The event sender. /// The event args. - private void ControlPointerEnter(object? sender, PointerEventArgs e) + private void ControlPointerEntered(object? sender, PointerEventArgs e) { StopTimer(); @@ -101,7 +101,7 @@ namespace Avalonia.Controls /// /// The event sender. /// The event args. - private void ControlPointerLeave(object? sender, PointerEventArgs e) + private void ControlPointerExited(object? sender, PointerEventArgs e) { var control = (Control)sender!; Close(control); diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 57fb82485c..f2e8cdb1cf 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -484,7 +484,11 @@ namespace Avalonia.Controls /// Raises the event. /// /// The event args. - protected virtual void OnOpened(EventArgs e) => Opened?.Invoke(this, e); + protected virtual void OnOpened(EventArgs e) + { + FrameSize = PlatformImpl?.FrameSize; + Opened?.Invoke(this, e); + } /// /// Raises the event. diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index a4f4534b88..2dd391945b 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -871,10 +871,10 @@ namespace Avalonia.Controls var scaling = owner?.DesktopScaling ?? PlatformImpl?.DesktopScaling ?? 1; - // TODO: We really need non-client size here. - var rect = new PixelRect( - PixelPoint.Origin, - PixelSize.FromSize(ClientSize, scaling)); + // Use frame size, falling back to client size if the platform can't give it to us. + var rect = FrameSize.HasValue ? + new PixelRect(PixelSize.FromSize(FrameSize.Value, scaling)) : + new PixelRect(PixelSize.FromSize(ClientSize, scaling)); if (startupLocation == WindowStartupLocation.CenterScreen) { @@ -901,10 +901,10 @@ namespace Avalonia.Controls { if (owner != null) { - // TODO: We really need non-client size here. + var ownerSize = owner.FrameSize ?? owner.ClientSize; var ownerRect = new PixelRect( owner.Position, - PixelSize.FromSize(owner.ClientSize, scaling)); + PixelSize.FromSize(ownerSize, scaling)); Position = ownerRect.CenterRect(rect).Position; } } @@ -991,28 +991,28 @@ namespace Avalonia.Controls /// protected sealed override void HandleResized(Size clientSize, PlatformResizeReason reason) { - if (ClientSize == clientSize) - return; - - var sizeToContent = SizeToContent; - - // If auto-sizing is enabled, and the resize came from a user resize (or the reason was - // unspecified) then turn off auto-resizing for any window dimension that is not equal - // to the requested size. - if (sizeToContent != SizeToContent.Manual && - CanResize && - reason == PlatformResizeReason.Unspecified || - reason == PlatformResizeReason.User) + if (ClientSize != clientSize || double.IsNaN(Width) || double.IsNaN(Height)) { - if (clientSize.Width != ClientSize.Width) - sizeToContent &= ~SizeToContent.Width; - if (clientSize.Height != ClientSize.Height) - sizeToContent &= ~SizeToContent.Height; - SizeToContent = sizeToContent; - } + var sizeToContent = SizeToContent; + + // If auto-sizing is enabled, and the resize came from a user resize (or the reason was + // unspecified) then turn off auto-resizing for any window dimension that is not equal + // to the requested size. + if (sizeToContent != SizeToContent.Manual && + CanResize && + reason == PlatformResizeReason.Unspecified || + reason == PlatformResizeReason.User) + { + if (clientSize.Width != ClientSize.Width) + sizeToContent &= ~SizeToContent.Width; + if (clientSize.Height != ClientSize.Height) + sizeToContent &= ~SizeToContent.Height; + SizeToContent = sizeToContent; + } - Width = clientSize.Width; - Height = clientSize.Height; + Width = clientSize.Width; + Height = clientSize.Height; + } base.HandleResized(clientSize, reason); } diff --git a/src/Avalonia.Controls/WindowBase.cs b/src/Avalonia.Controls/WindowBase.cs index 12ba143c8a..cb68c1f6e1 100644 --- a/src/Avalonia.Controls/WindowBase.cs +++ b/src/Avalonia.Controls/WindowBase.cs @@ -169,7 +169,6 @@ namespace Avalonia.Controls } } - [Obsolete("No longer used. Has no effect.")] protected IDisposable BeginAutoSizing() => Disposable.Empty; @@ -186,6 +185,26 @@ namespace Avalonia.Controls } } + /// + protected override void OnClosed(EventArgs e) + { + // Window must manually raise Loaded/Unloaded events as it is a visual root and + // does not raise OnAttachedToVisualTreeCore/OnDetachedFromVisualTreeCore events + OnUnloadedCore(); + + base.OnClosed(e); + } + + /// + protected override void OnOpened(EventArgs e) + { + // Window must manually raise Loaded/Unloaded events as it is a visual root and + // does not raise OnAttachedToVisualTreeCore/OnDetachedFromVisualTreeCore events + ScheduleOnLoadedCore(); + + base.OnOpened(e); + } + protected override void HandleClosed() { _ignoreVisibilityChange = true; @@ -217,10 +236,14 @@ namespace Avalonia.Controls /// The reason for the resize. protected override void HandleResized(Size clientSize, PlatformResizeReason reason) { - ClientSize = clientSize; FrameSize = PlatformImpl?.FrameSize; - LayoutManager.ExecuteLayoutPass(); - Renderer?.Resized(clientSize); + + if (ClientSize != clientSize) + { + ClientSize = clientSize; + LayoutManager.ExecuteLayoutPass(); + Renderer?.Resized(clientSize); + } } /// diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlLayoutViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlLayoutViewModel.cs index 0c0c005122..a453fef212 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlLayoutViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlLayoutViewModel.cs @@ -30,20 +30,28 @@ namespace Avalonia.Diagnostics.ViewModels if (control is AvaloniaObject ao) { - MarginThickness = ao.GetValue(Layoutable.MarginProperty); - - if (HasPadding) + try { - PaddingThickness = ao.GetValue(Decorator.PaddingProperty); - } + _updatingFromControl = true; + MarginThickness = ao.GetValue(Layoutable.MarginProperty); + + if (HasPadding) + { + PaddingThickness = ao.GetValue(Decorator.PaddingProperty); + } - if (HasBorder) + if (HasBorder) + { + BorderThickness = ao.GetValue(Border.BorderThicknessProperty); + } + + HorizontalAlignment = ao.GetValue(Layoutable.HorizontalAlignmentProperty); + VerticalAlignment = ao.GetValue(Layoutable.VerticalAlignmentProperty); + } + finally { - BorderThickness = ao.GetValue(Border.BorderThicknessProperty); + _updatingFromControl = false; } - - HorizontalAlignment = ao.GetValue(Layoutable.HorizontalAlignmentProperty); - VerticalAlignment = ao.GetValue(Layoutable.VerticalAlignmentProperty); } UpdateSize(); diff --git a/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs b/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs index 58807b489e..587898ac6e 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml.cs @@ -121,8 +121,8 @@ namespace Avalonia.Diagnostics.Views if (header != null) { - header.PointerEnter += AddAdorner; - header.PointerLeave += RemoveAdorner; + header.PointerEntered += AddAdorner; + header.PointerExited += RemoveAdorner; } item.TemplateApplied -= TreeViewItemTemplateApplied; diff --git a/src/Avalonia.Themes.Fluent/Controls/FocusAdorner.xaml b/src/Avalonia.Themes.Fluent/Controls/FocusAdorner.xaml index e6577497da..91bf71ed4d 100644 --- a/src/Avalonia.Themes.Fluent/Controls/FocusAdorner.xaml +++ b/src/Avalonia.Themes.Fluent/Controls/FocusAdorner.xaml @@ -19,16 +19,4 @@ - - - diff --git a/src/Shared/RawEventGrouping.cs b/src/Shared/RawEventGrouping.cs index 084593ffc6..966744888c 100644 --- a/src/Shared/RawEventGrouping.cs +++ b/src/Shared/RawEventGrouping.cs @@ -2,10 +2,8 @@ using System; using System.Collections.Generic; using Avalonia.Collections.Pooled; -using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Threading; -using JetBrains.Annotations; namespace Avalonia; @@ -19,7 +17,7 @@ internal class RawEventGrouper : IDisposable private readonly Action _eventCallback; private readonly Queue _inputQueue = new(); private readonly Action _dispatchFromQueue; - readonly Dictionary _lastTouchPoints = new(); + readonly Dictionary _lastTouchPoints = new(); RawInputEventArgs? _lastEvent; public RawEventGrouper(Action eventCallback) @@ -49,7 +47,7 @@ internal class RawEventGrouper : IDisposable _lastEvent = null; if (ev is RawTouchEventArgs { Type: RawPointerEventType.TouchUpdate } touchUpdate) - _lastTouchPoints.Remove(touchUpdate.TouchPointId); + _lastTouchPoints.Remove(touchUpdate.RawPointerId); _eventCallback?.Invoke(ev); @@ -88,11 +86,11 @@ internal class RawEventGrouper : IDisposable { if (args is RawTouchEventArgs touchEvent) { - if (_lastTouchPoints.TryGetValue(touchEvent.TouchPointId, out var lastTouchEvent)) + if (_lastTouchPoints.TryGetValue(touchEvent.RawPointerId, out var lastTouchEvent)) MergeEvents(lastTouchEvent, touchEvent); else { - _lastTouchPoints[touchEvent.TouchPointId] = touchEvent; + _lastTouchPoints[touchEvent.RawPointerId] = touchEvent; AddToQueue(touchEvent); } } @@ -105,7 +103,7 @@ internal class RawEventGrouper : IDisposable { _lastTouchPoints.Clear(); if (args is RawTouchEventArgs { Type: RawPointerEventType.TouchUpdate } touchEvent) - _lastTouchPoints[touchEvent.TouchPointId] = touchEvent; + _lastTouchPoints[touchEvent.RawPointerId] = touchEvent; } AddToQueue(args); } diff --git a/src/Skia/Avalonia.Skia/TextShaperImpl.cs b/src/Skia/Avalonia.Skia/TextShaperImpl.cs index 777e907617..6b0b7bccbb 100644 --- a/src/Skia/Avalonia.Skia/TextShaperImpl.cs +++ b/src/Skia/Avalonia.Skia/TextShaperImpl.cs @@ -85,7 +85,7 @@ namespace Avalonia.Skia var second = glyphInfos[length - 1]; - if (!new Codepoint((int)second.Codepoint).IsBreakChar) + if (!new Codepoint(second.Codepoint).IsBreakChar) { return; } diff --git a/src/Windows/Avalonia.Direct2D1/Media/TextShaperImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/TextShaperImpl.cs index 6e32d32913..435c7cd89a 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/TextShaperImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/TextShaperImpl.cs @@ -85,7 +85,7 @@ namespace Avalonia.Direct2D1.Media var second = glyphInfos[length - 1]; - if (!new Codepoint((int)second.Codepoint).IsBreakChar) + if (!new Codepoint(second.Codepoint).IsBreakChar) { return; } diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index b1e4d8ca01..ea01d5cbdf 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -225,20 +225,17 @@ namespace Avalonia.Win32.Interop [Flags] public enum ModifierKeys { - MK_CONTROL = 0x0008, + MK_NONE = 0x0000, MK_LBUTTON = 0x0001, - - MK_MBUTTON = 0x0010, - MK_RBUTTON = 0x0002, - MK_SHIFT = 0x0004, - - MK_ALT = 0x0020, + MK_SHIFT = 0x0004, + MK_CONTROL = 0x0008, + MK_MBUTTON = 0x0010, + MK_ALT = 0x0020, MK_XBUTTON1 = 0x0020, - MK_XBUTTON2 = 0x0040 } @@ -514,6 +511,33 @@ namespace Avalonia.Win32.Interop CS_DROPSHADOW = 0x00020000 } + [Flags] + public enum PointerDeviceChangeFlags + { + PDC_ARRIVAL = 0x001, + PDC_REMOVAL = 0x002, + PDC_ORIENTATION_0 = 0x004, + PDC_ORIENTATION_90 = 0x008, + PDC_ORIENTATION_180 = 0x010, + PDC_ORIENTATION_270 = 0x020, + PDC_MODE_DEFAULT = 0x040, + PDC_MODE_CENTERED = 0x080, + PDC_MAPPING_CHANGE = 0x100, + PDC_RESOLUTION = 0x200, + PDC_ORIGIN = 0x400, + PDC_MODE_ASPECTRATIOPRESERVED = 0x800 + } + + public enum PointerInputType + { + PT_NONE = 0x00000000, + PT_POINTER = 0x00000001, + PT_TOUCH = 0x00000002, + PT_PEN = 0x00000003, + PT_MOUSE = 0x00000004, + PT_TOUCHPAD = 0x00000005 + } + public enum WindowsMessage : uint { WM_NULL = 0x0000, @@ -689,6 +713,25 @@ namespace Avalonia.Win32.Interop WM_EXITSIZEMOVE = 0x0232, WM_DROPFILES = 0x0233, WM_MDIREFRESHMENU = 0x0234, + + WM_POINTERDEVICECHANGE = 0x0238, + WM_POINTERDEVICEINRANGE = 0x239, + WM_POINTERDEVICEOUTOFRANGE = 0x23A, + WM_NCPOINTERUPDATE = 0x0241, + WM_NCPOINTERDOWN = 0x0242, + WM_NCPOINTERUP = 0x0243, + WM_POINTERUPDATE = 0x0245, + WM_POINTERDOWN = 0x0246, + WM_POINTERUP = 0x0247, + WM_POINTERENTER = 0x0249, + WM_POINTERLEAVE = 0x024A, + WM_POINTERACTIVATE = 0x024B, + WM_POINTERCAPTURECHANGED = 0x024C, + WM_TOUCHHITTESTING = 0x024D, + WM_POINTERWHEEL = 0x024E, + WM_POINTERHWHEEL = 0x024F, + DM_POINTERHITTEST = 0x0250, + WM_IME_SETCONTEXT = 0x0281, WM_IME_NOTIFY = 0x0282, WM_IME_CONTROL = 0x0283, @@ -844,6 +887,134 @@ namespace Avalonia.Win32.Interop SCF_ISSECURE = 0x00000001, } + [Flags] + public enum PointerFlags + { + POINTER_FLAG_NONE = 0x00000000, + POINTER_FLAG_NEW = 0x00000001, + POINTER_FLAG_INRANGE = 0x00000002, + POINTER_FLAG_INCONTACT = 0x00000004, + POINTER_FLAG_FIRSTBUTTON = 0x00000010, + POINTER_FLAG_SECONDBUTTON = 0x00000020, + POINTER_FLAG_THIRDBUTTON = 0x00000040, + POINTER_FLAG_FOURTHBUTTON = 0x00000080, + POINTER_FLAG_FIFTHBUTTON = 0x00000100, + POINTER_FLAG_PRIMARY = 0x00002000, + POINTER_FLAG_CONFIDENCE = 0x00000400, + POINTER_FLAG_CANCELED = 0x00000800, + POINTER_FLAG_DOWN = 0x00010000, + POINTER_FLAG_UPDATE = 0x00020000, + POINTER_FLAG_UP = 0x00040000, + POINTER_FLAG_WHEEL = 0x00080000, + POINTER_FLAG_HWHEEL = 0x00100000, + POINTER_FLAG_CAPTURECHANGED = 0x00200000, + POINTER_FLAG_HASTRANSFORM = 0x00400000 + } + + public enum PointerButtonChangeType : ulong + { + POINTER_CHANGE_NONE, + POINTER_CHANGE_FIRSTBUTTON_DOWN, + POINTER_CHANGE_FIRSTBUTTON_UP, + POINTER_CHANGE_SECONDBUTTON_DOWN, + POINTER_CHANGE_SECONDBUTTON_UP, + POINTER_CHANGE_THIRDBUTTON_DOWN, + POINTER_CHANGE_THIRDBUTTON_UP, + POINTER_CHANGE_FOURTHBUTTON_DOWN, + POINTER_CHANGE_FOURTHBUTTON_UP, + POINTER_CHANGE_FIFTHBUTTON_DOWN, + POINTER_CHANGE_FIFTHBUTTON_UP + } + + [Flags] + public enum PenFlags + { + PEN_FLAGS_NONE = 0x00000000, + PEN_FLAGS_BARREL = 0x00000001, + PEN_FLAGS_INVERTED = 0x00000002, + PEN_FLAGS_ERASER = 0x00000004, + } + + [Flags] + public enum PenMask + { + PEN_MASK_NONE = 0x00000000, + PEN_MASK_PRESSURE = 0x00000001, + PEN_MASK_ROTATION = 0x00000002, + PEN_MASK_TILT_X = 0x00000004, + PEN_MASK_TILT_Y = 0x00000008 + } + + [Flags] + public enum TouchFlags + { + TOUCH_FLAG_NONE = 0x00000000 + } + + [Flags] + public enum TouchMask + { + TOUCH_MASK_NONE = 0x00000000, + TOUCH_MASK_CONTACTAREA = 0x00000001, + TOUCH_MASK_ORIENTATION = 0x00000002, + TOUCH_MASK_PRESSURE = 0x00000004, + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct POINTER_TOUCH_INFO + { + public POINTER_INFO pointerInfo; + public TouchFlags touchFlags; + public TouchMask touchMask; + public int rcContactLeft; + public int rcContactTop; + public int rcContactRight; + public int rcContactBottom; + public int rcContactRawLeft; + public int rcContactRawTop; + public int rcContactRawRight; + public int rcContactRawBottom; + public uint orientation; + public uint pressure; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct POINTER_PEN_INFO + { + public POINTER_INFO pointerInfo; + public PenFlags penFlags; + public PenMask penMask; + public uint pressure; + public uint rotation; + public int tiltX; + public int tiltY; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct POINTER_INFO + { + public PointerInputType pointerType; + public uint pointerId; + public uint frameId; + public PointerFlags pointerFlags; + public IntPtr sourceDevice; + public IntPtr hwndTarget; + public int ptPixelLocationX; + public int ptPixelLocationY; + public int ptHimetricLocationX; + public int ptHimetricLocationY; + public int ptPixelLocationRawX; + public int ptPixelLocationRawY; + public int ptHimetricLocationRawX; + public int ptHimetricLocationRawY; + public uint dwTime; + public uint historyCount; + public int inputData; + public ModifierKeys dwKeyStates; + public ulong PerformanceCount; + public PointerButtonChangeType ButtonChangeType; + } + [StructLayout(LayoutKind.Sequential)] public struct RGBQUAD { @@ -911,6 +1082,36 @@ namespace Avalonia.Win32.Interop public const int SizeOf_BITMAPINFOHEADER = 40; + [DllImport("user32.dll", SetLastError = true)] + public static extern bool IsMouseInPointerEnabled(); + + [DllImport("user32.dll", SetLastError = true)] + public static extern int EnableMouseInPointer(bool enable); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetPointerCursorId(uint pointerId, out uint cursorId); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetPointerType(uint pointerId, out PointerInputType pointerType); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetPointerInfo(uint pointerId, out POINTER_INFO pointerInfo); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetPointerInfoHistory(uint pointerId, ref int entriesCount, [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_INFO[] pointerInfos); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetPointerPenInfo(uint pointerId, out POINTER_PEN_INFO penInfo); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetPointerPenInfoHistory(uint pointerId, ref int entriesCount, [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_PEN_INFO[] penInfos); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetPointerTouchInfo(uint pointerId, out POINTER_TOUCH_INFO touchInfo); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetPointerTouchInfoHistory(uint pointerId, ref int entriesCount, [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_TOUCH_INFO[] touchInfos); + [DllImport("user32.dll")] public static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, MonitorEnumDelegate lpfnEnum, IntPtr dwData); diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index dc5e5324c4..8f6993c040 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -68,6 +68,7 @@ namespace Avalonia /// /// Multitouch allows a surface (a touchpad or touchscreen) to recognize the presence of more than one point of contact with the surface at the same time. /// + [Obsolete("Multitouch is always enabled on supported Windows versions")] public bool? EnableMultitouch { get; set; } = true; /// diff --git a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs index cae8834550..4c7b9a0348 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs @@ -1,4 +1,6 @@ using System; +using System.Buffers; +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; @@ -26,8 +28,8 @@ namespace Avalonia.Win32 uint timestamp = unchecked((uint)GetMessageTime()); RawInputEventArgs e = null; var shouldTakeFocus = false; - - switch ((WindowsMessage)msg) + var message = (WindowsMessage)msg; + switch (message) { case WindowsMessage.WM_ACTIVATE: { @@ -82,7 +84,7 @@ namespace Avalonia.Win32 case WindowsMessage.WM_DESTROY: { UiaCoreProviderApi.UiaReturnRawElementProvider(_hwnd, IntPtr.Zero, IntPtr.Zero, null); - + // We need to release IMM context and state to avoid leaks. if (Imm32InputMethod.Current.HWND == _hwnd) { @@ -108,9 +110,9 @@ namespace Avalonia.Win32 var newDisplayRect = Marshal.PtrToStructure(lParam); _scaling = dpi / 96.0; ScalingChanged?.Invoke(_scaling); - + using (SetResizeReason(PlatformResizeReason.DpiChange)) - { + { SetWindowPos(hWnd, IntPtr.Zero, newDisplayRect.left, @@ -178,6 +180,10 @@ namespace Avalonia.Win32 case WindowsMessage.WM_MBUTTONDOWN: case WindowsMessage.WM_XBUTTONDOWN: { + if (IsMouseInPointerEnabled) + { + break; + } shouldTakeFocus = ShouldTakeFocusOnClick; if (ShouldIgnoreTouchEmulatedMessage()) { @@ -188,7 +194,7 @@ namespace Avalonia.Win32 _mouseDevice, timestamp, _owner, - (WindowsMessage)msg switch + message switch { WindowsMessage.WM_LBUTTONDOWN => RawPointerEventType.LeftButtonDown, WindowsMessage.WM_RBUTTONDOWN => RawPointerEventType.RightButtonDown, @@ -207,6 +213,10 @@ namespace Avalonia.Win32 case WindowsMessage.WM_MBUTTONUP: case WindowsMessage.WM_XBUTTONUP: { + if (IsMouseInPointerEnabled) + { + break; + } if (ShouldIgnoreTouchEmulatedMessage()) { break; @@ -216,7 +226,7 @@ namespace Avalonia.Win32 _mouseDevice, timestamp, _owner, - (WindowsMessage)msg switch + message switch { WindowsMessage.WM_LBUTTONUP => RawPointerEventType.LeftButtonUp, WindowsMessage.WM_RBUTTONUP => RawPointerEventType.RightButtonUp, @@ -231,11 +241,19 @@ namespace Avalonia.Win32 } // Mouse capture is lost case WindowsMessage.WM_CANCELMODE: - _mouseDevice.Capture(null); + if (!IsMouseInPointerEnabled) + { + _mouseDevice.Capture(null); + } + break; case WindowsMessage.WM_MOUSEMOVE: { + if (IsMouseInPointerEnabled) + { + break; + } if (ShouldIgnoreTouchEmulatedMessage()) { break; @@ -259,42 +277,58 @@ namespace Avalonia.Win32 timestamp, _owner, RawPointerEventType.Move, - DipFromLParam(lParam), GetMouseModifiers(wParam)); + DipFromLParam(lParam), + GetMouseModifiers(wParam)); break; } case WindowsMessage.WM_MOUSEWHEEL: { + if (IsMouseInPointerEnabled) + { + break; + } e = new RawMouseWheelEventArgs( _mouseDevice, timestamp, _owner, PointToClient(PointFromLParam(lParam)), - new Vector(0, (ToInt32(wParam) >> 16) / wheelDelta), GetMouseModifiers(wParam)); + new Vector(0, (ToInt32(wParam) >> 16) / wheelDelta), + GetMouseModifiers(wParam)); break; } case WindowsMessage.WM_MOUSEHWHEEL: { + if (IsMouseInPointerEnabled) + { + break; + } e = new RawMouseWheelEventArgs( _mouseDevice, timestamp, _owner, PointToClient(PointFromLParam(lParam)), - new Vector(-(ToInt32(wParam) >> 16) / wheelDelta, 0), GetMouseModifiers(wParam)); + new Vector(-(ToInt32(wParam) >> 16) / wheelDelta, 0), + GetMouseModifiers(wParam)); break; } case WindowsMessage.WM_MOUSELEAVE: { + if (IsMouseInPointerEnabled) + { + break; + } _trackingMouse = false; e = new RawPointerEventArgs( _mouseDevice, timestamp, _owner, RawPointerEventType.LeaveWindow, - new Point(-1, -1), WindowsKeyboardDevice.Instance.Modifiers); + new Point(-1, -1), + WindowsKeyboardDevice.Instance.Modifiers); break; } @@ -303,11 +337,15 @@ namespace Avalonia.Win32 case WindowsMessage.WM_NCMBUTTONDOWN: case WindowsMessage.WM_NCXBUTTONDOWN: { + if (IsMouseInPointerEnabled) + { + break; + } e = new RawPointerEventArgs( _mouseDevice, timestamp, _owner, - (WindowsMessage)msg switch + message switch { WindowsMessage.WM_NCLBUTTONDOWN => RawPointerEventType .NonClientLeftButtonDown, @@ -323,6 +361,10 @@ namespace Avalonia.Win32 } case WindowsMessage.WM_TOUCH: { + if (_wmPointerEnabled) + { + break; + } var touchInputCount = wParam.ToInt32(); var pTouchInputs = stackalloc TOUCHINPUT[touchInputCount]; @@ -348,6 +390,120 @@ namespace Avalonia.Win32 return IntPtr.Zero; } + break; + } + case WindowsMessage.WM_NCPOINTERDOWN: + case WindowsMessage.WM_NCPOINTERUP: + case WindowsMessage.WM_POINTERDOWN: + case WindowsMessage.WM_POINTERUP: + case WindowsMessage.WM_POINTERUPDATE: + { + if (!_wmPointerEnabled) + { + break; + } + GetDevicePointerInfo(wParam, out var device, out var info, out var point, out var modifiers, ref timestamp); + var eventType = GetEventType(message, info); + + var args = CreatePointerArgs(device, timestamp, eventType, point, modifiers, info.pointerId); + args.IntermediatePoints = CreateLazyIntermediatePoints(info); + e = args; + break; + } + case WindowsMessage.WM_POINTERDEVICEOUTOFRANGE: + case WindowsMessage.WM_POINTERLEAVE: + case WindowsMessage.WM_POINTERCAPTURECHANGED: + { + if (!_wmPointerEnabled) + { + break; + } + GetDevicePointerInfo(wParam, out var device, out var info, out var point, out var modifiers, ref timestamp); + var eventType = device is TouchDevice ? RawPointerEventType.TouchCancel : RawPointerEventType.LeaveWindow; + e = CreatePointerArgs(device, timestamp, eventType, point, modifiers, info.pointerId); + break; + } + case WindowsMessage.WM_POINTERWHEEL: + case WindowsMessage.WM_POINTERHWHEEL: + { + if (!_wmPointerEnabled) + { + break; + } + GetDevicePointerInfo(wParam, out var device, out var info, out var point, out var modifiers, ref timestamp); + + var val = (ToInt32(wParam) >> 16) / wheelDelta; + var delta = message == WindowsMessage.WM_POINTERWHEEL ? new Vector(0, val) : new Vector(val, 0); + e = new RawMouseWheelEventArgs(device, timestamp, _owner, point.Position, delta, modifiers) + { + RawPointerId = info.pointerId + }; + break; + } + case WindowsMessage.WM_POINTERDEVICEINRANGE: + { + if (!_wmPointerEnabled) + { + break; + } + + // Do not generate events, but release mouse capture on any other device input. + GetDevicePointerInfo(wParam, out var device, out var info, out var point, out var modifiers, ref timestamp); + if (device != _mouseDevice) + { + _mouseDevice.Capture(null); + return IntPtr.Zero; + } + break; + } + case WindowsMessage.WM_POINTERACTIVATE: + { + //occurs when a pointer activates an inactive window. + //we should handle this and return PA_ACTIVATE or PA_NOACTIVATE + //https://docs.microsoft.com/en-us/previous-versions/windows/desktop/inputmsg/wm-pointeractivate + break; + } + case WindowsMessage.WM_POINTERDEVICECHANGE: + { + //notifies about changes in the settings of a monitor that has a digitizer attached to it. + //https://docs.microsoft.com/en-us/previous-versions/windows/desktop/inputmsg/wm-pointerdevicechange + break; + } + case WindowsMessage.WM_NCPOINTERUPDATE: + { + //NC stands for non-client area - window header and window border + //As I found above in an old message handling - we dont need to handle NC pointer move/updates. + //All we need is pointer down and up. So this is skipped for now. + break; + } + case WindowsMessage.WM_POINTERENTER: + { + //this is not handled by WM_MOUSEENTER so I think there is no need to handle this too. + //but we can detect a new pointer by this message and calling IS_POINTER_NEW_WPARAM + + //note: by using a pen there can be a pointer leave or enter inside a window coords + //when you are just lift up the pen above the display + break; + } + case WindowsMessage.DM_POINTERHITTEST: + { + //DM stands for direct manipulation. + //https://docs.microsoft.com/en-us/previous-versions/windows/desktop/directmanipulation/direct-manipulation-portal + break; + } + case WindowsMessage.WM_TOUCHHITTESTING: + { + //This is to determine the most probable touch target. + //provides an input bounding box and receives hit proximity + //https://docs.microsoft.com/en-us/previous-versions/windows/desktop/inputmsg/wm-touchhittesting + //https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-touch_hit_testing_input + break; + } + case WindowsMessage.WM_PARENTNOTIFY: + { + //This message is sent in a dialog scenarios. Contains mouse position. + //Old message, but listed in the wm_pointer reference + //https://docs.microsoft.com/en-us/previous-versions/windows/desktop/inputmsg/wm-parentnotify break; } case WindowsMessage.WM_NCPAINT: @@ -446,7 +602,7 @@ namespace Avalonia.Win32 case WindowsMessage.WM_GETMINMAXINFO: { MINMAXINFO mmi = Marshal.PtrToStructure(lParam); - + _maxTrackSize = mmi.ptMaxTrackSize; if (_minSize.Width > 0) @@ -530,7 +686,7 @@ namespace Avalonia.Win32 if (_managedDrag.PreprocessInputEvent(ref e)) return UnmanagedMethods.DefWindowProc(hWnd, msg, wParam, lParam); #endif - + if(shouldTakeFocus) { SetFocus(_hwnd); @@ -540,7 +696,7 @@ namespace Avalonia.Win32 { Input(e); - if ((WindowsMessage)msg == WindowsMessage.WM_KEYDOWN) + if (message == WindowsMessage.WM_KEYDOWN) { // Handling a WM_KEYDOWN message should cause the subsequent WM_CHAR message to // be ignored. This should be safe to do as WM_CHAR should only be produced in @@ -549,6 +705,11 @@ namespace Avalonia.Win32 _ignoreWmChar = e.Handled; } + if (s_intermediatePointsPooledList.Count > 0) + { + s_intermediatePointsPooledList.Dispose(); + } + if (e.Handled) { return IntPtr.Zero; @@ -561,6 +722,196 @@ namespace Avalonia.Win32 } } + private unsafe Lazy> CreateLazyIntermediatePoints(POINTER_INFO info) + { + var historyCount = Math.Min((int)info.historyCount, MaxPointerHistorySize); + if (historyCount > 1) + { + return new Lazy>(() => + { + s_intermediatePointsPooledList.Clear(); + s_intermediatePointsPooledList.Capacity = historyCount; + + // Pointers in history are ordered from newest to oldest, so we need to reverse iteration. + // Also we skip the newest pointer, because original event arguments already contains it. + + if (info.pointerType == PointerInputType.PT_TOUCH) + { + if (GetPointerTouchInfoHistory(info.pointerId, ref historyCount, s_historyTouchInfos)) + { + for (int i = historyCount - 1; i >= 1; i--) + { + var historyTouchInfo = s_historyTouchInfos[i]; + s_intermediatePointsPooledList.Add(CreateRawPointerPoint(historyTouchInfo)); + } + } + } + else if (info.pointerType == PointerInputType.PT_PEN) + { + if (GetPointerPenInfoHistory(info.pointerId, ref historyCount, s_historyPenInfos)) + { + for (int i = historyCount - 1; i >= 1; i--) + { + var historyPenInfo = s_historyPenInfos[i]; + s_intermediatePointsPooledList.Add(CreateRawPointerPoint(historyPenInfo)); + } + } + } + else + { + // Currently Windows does not return history info for mouse input, but we handle it just for case. + if (GetPointerInfoHistory(info.pointerId, ref historyCount, s_historyInfos)) + { + for (int i = historyCount - 1; i >= 1; i--) + { + var historyInfo = s_historyInfos[i]; + s_intermediatePointsPooledList.Add(CreateRawPointerPoint(historyInfo)); + } + } + } + return s_intermediatePointsPooledList; + }); + } + + return null; + } + + private RawPointerEventArgs CreatePointerArgs(IInputDevice device, ulong timestamp, RawPointerEventType eventType, RawPointerPoint point, RawInputModifiers modifiers, uint rawPointerId) + { + return device is TouchDevice + ? new RawTouchEventArgs(device, timestamp, _owner, eventType, point, modifiers, rawPointerId) + : new RawPointerEventArgs(device, timestamp, _owner, eventType, point, modifiers) + { + RawPointerId = rawPointerId + }; + } + + private void GetDevicePointerInfo(IntPtr wParam, + out IPointerDevice device, out POINTER_INFO info, out RawPointerPoint point, + out RawInputModifiers modifiers, ref uint timestamp) + { + var pointerId = (uint)(ToInt32(wParam) & 0xFFFF); + GetPointerType(pointerId, out var type); + + modifiers = default; + + switch (type) + { + case PointerInputType.PT_PEN: + device = _penDevice; + GetPointerPenInfo(pointerId, out var penInfo); + info = penInfo.pointerInfo; + point = CreateRawPointerPoint(penInfo); + if (penInfo.penFlags.HasFlag(PenFlags.PEN_FLAGS_BARREL)) + { + modifiers |= RawInputModifiers.PenBarrelButton; + } + if (penInfo.penFlags.HasFlag(PenFlags.PEN_FLAGS_ERASER)) + { + modifiers |= RawInputModifiers.PenEraser; + } + if (penInfo.penFlags.HasFlag(PenFlags.PEN_FLAGS_INVERTED)) + { + modifiers |= RawInputModifiers.PenInverted; + } + break; + case PointerInputType.PT_TOUCH: + device = _touchDevice; + GetPointerTouchInfo(pointerId, out var touchInfo); + info = touchInfo.pointerInfo; + point = CreateRawPointerPoint(touchInfo); + break; + default: + device = _mouseDevice; + GetPointerInfo(pointerId, out info); + point = CreateRawPointerPoint(info); + break; + } + + if (info.dwTime != 0) + { + timestamp = info.dwTime; + } + + modifiers |= GetInputModifiers(info.pointerFlags); + } + + private RawPointerPoint CreateRawPointerPoint(POINTER_INFO pointerInfo) + { + var point = PointToClient(new PixelPoint(pointerInfo.ptPixelLocationX, pointerInfo.ptPixelLocationY)); + return new RawPointerPoint + { + Position = point + }; + } + private RawPointerPoint CreateRawPointerPoint(POINTER_TOUCH_INFO info) + { + var pointerInfo = info.pointerInfo; + var point = PointToClient(new PixelPoint(pointerInfo.ptPixelLocationX, pointerInfo.ptPixelLocationY)); + return new RawPointerPoint + { + Position = point, + // POINTER_PEN_INFO.pressure is normalized to a range between 0 and 1024, with 512 as a default. + // But in our API we use range from 0.0 to 1.0. + Pressure = info.pressure / 1024f + }; + } + private RawPointerPoint CreateRawPointerPoint(POINTER_PEN_INFO info) + { + var pointerInfo = info.pointerInfo; + var point = PointToClient(new PixelPoint(pointerInfo.ptPixelLocationX, pointerInfo.ptPixelLocationY)); + return new RawPointerPoint + { + Position = point, + // POINTER_PEN_INFO.pressure is normalized to a range between 0 and 1024, with 512 as a default. + // But in our API we use range from 0.0 to 1.0. + Pressure = info.pressure / 1024f, + Twist = info.rotation, + XTilt = info.tiltX, + YTilt = info.tiltY + }; + } + + private static RawPointerEventType GetEventType(WindowsMessage message, POINTER_INFO info) + { + var isTouch = info.pointerType == PointerInputType.PT_TOUCH; + if (info.pointerFlags.HasFlag(PointerFlags.POINTER_FLAG_CANCELED)) + { + return isTouch ? RawPointerEventType.TouchCancel : RawPointerEventType.LeaveWindow; + } + + var eventType = ToEventType(info.ButtonChangeType, isTouch); + if (eventType == RawPointerEventType.LeftButtonDown && + message == WindowsMessage.WM_NCPOINTERDOWN) + { + eventType = RawPointerEventType.NonClientLeftButtonDown; + } + + return eventType; + } + + private static RawPointerEventType ToEventType(PointerButtonChangeType type, bool isTouch) + { + return type switch + { + PointerButtonChangeType.POINTER_CHANGE_FIRSTBUTTON_DOWN when isTouch => RawPointerEventType.TouchBegin, + PointerButtonChangeType.POINTER_CHANGE_FIRSTBUTTON_DOWN when !isTouch => RawPointerEventType.LeftButtonDown, + PointerButtonChangeType.POINTER_CHANGE_SECONDBUTTON_DOWN => RawPointerEventType.RightButtonDown, + PointerButtonChangeType.POINTER_CHANGE_THIRDBUTTON_DOWN => RawPointerEventType.MiddleButtonDown, + PointerButtonChangeType.POINTER_CHANGE_FOURTHBUTTON_DOWN => RawPointerEventType.XButton1Down, + PointerButtonChangeType.POINTER_CHANGE_FIFTHBUTTON_DOWN => RawPointerEventType.XButton2Down, + + PointerButtonChangeType.POINTER_CHANGE_FIRSTBUTTON_UP when isTouch => RawPointerEventType.TouchEnd, + PointerButtonChangeType.POINTER_CHANGE_FIRSTBUTTON_UP when !isTouch => RawPointerEventType.LeftButtonUp, + PointerButtonChangeType.POINTER_CHANGE_SECONDBUTTON_UP => RawPointerEventType.RightButtonUp, + PointerButtonChangeType.POINTER_CHANGE_THIRDBUTTON_UP => RawPointerEventType.MiddleButtonUp, + PointerButtonChangeType.POINTER_CHANGE_FOURTHBUTTON_UP => RawPointerEventType.XButton1Up, + PointerButtonChangeType.POINTER_CHANGE_FIFTHBUTTON_UP => RawPointerEventType.XButton2Up, + _ when isTouch => RawPointerEventType.TouchUpdate, + _ => RawPointerEventType.Move + }; + } + private void UpdateInputMethod(IntPtr hkl) { // note: for non-ime language, also create it so that emoji panel tracks cursor @@ -568,11 +919,11 @@ namespace Avalonia.Win32 if (langid == _langid && Imm32InputMethod.Current.HWND == Hwnd) { return; - } + } _langid = langid; Imm32InputMethod.Current.SetLanguageAndWindow(this, Hwnd, hkl); - + } private static int ToInt32(IntPtr ptr) @@ -597,10 +948,7 @@ namespace Avalonia.Win32 private bool ShouldIgnoreTouchEmulatedMessage() { - if (!_multitouch) - { - return false; - } + // Note: GetMessageExtraInfo doesn't work with WM_POINTER events. // MI_WP_SIGNATURE // https://docs.microsoft.com/en-us/windows/win32/tablet/system-events-and-mouse-messages @@ -613,6 +961,11 @@ namespace Avalonia.Win32 private static RawInputModifiers GetMouseModifiers(IntPtr wParam) { var keys = (ModifierKeys)ToInt32(wParam); + return GetInputModifiers(keys); + } + + private static RawInputModifiers GetInputModifiers(ModifierKeys keys) + { var modifiers = WindowsKeyboardDevice.Instance.Modifiers; if (keys.HasAllFlags(ModifierKeys.MK_LBUTTON)) @@ -642,5 +995,37 @@ namespace Avalonia.Win32 return modifiers; } + + private static RawInputModifiers GetInputModifiers(PointerFlags flags) + { + var modifiers = WindowsKeyboardDevice.Instance.Modifiers; + + if (flags.HasAllFlags(PointerFlags.POINTER_FLAG_FIRSTBUTTON)) + { + modifiers |= RawInputModifiers.LeftMouseButton; + } + + if (flags.HasAllFlags(PointerFlags.POINTER_FLAG_SECONDBUTTON)) + { + modifiers |= RawInputModifiers.RightMouseButton; + } + + if (flags.HasAllFlags(PointerFlags.POINTER_FLAG_THIRDBUTTON)) + { + modifiers |= RawInputModifiers.MiddleMouseButton; + } + + if (flags.HasAllFlags(PointerFlags.POINTER_FLAG_FOURTHBUTTON)) + { + modifiers |= RawInputModifiers.XButton1MouseButton; + } + + if (flags.HasAllFlags(PointerFlags.POINTER_FLAG_FIFTHBUTTON)) + { + modifiers |= RawInputModifiers.XButton2MouseButton; + } + + return modifiers; + } } } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 8d836ef452..31f30a6e47 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Linq; using System.Runtime.InteropServices; using Avalonia.Controls; using Avalonia.Automation.Peers; @@ -21,6 +22,7 @@ using Avalonia.Win32.OpenGl; using Avalonia.Win32.WinRT; using Avalonia.Win32.WinRT.Composition; using static Avalonia.Win32.Interop.UnmanagedMethods; +using Avalonia.Collections.Pooled; using Avalonia.Metadata; namespace Avalonia.Win32 @@ -68,18 +70,19 @@ namespace Avalonia.Win32 private const WindowStyles WindowStateMask = (WindowStyles.WS_MAXIMIZE | WindowStyles.WS_MINIMIZE); private readonly TouchDevice _touchDevice; private readonly MouseDevice _mouseDevice; + private readonly PenDevice _penDevice; private readonly ManagedDeferredRendererLock _rendererLock; private readonly FramebufferManager _framebuffer; private readonly IGlPlatformSurface _gl; + private readonly bool _wmPointerEnabled; private Win32NativeControlHost _nativeControlHost; private WndProc _wndProcDelegate; private string _className; private IntPtr _hwnd; - private bool _multitouch; private IInputRoot _owner; private WindowProperties _windowProperties; - private bool _trackingMouse; + private bool _trackingMouse;//ToDo - there is something missed. Needs investigation @Steven Kirk private bool _topmost; private double _scaling = 1; private WindowState _showWindowState; @@ -96,10 +99,17 @@ namespace Avalonia.Win32 private uint _langid; private bool _ignoreWmChar; + private const int MaxPointerHistorySize = 512; + private static readonly PooledList s_intermediatePointsPooledList = new(); + private static readonly POINTER_TOUCH_INFO[] s_historyTouchInfos = new POINTER_TOUCH_INFO[MaxPointerHistorySize]; + private static readonly POINTER_PEN_INFO[] s_historyPenInfos = new POINTER_PEN_INFO[MaxPointerHistorySize]; + private static readonly POINTER_INFO[] s_historyInfos = new POINTER_INFO[MaxPointerHistorySize]; + public WindowImpl() { _touchDevice = new TouchDevice(); _mouseDevice = new WindowsMouseDevice(); + _penDevice = new PenDevice(); #if USE_MANAGED_DRAG _managedDrag = new ManagedWindowResizeDragHelper(this, capture => @@ -128,6 +138,8 @@ namespace Avalonia.Win32 egl.Display is AngleWin32EglDisplay angleDisplay && angleDisplay.PlatformApi == AngleOptions.PlatformApi.DirectX11; + _wmPointerEnabled = Win32Platform.WindowsVersion >= PlatformConstants.Windows8; + CreateWindow(); _framebuffer = new FramebufferManager(_hwnd); UpdateInputMethod(GetKeyboardLayout(0)); @@ -208,6 +220,8 @@ namespace Avalonia.Win32 } } + private double PrimaryScreenRenderScaling => Screen.AllScreens.FirstOrDefault(screen => screen.Primary)?.PixelDensity ?? 1; + public double RenderScaling => _scaling; public double DesktopScaling => RenderScaling; @@ -280,6 +294,8 @@ namespace Avalonia.Win32 protected IntPtr Hwnd => _hwnd; + private bool IsMouseInPointerEnabled => _wmPointerEnabled && IsMouseInPointerEnabled(); + public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) { TransparencyLevel = EnableBlur(transparencyLevel); @@ -469,10 +485,14 @@ namespace Avalonia.Win32 { GetWindowRect(_hwnd, out var rc); - return new PixelPoint(rc.left, rc.top); + var border = HiddenBorderSize; + return new PixelPoint(rc.left + border.Width, rc.top + border.Height); } set { + var border = HiddenBorderSize; + value = new PixelPoint(value.X - border.Width, value.Y - border.Height); + SetWindowPos( Handle.Handle, IntPtr.Zero, @@ -486,6 +506,24 @@ namespace Avalonia.Win32 private bool HasFullDecorations => _windowProperties.Decorations == SystemDecorations.Full; + private PixelSize HiddenBorderSize + { + get + { + // Windows 10 and 11 add a 7 pixel invisible border on the left/right/bottom of windows for resizing + if (Win32Platform.WindowsVersion.Major < 10 || !HasFullDecorations) + { + return PixelSize.Empty; + } + + DwmGetWindowAttribute(_hwnd, (int)DwmWindowAttribute.DWMWA_EXTENDED_FRAME_BOUNDS, out var clientRect, Marshal.SizeOf(typeof(RECT))); + GetWindowRect(_hwnd, out var frameRect); + var borderWidth = GetSystemMetrics(SystemMetric.SM_CXBORDER); + + return new PixelSize(clientRect.left - frameRect.left - borderWidth, 0); + } + } + public void Move(PixelPoint point) => Position = point; public void SetMinMaxSize(Size minSize, Size maxSize) @@ -790,12 +828,7 @@ namespace Avalonia.Win32 Handle = new WindowImplPlatformHandle(this); - _multitouch = Win32Platform.Options.EnableMultitouch ?? true; - - if (_multitouch) - { - RegisterTouchWindow(_hwnd, 0); - } + RegisterTouchWindow(_hwnd, 0); if (ShCoreAvailable && Win32Platform.WindowsVersion > PlatformConstants.Windows8) { @@ -904,22 +937,25 @@ namespace Avalonia.Win32 borderCaptionThickness.top = 1; } + //using a default margin of 0 when using WinUiComp removes artefacts when resizing. See issue #8316 + var defaultMargin = _isUsingComposition ? 0 : 1; + MARGINS margins = new MARGINS(); - margins.cxLeftWidth = 1; - margins.cxRightWidth = 1; - margins.cyBottomHeight = 1; + margins.cxLeftWidth = defaultMargin; + margins.cxRightWidth = defaultMargin; + margins.cyBottomHeight = defaultMargin; if (_extendTitleBarHint != -1) { borderCaptionThickness.top = (int)(_extendTitleBarHint * RenderScaling); } - margins.cyTopHeight = _extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.SystemChrome) && !_extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.PreferSystemChrome) ? borderCaptionThickness.top : 1; + margins.cyTopHeight = _extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.SystemChrome) && !_extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.PreferSystemChrome) ? borderCaptionThickness.top : defaultMargin; if (WindowState == WindowState.Maximized) { _extendedMargins = new Thickness(0, (borderCaptionThickness.top - borderThickness.top) / RenderScaling, 0, 0); - _offScreenMargin = new Thickness(borderThickness.left / RenderScaling, borderThickness.top / RenderScaling, borderThickness.right / RenderScaling, borderThickness.bottom / RenderScaling); + _offScreenMargin = new Thickness(borderThickness.left / PrimaryScreenRenderScaling, borderThickness.top / PrimaryScreenRenderScaling, borderThickness.right / PrimaryScreenRenderScaling, borderThickness.bottom / PrimaryScreenRenderScaling); } else { diff --git a/tests/Avalonia.Base.UnitTests/Input/PointerOverTests.cs b/tests/Avalonia.Base.UnitTests/Input/PointerOverTests.cs index 87df65a080..a5ca2aef4a 100644 --- a/tests/Avalonia.Base.UnitTests/Input/PointerOverTests.cs +++ b/tests/Avalonia.Base.UnitTests/Input/PointerOverTests.cs @@ -189,7 +189,7 @@ namespace Avalonia.Base.UnitTests.Input // Ensure that e.Handled is reset between controls. root.PointerMoved += (s, e) => e.Handled = true; - decorator.PointerEnter += (s, e) => e.Handled = true; + decorator.PointerEntered += (s, e) => e.Handled = true; SetHit(renderer, decorator); impl.Object.Input!(CreateRawPointerMovedArgs(device, root)); @@ -231,7 +231,7 @@ namespace Avalonia.Base.UnitTests.Input } }); - AddEnterLeaveHandlers(HandleEvent, canvas, decorator); + AddEnteredExitedHandlers(HandleEvent, canvas, decorator); // Enter decorator SetHit(renderer, decorator); @@ -246,17 +246,17 @@ namespace Avalonia.Base.UnitTests.Input Assert.Equal( new[] { - ((object?)decorator, "PointerEnter"), - (decorator, "PointerMoved"), - (decorator, "PointerLeave"), - (canvas, "PointerEnter"), - (canvas, "PointerMoved") + ((object?)decorator, nameof(InputElement.PointerEntered)), + (decorator, nameof(InputElement.PointerMoved)), + (decorator, nameof(InputElement.PointerExited)), + (canvas, nameof(InputElement.PointerEntered)), + (canvas, nameof(InputElement.PointerMoved)) }, result); } [Fact] - public void PointerEnter_Leave_Should_Be_Raised_In_Correct_Order() + public void PointerEntered_Exited_Should_Be_Raised_In_Correct_Order() { using var app = UnitTestApplication.Start(new TestServices(inputManager: new InputManager())); @@ -289,7 +289,7 @@ namespace Avalonia.Base.UnitTests.Input SetHit(renderer, canvas); impl.Object.Input!(CreateRawPointerMovedArgs(deviceMock.Object, root)); - AddEnterLeaveHandlers(HandleEvent, root, canvas, border, decorator); + AddEnteredExitedHandlers(HandleEvent, root, canvas, border, decorator); SetHit(renderer, decorator); impl.Object.Input!(CreateRawPointerMovedArgs(deviceMock.Object, root)); @@ -297,16 +297,16 @@ namespace Avalonia.Base.UnitTests.Input Assert.Equal( new[] { - ((object?)canvas, "PointerLeave"), - (decorator, "PointerEnter"), - (border, "PointerEnter"), + ((object?)canvas, nameof(InputElement.PointerExited)), + (decorator, nameof(InputElement.PointerEntered)), + (border, nameof(InputElement.PointerEntered)), }, result); } // https://github.com/AvaloniaUI/Avalonia/issues/7896 [Fact] - public void PointerEnter_Leave_Should_Set_Correct_Position() + public void PointerEntered_Exited_Should_Set_Correct_Position() { using var app = UnitTestApplication.Start(new TestServices(inputManager: new InputManager())); @@ -331,7 +331,7 @@ namespace Avalonia.Base.UnitTests.Input } }); - AddEnterLeaveHandlers(HandleEvent, root, canvas); + AddEnteredExitedHandlers(HandleEvent, root, canvas); SetHit(renderer, canvas); impl.Object.Input!(CreateRawPointerMovedArgs(deviceMock.Object, root, expectedPosition)); @@ -342,10 +342,10 @@ namespace Avalonia.Base.UnitTests.Input Assert.Equal( new[] { - ((object?)canvas, "PointerEnter", expectedPosition), - (root, "PointerEnter", expectedPosition), - (canvas, "PointerLeave", expectedPosition), - (root, "PointerLeave", expectedPosition) + ((object?)canvas, nameof(InputElement.PointerEntered), expectedPosition), + (root, nameof(InputElement.PointerEntered), expectedPosition), + (canvas, nameof(InputElement.PointerExited), expectedPosition), + (root, nameof(InputElement.PointerExited), expectedPosition) }, result); } @@ -415,7 +415,7 @@ namespace Avalonia.Base.UnitTests.Input } }); - AddEnterLeaveHandlers(HandleEvent, root, canvas); + AddEnteredExitedHandlers(HandleEvent, root, canvas); // Init pointer over. SetHit(renderer, canvas); @@ -429,22 +429,22 @@ namespace Avalonia.Base.UnitTests.Input Assert.Equal( new[] { - ((object?)canvas, "PointerEnter", lastClientPosition), - (root, "PointerEnter", lastClientPosition), - (canvas, "PointerLeave", lastClientPosition), - (root, "PointerLeave", lastClientPosition), + ((object?)canvas, nameof(InputElement.PointerEntered), lastClientPosition), + (root, nameof(InputElement.PointerEntered), lastClientPosition), + (canvas, nameof(InputElement.PointerExited), lastClientPosition), + (root, nameof(InputElement.PointerExited), lastClientPosition), }, result); } - private static void AddEnterLeaveHandlers( + private static void AddEnteredExitedHandlers( EventHandler handler, params IInputElement[] controls) { foreach (var c in controls) { - c.PointerEnter += handler; - c.PointerLeave += handler; + c.PointerEntered += handler; + c.PointerExited += handler; c.PointerMoved += handler; } } diff --git a/tests/Avalonia.Base.UnitTests/Input/TouchDeviceTests.cs b/tests/Avalonia.Base.UnitTests/Input/TouchDeviceTests.cs index 80c5a45c1a..7b7d547346 100644 --- a/tests/Avalonia.Base.UnitTests/Input/TouchDeviceTests.cs +++ b/tests/Avalonia.Base.UnitTests/Input/TouchDeviceTests.cs @@ -219,30 +219,36 @@ namespace Avalonia.Input.UnitTests { for (int i = 0; i < touchPointIds.Length; i++) { - inputManager.ProcessInput(new RawTouchEventArgs(device, 0, + inputManager.ProcessInput(new RawPointerEventArgs(device, 0, root, type, new Point(0, 0), - RawInputModifiers.None, - touchPointIds[i])); + RawInputModifiers.None) + { + RawPointerId = touchPointIds[i] + }); } } private static void TapOnce(IInputManager inputManager, TouchDevice device, IInputRoot root, ulong timestamp = 0, long touchPointId = 0) { - inputManager.ProcessInput(new RawTouchEventArgs(device, timestamp, + inputManager.ProcessInput(new RawPointerEventArgs(device, timestamp, root, RawPointerEventType.TouchBegin, new Point(0, 0), - RawInputModifiers.None, - touchPointId)); - inputManager.ProcessInput(new RawTouchEventArgs(device, timestamp, + RawInputModifiers.None) + { + RawPointerId = touchPointId + }); + inputManager.ProcessInput(new RawPointerEventArgs(device, timestamp, root, RawPointerEventType.TouchEnd, new Point(0, 0), - RawInputModifiers.None, - touchPointId)); + RawInputModifiers.None) + { + RawPointerId = touchPointId + }); } } } diff --git a/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests.cs b/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests.cs index 184aada6cd..c4b0795022 100644 --- a/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests.cs +++ b/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests.cs @@ -173,37 +173,6 @@ namespace Avalonia.Base.UnitTests.Layout target.Verify(x => x.InvalidateMeasure(root), Times.Once()); } - [Theory] - [InlineData(16, 6, 5.333333333333333)] - [InlineData(18, 10, 4)] - public void UseLayoutRounding_Arranges_Center_Alignment_Correctly_With_Fractional_Scaling( - double containerWidth, - double childWidth, - double expectedX) - { - Border target; - var root = new TestRoot - { - LayoutScaling = 1.5, - UseLayoutRounding = true, - Child = new Decorator - { - Width = containerWidth, - Height = 100, - Child = target = new Border - { - Width = childWidth, - HorizontalAlignment = HorizontalAlignment.Center, - } - } - }; - - root.Measure(new Size(100, 100)); - root.Arrange(new Rect(target.DesiredSize)); - - Assert.Equal(new Rect(expectedX, 0, childWidth, 100), target.Bounds); - } - [Fact] public void LayoutUpdated_Is_Called_At_End_Of_Layout_Pass() { diff --git a/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests_LayoutRounding.cs b/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests_LayoutRounding.cs new file mode 100644 index 0000000000..77f1a8882d --- /dev/null +++ b/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests_LayoutRounding.cs @@ -0,0 +1,140 @@ +using Avalonia.Controls; +using Avalonia.Layout; +using Avalonia.UnitTests; +using Xunit; +using Xunit.Sdk; + +namespace Avalonia.Base.UnitTests.Layout +{ + public class LayoutableTests_LayoutRounding + { + [Theory] + [InlineData(100, 100)] + [InlineData(101, 101.33333333333333)] + [InlineData(103, 103.33333333333333)] + public void Measure_Adjusts_DesiredSize_Upwards_When_Constraint_Allows(double desiredSize, double expectedSize) + { + var target = new TestLayoutable(new Size(desiredSize, desiredSize)); + var root = CreateRoot(1.5, target); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + Assert.Equal(new Size(expectedSize, expectedSize), target.DesiredSize); + } + + [Fact] + public void Measure_Constrains_Adjusted_DesiredSize_To_Constraint() + { + var target = new TestLayoutable(new Size(101, 101)); + var root = CreateRoot(1.5, target, constraint: new Size(101, 101)); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + // Desired width/height with layout rounding is 101.3333 but constraint is 101,101 so + // layout rounding should be ignored. + Assert.Equal(new Size(101, 101), target.DesiredSize); + } + + [Fact] + public void Measure_Adjusts_DesiredSize_Upwards_When_Margin_Present() + { + var target = new TestLayoutable(new Size(101, 101), margin: 1); + var root = CreateRoot(1.5, target); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + // - 1 pixel margin is rounded up to 1.3333; for both sides it is 2.6666 + // - Size of 101 gets rounded up to 101.3333 + // - Final size = 101.3333 + 2.6666 = 104 + AssertEqual(new Size(104, 104), target.DesiredSize); + } + + [Fact] + public void Arrange_Adjusts_Bounds_Upwards_With_Margin() + { + var target = new TestLayoutable(new Size(101, 101), margin: 1); + var root = CreateRoot(1.5, target); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + // - 1 pixel margin is rounded up to 1.3333 + // - Size of 101 gets rounded up to 101.3333 + AssertEqual(new Point(1.3333333333333333, 1.3333333333333333), target.Bounds.Position); + AssertEqual(new Size(101.33333333333333, 101.33333333333333), target.Bounds.Size); + } + + [Theory] + [InlineData(16, 6, 5.333333333333333)] + [InlineData(18, 10, 4)] + public void Arranges_Center_Alignment_Correctly_With_Fractional_Scaling( + double containerWidth, + double childWidth, + double expectedX) + { + Border target; + var root = new TestRoot + { + LayoutScaling = 1.5, + UseLayoutRounding = true, + Child = new Decorator + { + Width = containerWidth, + Height = 100, + Child = target = new Border + { + Width = childWidth, + HorizontalAlignment = HorizontalAlignment.Center, + } + } + }; + + root.Measure(new Size(100, 100)); + root.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(new Rect(expectedX, 0, childWidth, 100), target.Bounds); + } + + private static TestRoot CreateRoot( + double scaling, + Control child, + Size? constraint = null) + { + return new TestRoot + { + LayoutScaling = scaling, + UseLayoutRounding = true, + Child = child, + ClientSize = constraint ?? new Size(1000, 1000), + }; + } + + private static void AssertEqual(Point expected, Point actual) + { + if (!expected.NearlyEquals(actual)) + { + throw new EqualException(expected, actual); + } + } + + private static void AssertEqual(Size expected, Size actual) + { + if (!expected.NearlyEquals(actual)) + { + throw new EqualException(expected, actual); + } + } + + private class TestLayoutable : Control + { + private Size _desiredSize; + + public TestLayoutable(Size desiredSize, double margin = 0) + { + _desiredSize = desiredSize; + Margin = new Thickness(margin); + } + + protected override Size MeasureOverride(Size availableSize) => _desiredSize; + } + } +} diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiAlgorithmTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiAlgorithmTests.cs index f8a2abc716..5ff2c0e07b 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiAlgorithmTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiAlgorithmTests.cs @@ -27,7 +27,7 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting private bool Run(BiDiTestData testData) { - var bidi = BidiAlgorithm.Instance.Value; + var bidi = new BidiAlgorithm(); // Run the algorithm... ArraySlice resultLevels; diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTests.cs index 1ed33e6132..d2cea45ce1 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTests.cs @@ -30,7 +30,7 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting private bool Run(BiDiClassData t) { - var bidi = BidiAlgorithm.Instance.Value; + var bidi = new BidiAlgorithm(); var bidiData = new BidiData(t.ParagraphLevel); var text = Encoding.UTF32.GetString(MemoryMarshal.Cast(t.CodePoints).ToArray()); @@ -39,9 +39,12 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting bidiData.Append(text.AsMemory()); // Act - bidi.Process(bidiData); + for (int i = 0; i < 10; i++) + { + bidi.Process(bidiData); + } - var resultLevels = bidi.ResolvedLevels; + var resultLevels = bidi.ResolvedLevels; var resultParagraphLevel = bidi.ResolvedParagraphEmbeddingLevel; // Assert diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs index 033e0e2242..3c5a966eb7 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs @@ -129,6 +129,8 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting ParagraphEmbeddingLevel = paragraphEmbeddingLevel, Levels = levels }); + + break; } } } diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGenerator.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGenerator.cs index 7ad2e71d77..1a8d41caa4 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGenerator.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGenerator.cs @@ -16,12 +16,9 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting Directory.CreateDirectory("Generated"); } - using (var stream = File.Create("Generated\\GraphemeBreak.trie")) - { - var trie = GenerateBreakTypeTrie(); + var trie = GenerateBreakTypeTrie(); - trie.Save(stream); - } + UnicodeDataGenerator.GenerateTrieClass("GraphemeBreak", trie); } private static UnicodeTrie GenerateBreakTypeTrie() @@ -36,9 +33,9 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting { foreach (var (start, end, graphemeBreakType) in breakData) { - if (!Enum.TryParse(graphemeBreakType, out var value)) + if (!Enum.TryParse(graphemeBreakType.Replace("_", ""), out var value)) { - continue; + continue; } if (start == end) diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGeneratorTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGeneratorTests.cs index e1e3e14ea7..c9f869cea9 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGeneratorTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGeneratorTests.cs @@ -1,6 +1,10 @@ using System; +using System.Runtime.InteropServices; +using System.Text; using Avalonia.Media.TextFormatting.Unicode; +using Avalonia.Visuals.UnitTests.Media.TextFormatting; using Xunit; +using Xunit.Abstractions; namespace Avalonia.Base.UnitTests.Media.TextFormatting { @@ -10,20 +14,74 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting /// public class GraphemeBreakClassTrieGeneratorTests { - [Theory(Skip = "Only run when we update the trie.")] - [ClassData(typeof(GraphemeBreakTestDataGenerator))] - public void Should_Enumerate(string text, int expectedLength) + private readonly ITestOutputHelper _outputHelper; + + public GraphemeBreakClassTrieGeneratorTests(ITestOutputHelper outputHelper) { - var textMemory = text.AsMemory(); + _outputHelper = outputHelper; + } - var enumerator = new GraphemeEnumerator(textMemory); + [Fact(/*Skip = "Only run when we update the trie."*/)] + public void Should_Enumerate() + { + var generator = new GraphemeBreakTestDataGenerator(); - Assert.True(enumerator.MoveNext()); + foreach (var testData in generator) + { + Assert.True(Run(testData)); + } + } - Assert.Equal(expectedLength, enumerator.Current.Text.Length); + private bool Run(GraphemeBreakData t) + { + var text = Encoding.UTF32.GetString(MemoryMarshal.Cast(t.Codepoints).ToArray()); + var grapheme = Encoding.UTF32.GetString(MemoryMarshal.Cast(t.Grapheme).ToArray()).AsSpan(); + + var enumerator = new GraphemeEnumerator(text.AsMemory()); + + enumerator.MoveNext(); + + var actual = enumerator.Current.Text.Span; + + var pass = true; + + if(actual.Length != grapheme.Length) + { + pass = false; + } + + if (pass) + { + for (int i = 0; i < grapheme.Length; i++) + { + var a = grapheme[i]; + var b = actual[i]; + + if (a != b) + { + pass = false; + + break; + } + } + } + + if (!pass) + { + _outputHelper.WriteLine($"Failed line {t.LineNumber}"); + _outputHelper.WriteLine($" Text: {text}"); + _outputHelper.WriteLine($" Codepoints: {string.Join(" ", t.Codepoints)}"); + _outputHelper.WriteLine($" Grapheme: {string.Join(" ", t.Grapheme)}"); + _outputHelper.WriteLine($" Line: {t.Line}"); + + return false; + } + + + return true; } - [Fact(Skip = "Only run when we update the trie.")] + [Fact(/*Skip = "Only run when we update the trie."*/)] public void Should_Enumerate_Other() { const string text = "ABCDEFGHIJ"; @@ -44,18 +102,10 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting Assert.Equal(10, count); } - [Fact(Skip = "Only run when we update the trie.")] + [Fact(/*Skip = "Only run when we update the trie."*/)] public void Should_Generate_Trie() { GraphemeBreakClassTrieGenerator.Execute(); } - - private class GraphemeBreakTestDataGenerator : TestDataGenerator - { - public GraphemeBreakTestDataGenerator() - : base("auxiliary/GraphemeBreakTest.txt") - { - } - } } } diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakTestDataGenerator.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakTestDataGenerator.cs new file mode 100644 index 0000000000..f6616d74a2 --- /dev/null +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakTestDataGenerator.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using Avalonia.Base.UnitTests.Media.TextFormatting; + +namespace Avalonia.Visuals.UnitTests.Media.TextFormatting +{ + internal class GraphemeBreakTestDataGenerator : IEnumerable + { + private readonly List _testData; + + public GraphemeBreakTestDataGenerator() + { + _testData = ReadData(); + } + + public IEnumerator GetEnumerator() + { + return _testData.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + private static List ReadData() + { + var testData = new List(); + + var url = Path.Combine(UnicodeDataGenerator.Ucd, "auxiliary/GraphemeBreakTest.txt"); + + using (var client = new HttpClient()) + using (var result = client.GetAsync(url).GetAwaiter().GetResult()) + { + if (!result.IsSuccessStatusCode) + { + return testData; + } + + using (var stream = result.Content.ReadAsStreamAsync().GetAwaiter().GetResult()) + using (var reader = new StreamReader(stream)) + { + var lineNumber = 0; + + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + + lineNumber++; + + if (line == null) + { + break; + } + + if (line.StartsWith("#") || string.IsNullOrEmpty(line)) + { + continue; + } + + var elements = line.Split('#'); + + elements = elements[0].Replace("÷\t", "÷").Trim('÷').Split('÷'); + + var graphemeChars = elements[0].Replace(" × ", " ").Split(' '); + + var codepoints = graphemeChars.Where(x => x != "" && x != "×") + .Select(x => Convert.ToInt32(x, 16)).ToList(); + + var grapheme = codepoints.ToArray(); + + if(elements.Length > 1) + { + var remainingChars = elements[1].Replace(" × ", " ").Split(' '); + + var remaining = remainingChars.Where(x => x != "" && x != "×").Select(x => Convert.ToInt32(x, 16)).ToArray(); + + codepoints.AddRange(remaining); + } + + var data = new GraphemeBreakData + { + Line = line, + LineNumber = lineNumber, + Grapheme = grapheme, + Codepoints = codepoints.ToArray() + }; + + testData.Add(data); + } + } + } + return testData; + } + } + + internal struct GraphemeBreakData + { + public string Line { get; set; } + public int LineNumber { get; set; } + public int[] Grapheme { get; set; } + public int[] Codepoints{ get; set; } + } +} diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumuratorTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumuratorTests.cs index 1dbfbe4d24..15be1200c8 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumuratorTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumuratorTests.cs @@ -134,7 +134,7 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting _outputHelper.WriteLine($"Expected Breaks: {string.Join(" ", breakPoints)}"); _outputHelper.WriteLine($" Actual Breaks: {string.Join(" ", foundBreaks)}"); _outputHelper.WriteLine($" Text: {text}"); - _outputHelper.WriteLine($" Char Props: {string.Join(" ", codePoints.Select(x => new Codepoint(x).LineBreakClass))}"); + _outputHelper.WriteLine($" Char Props: {string.Join(" ", codePoints.Select(x => new Codepoint((uint)x).LineBreakClass))}"); _outputHelper.WriteLine(""); } diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/TestDataGenerator.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/TestDataGenerator.cs deleted file mode 100644 index 33b4c8a269..0000000000 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/TestDataGenerator.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http; - -namespace Avalonia.Base.UnitTests.Media.TextFormatting -{ - public abstract class TestDataGenerator : IEnumerable - { - private readonly string _fileName; - private readonly List _testData; - - protected TestDataGenerator(string fileName) - { - _fileName = fileName; - _testData = ReadTestData(); - } - - public IEnumerator GetEnumerator() - { - return _testData.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - private List ReadTestData() - { - var testData = new List(); - - using (var client = new HttpClient()) - { - var url = Path.Combine(UnicodeDataGenerator.Ucd, _fileName); - - using (var result = client.GetAsync(url).GetAwaiter().GetResult()) - { - if (!result.IsSuccessStatusCode) - return testData; - - using (var stream = result.Content.ReadAsStreamAsync().GetAwaiter().GetResult()) - using (var reader = new StreamReader(stream)) - { - while (!reader.EndOfStream) - { - var line = reader.ReadLine(); - - if (line == null) - { - break; - } - - if (line.StartsWith("#") || string.IsNullOrEmpty(line)) - { - continue; - } - - var elements = line.Split('#'); - - elements = elements[0].Replace("÷\t", "÷").Trim('÷').Split('÷'); - - var chars = elements[0].Replace(" × ", " ").Split(' '); - - var codepoints = chars.Where(x => x != "" && x != "×") - .Select(x => Convert.ToInt32(x, 16)).ToArray(); - - var text = string.Join(null, codepoints.Select(char.ConvertFromUtf32)); - - var length = codepoints.Select(x => x > ushort.MaxValue ? 2 : 1).Sum(); - - var data = new object[] { text, length }; - - testData.Add(data); - } - } - } - } - - return testData; - } - } -} diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs index e2877abd83..a49c8ffa2a 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs @@ -10,22 +10,22 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting { internal static class UnicodeDataGenerator { - public const string Ucd = "https://www.unicode.org/Public/13.0.0/ucd/"; + public const string Ucd = "https://www.unicode.org/Public/14.0.0/ucd/"; - public static UnicodeTrie GenerateBiDiTrie(out BiDiDataEntries biDiDataEntries,out Dictionary biDiData) + public static UnicodeTrie GenerateBiDiTrie(out BiDiDataEntries biDiDataEntries, out Dictionary biDiData) { biDiData = new Dictionary(); - var biDiClassEntries = - UnicodeEnumsGenerator.CreateBiDiClassEnum(); + var bidiClassEntries = + UnicodeEnumsGenerator.CreateBidiClassEnum(); - var biDiClassMappings = CreateTagToIndexMappings(biDiClassEntries); + var bidiClassMappings = CreateTagToIndexMappings(bidiClassEntries); - var biDiClassData = ReadBiDiData(); + var bidiClassData = ReadBiDiData(); - foreach (var (range, name) in biDiClassData) + foreach (var (range, name) in bidiClassData) { - var biDiClass = biDiClassMappings[name]; + var biDiClass = bidiClassMappings[name]; AddBiDiClassRange(biDiData, range, biDiClass); } @@ -56,16 +56,69 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting biDiDataEntries = new BiDiDataEntries() { - PairedBracketTypes = biDiPairedBracketTypeEntries, BiDiClasses = biDiClassEntries + PairedBracketTypes = biDiPairedBracketTypeEntries, BiDiClasses = bidiClassEntries }; - - using (var stream = File.Create("Generated\\BiDi.trie")) + + var trie = biDiTrieBuilder.Freeze(); + + GenerateTrieClass("Bidi", trie); + + return trie; + } + + public static void GenerateTrieClass(string name, UnicodeTrie trie) + { + var stream = new MemoryStream(); + + trie.Save(stream); + + using (var fileStream = File.Create($"Generated\\{name}.trie.cs")) + using (var writer = new StreamWriter(fileStream)) { - var trie = biDiTrieBuilder.Freeze(); + writer.WriteLine("using System;"); + writer.WriteLine("namespace Avalonia.Media.TextFormatting.Unicode"); + writer.WriteLine("{"); + writer.WriteLine($" internal static class {name}Trie"); + writer.WriteLine(" {"); + writer.WriteLine(" public static ReadOnlySpan Data => new byte[]"); + writer.WriteLine(" {"); + + stream.Position = 0; + + writer.Write(" "); + + long length = stream.Length; + + while (true) + { + var b = stream.ReadByte(); + + if(b == -1) + { + break; + } + + writer.Write(b.ToString()); + + if (stream.Position % 100 > 0 && stream.Position != length) + { + writer.Write(", "); + } + else + { + writer.Write(','); + writer.Write(Environment.NewLine); - trie.Save(stream); + if (stream.Position != length) + { + writer.Write(" "); + } + } + } - return trie; + writer.WriteLine(" };"); + writer.WriteLine(" }"); + writer.WriteLine("}"); } } @@ -105,14 +158,11 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting LineBreakClasses = lineBreakClassEntries }; - using (var stream = File.Create("Generated\\UnicodeData.trie")) - { - var trie = unicodeDataTrieBuilder.Freeze(); + var trie = unicodeDataTrieBuilder.Freeze(); - trie.Save(stream); - - return trie; - } + GenerateTrieClass("UnicodeData", trie); + + return trie; } private static Dictionary GetUnicodeData(IReadOnlyDictionary generalCategoryMappings, @@ -407,9 +457,7 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting public int BracketType { get; set; } public int BiDiClass { get; set; } - } - - + } } internal class UnicodeDataEntries diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGeneratorTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGeneratorTests.cs index f3aea83316..688c711f15 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGeneratorTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGeneratorTests.cs @@ -22,7 +22,7 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting foreach (var value in unicodeData.Values) { - var data = unicodeDataTrie.Get(value.Codepoint); + var data = unicodeDataTrie.Get((uint)value.Codepoint); Assert.Equal(value.GeneralCategory, GetValue(data, 0, UnicodeData.CATEGORY_MASK)); @@ -35,7 +35,7 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting foreach (var value in biDiData.Values) { - var data = biDiTrie.Get(value.Codepoint); + var data = biDiTrie.Get((uint)value.Codepoint); Assert.Equal(value.Bracket, GetValue(data, 0, UnicodeData.BIDIPAIREDBRACKED_MASK)); diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs index 1323ddfbd1..110e57cbd3 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs @@ -102,7 +102,7 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting using (var stream = typeof(UnicodeEnumsGenerator).Assembly.GetManifestResourceStream( - "Avalonia.Visuals.UnitTests.Media.TextFormatting.BreakPairTable.txt")) + "Avalonia.Base.UnitTests.Media.TextFormatting.BreakPairTable.txt")) using (var reader = new StreamReader(stream)) { while (!reader.EndOfStream) @@ -244,18 +244,18 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting return orderedLineBreakEntries.Values.ToList(); } - public static List CreateBiDiClassEnum() + public static List CreateBidiClassEnum() { var entries = new List { new DataEntry("Left_To_Right", "L", string.Empty) }; ParseDataEntries("# Bidi_Class (bc)", entries); - using (var stream = File.Create("Generated\\BiDiClass.cs")) + using (var stream = File.Create("Generated\\BidiClass.cs")) using (var writer = new StreamWriter(stream)) { writer.WriteLine("namespace Avalonia.Media.TextFormatting.Unicode"); writer.WriteLine("{"); - writer.WriteLine(" public enum BiDiClass"); + writer.WriteLine(" public enum BidiClass"); writer.WriteLine(" {"); foreach (var entry in entries) @@ -277,12 +277,12 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting ParseDataEntries("# Bidi_Paired_Bracket_Type (bpt)", entries); - using (var stream = File.Create("Generated\\BiDiPairedBracketType.cs")) + using (var stream = File.Create("Generated\\BidiPairedBracketType.cs")) using (var writer = new StreamWriter(stream)) { writer.WriteLine("namespace Avalonia.Media.TextFormatting.Unicode"); writer.WriteLine("{"); - writer.WriteLine(" public enum BiDiPairedBracketType"); + writer.WriteLine(" public enum BidiPairedBracketType"); writer.WriteLine(" {"); foreach (var entry in entries) diff --git a/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs b/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs index 5cc9f57c8e..502575702a 100644 --- a/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs +++ b/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs @@ -594,6 +594,69 @@ namespace Avalonia.Base.UnitTests.Rendering.SceneGraph } } + [Fact] + public void Should_Update_When_Control_Moved_Causing_Layout_Change() + { + using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) + { + Decorator moveFrom; + Decorator moveTo; + Canvas moveMe; + var tree = new TestRoot + { + Width = 100, + Height = 100, + Child = new DockPanel + { + Children = + { + (moveFrom = new Decorator + { + Child = moveMe = new Canvas + { + Width = 100, + Height = 100, + }, + }), + (moveTo = new Decorator()), + } + } + }; + + tree.Measure(Size.Infinity); + tree.Arrange(new Rect(tree.DesiredSize)); + + var scene = new Scene(tree); + var sceneBuilder = new SceneBuilder(); + sceneBuilder.UpdateAll(scene); + + var moveFromNode = (VisualNode)scene.FindNode(moveFrom); + var moveToNode = (VisualNode)scene.FindNode(moveTo); + + Assert.Equal(1, moveFromNode.Children.Count); + Assert.Same(moveMe, moveFromNode.Children[0].Visual); + Assert.Empty(moveToNode.Children); + + moveFrom.Child = null; + moveTo.Child = moveMe; + tree.LayoutManager.ExecuteLayoutPass(); + + scene = scene.CloneScene(); + moveFromNode = (VisualNode)scene.FindNode(moveFrom); + moveToNode = (VisualNode)scene.FindNode(moveTo); + + moveFromNode.SortChildren(scene); + moveToNode.SortChildren(scene); + sceneBuilder.Update(scene, moveFrom); + sceneBuilder.Update(scene, moveTo); + sceneBuilder.Update(scene, moveMe); + + Assert.Empty(moveFromNode.Children); + Assert.Equal(1, moveToNode.Children.Count); + Assert.Same(moveMe, moveToNode.Children[0].Visual); + } + } + [Fact] public void Should_Update_When_Control_Made_Invisible() { @@ -838,6 +901,7 @@ namespace Avalonia.Base.UnitTests.Rendering.SceneGraph Canvas canvas; var tree = new TestRoot { + ClientSize = new Size(100, 100), Child = decorator = new Decorator { Margin = new Thickness(0, 10, 0, 0), diff --git a/tests/Avalonia.Benchmarks/Layout/ControlsBenchmark.cs b/tests/Avalonia.Benchmarks/Layout/ControlsBenchmark.cs index 3493dd0f53..51b52d6130 100644 --- a/tests/Avalonia.Benchmarks/Layout/ControlsBenchmark.cs +++ b/tests/Avalonia.Benchmarks/Layout/ControlsBenchmark.cs @@ -1,6 +1,7 @@ using System; using System.Runtime.CompilerServices; using Avalonia.Controls; +using Avalonia.Threading; using Avalonia.UnitTests; using BenchmarkDotNet.Attributes; @@ -37,6 +38,21 @@ namespace Avalonia.Benchmarks.Layout _root.Child = calendar; _root.LayoutManager.ExecuteLayoutPass(); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + } + + [Benchmark] + [MethodImpl(MethodImplOptions.NoInlining)] + public void CreateCalendarWithLoaded() + { + using var subscription = Control.LoadedEvent.AddClassHandler((c, s) => { }); + + var calendar = new Calendar(); + + _root.Child = calendar; + + _root.LayoutManager.ExecuteLayoutPass(); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); } [Benchmark] @@ -48,6 +64,7 @@ namespace Avalonia.Benchmarks.Layout _root.Child = button; _root.LayoutManager.ExecuteLayoutPass(); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); } [Benchmark] @@ -59,6 +76,7 @@ namespace Avalonia.Benchmarks.Layout _root.Child = textBox; _root.LayoutManager.ExecuteLayoutPass(); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); } public void Dispose() diff --git a/tests/Avalonia.Controls.UnitTests/BorderTests.cs b/tests/Avalonia.Controls.UnitTests/BorderTests.cs index ab33eaaff9..7af7d1cee2 100644 --- a/tests/Avalonia.Controls.UnitTests/BorderTests.cs +++ b/tests/Avalonia.Controls.UnitTests/BorderTests.cs @@ -1,6 +1,8 @@ +using Avalonia.Layout; using Avalonia.Media; using Avalonia.Rendering; using Avalonia.UnitTests; +using Avalonia.VisualTree; using Moq; using Xunit; @@ -60,5 +62,68 @@ namespace Avalonia.Controls.UnitTests renderer.Verify(x => x.AddDirty(target), Times.Once); } + + public class UseLayoutRounding + { + [Fact] + public void Measure_Rounds_Padding() + { + var target = new Border + { + Padding = new Thickness(1), + Child = new Canvas + { + Width = 101, + Height = 101, + } + }; + + var root = CreatedRoot(1.5, target); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + // - 1 pixel padding is rounded up to 1.3333; for both sides it is 2.6666 + // - Size of 101 gets rounded up to 101.3333 + // - Desired size = 101.3333 + 2.6666 = 104 + Assert.Equal(new Size(104, 104), target.DesiredSize); + } + + [Fact] + public void Measure_Rounds_BorderThickness() + { + var target = new Border + { + BorderThickness = new Thickness(1), + Child = new Canvas + { + Width = 101, + Height = 101, + } + }; + + var root = CreatedRoot(1.5, target); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + // - 1 pixel border thickness is rounded up to 1.3333; for both sides it is 2.6666 + // - Size of 101 gets rounded up to 101.3333 + // - Desired size = 101.3333 + 2.6666 = 104 + Assert.Equal(new Size(104, 104), target.DesiredSize); + } + + private static TestRoot CreatedRoot( + double scaling, + Control child, + Size? constraint = null) + { + return new TestRoot + { + LayoutScaling = scaling, + UseLayoutRounding = true, + Child = child, + ClientSize = constraint ?? new Size(1000, 1000), + }; + } + } } } diff --git a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs index 2e3623cc3c..42bdffd908 100644 --- a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs @@ -150,7 +150,7 @@ namespace Avalonia.Controls.UnitTests target.Click += (s, e) => clicked = true; - RaisePointerEnter(target); + RaisePointerEntered(target); RaisePointerMove(target, pt); RaisePointerPressed(target, 1, MouseButton.Left, pt); @@ -182,10 +182,10 @@ namespace Avalonia.Controls.UnitTests target.Click += (s, e) => clicked = true; - RaisePointerEnter(target); + RaisePointerEntered(target); RaisePointerMove(target, new Point(50,50)); RaisePointerPressed(target, 1, MouseButton.Left, new Point(50, 50)); - RaisePointerLeave(target); + RaisePointerExited(target); Assert.Equal(_helper.Captured, target); @@ -224,7 +224,7 @@ namespace Avalonia.Controls.UnitTests target.Click += (s, e) => clicked = true; - RaisePointerEnter(target); + RaisePointerEntered(target); RaisePointerMove(target, pt); RaisePointerPressed(target, 1, MouseButton.Left, pt); @@ -422,12 +422,12 @@ namespace Avalonia.Controls.UnitTests _helper.Up(button, mouseButton, pt); } - private void RaisePointerEnter(Button button) + private void RaisePointerEntered(Button button) { _helper.Enter(button); } - private void RaisePointerLeave(Button button) + private void RaisePointerExited(Button button) { _helper.Leave(button); } diff --git a/tests/Avalonia.Controls.UnitTests/DecoratorTests.cs b/tests/Avalonia.Controls.UnitTests/DecoratorTests.cs index 65749efbf9..fe58cd4c7f 100644 --- a/tests/Avalonia.Controls.UnitTests/DecoratorTests.cs +++ b/tests/Avalonia.Controls.UnitTests/DecoratorTests.cs @@ -1,6 +1,7 @@ using System.Collections.Specialized; using System.Linq; using Avalonia.LogicalTree; +using Avalonia.UnitTests; using Xunit; namespace Avalonia.Controls.UnitTests @@ -116,5 +117,45 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(new Size(16, 16), target.DesiredSize); } + + public class UseLayoutRounding + { + [Fact] + public void Measure_Rounds_Padding() + { + var target = new Decorator + { + Padding = new Thickness(1), + Child = new Canvas + { + Width = 101, + Height = 101, + } + }; + + var root = CreatedRoot(1.5, target); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + // - 1 pixel padding is rounded up to 1.3333; for both sides it is 2.6666 + // - Size of 101 gets rounded up to 101.3333 + // - Desired size = 101.3333 + 2.6666 = 104 + Assert.Equal(new Size(104, 104), target.DesiredSize); + } + + private static TestRoot CreatedRoot( + double scaling, + Control child, + Size? constraint = null) + { + return new TestRoot + { + LayoutScaling = scaling, + UseLayoutRounding = true, + Child = child, + ClientSize = constraint ?? new Size(1000, 1000), + }; + } + } } } diff --git a/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs b/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs index d22a67f389..192734581d 100644 --- a/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs @@ -174,7 +174,7 @@ namespace Avalonia.Controls.UnitTests.Platform } [Fact] - public void PointerEnter_Opens_Item_When_Old_Item_Is_Open() + public void PointerEntered_Opens_Item_When_Old_Item_Is_Open() { var target = new DefaultMenuInteractionHandler(false); var menu = new Mock(); @@ -187,11 +187,11 @@ namespace Avalonia.Controls.UnitTests.Platform x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu.Object); - var e = CreateArgs(MenuItem.PointerEnterItemEvent, nextItem); + var e = CreateArgs(MenuItem.PointerEnteredItemEvent, nextItem); menu.SetupGet(x => x.SelectedItem).Returns(item); - target.PointerEnter(nextItem, e); + target.PointerEntered(nextItem, e); Mock.Get(item).Verify(x => x.Close()); menu.VerifySet(x => x.SelectedItem = nextItem); @@ -202,31 +202,31 @@ namespace Avalonia.Controls.UnitTests.Platform } [Fact] - public void PointerLeave_Deselects_Item_When_Menu_Not_Open() + public void PointerExited_Deselects_Item_When_Menu_Not_Open() { var target = new DefaultMenuInteractionHandler(false); var menu = new Mock(); var item = Mock.Of(x => x.IsTopLevel == true && x.Parent == menu.Object); - var e = CreateArgs(MenuItem.PointerLeaveItemEvent, item); + var e = CreateArgs(MenuItem.PointerExitedItemEvent, item); menu.SetupGet(x => x.SelectedItem).Returns(item); - target.PointerLeave(item, e); + target.PointerExited(item, e); menu.VerifySet(x => x.SelectedItem = null); Assert.False(e.Handled); } [Fact] - public void PointerLeave_Doesnt_Deselect_Item_When_Menu_Open() + public void PointerExited_Doesnt_Deselect_Item_When_Menu_Open() { var target = new DefaultMenuInteractionHandler(false); var menu = new Mock(); var item = Mock.Of(x => x.IsTopLevel == true && x.Parent == menu.Object); - var e = CreateArgs(MenuItem.PointerLeaveItemEvent, item); + var e = CreateArgs(MenuItem.PointerExitedItemEvent, item); menu.SetupGet(x => x.IsOpen).Returns(true); menu.SetupGet(x => x.SelectedItem).Returns(item); - target.PointerLeave(item, e); + target.PointerExited(item, e); menu.VerifySet(x => x.SelectedItem = null, Times.Never); Assert.False(e.Handled); @@ -382,31 +382,31 @@ namespace Avalonia.Controls.UnitTests.Platform } [Fact] - public void PointerEnter_Selects_Item() + public void PointerEntered_Selects_Item() { var target = new DefaultMenuInteractionHandler(false); var menu = Mock.Of(); var parentItem = Mock.Of(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var item = Mock.Of(x => x.Parent == parentItem); - var e = CreateArgs(MenuItem.PointerEnterItemEvent, item); + var e = CreateArgs(MenuItem.PointerEnteredItemEvent, item); - target.PointerEnter(item, e); + target.PointerEntered(item, e); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = item); Assert.False(e.Handled); } [Fact] - public void PointerEnter_Opens_Submenu_After_Delay() + public void PointerEntered_Opens_Submenu_After_Delay() { var timer = new TestTimer(); var target = new DefaultMenuInteractionHandler(false, null, timer.RunOnce); var menu = Mock.Of(); var parentItem = Mock.Of(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var item = Mock.Of(x => x.Parent == parentItem && x.HasSubMenu == true); - var e = CreateArgs(MenuItem.PointerEnterItemEvent, item); + var e = CreateArgs(MenuItem.PointerEnteredItemEvent, item); - target.PointerEnter(item, e); + target.PointerEntered(item, e); Mock.Get(item).Verify(x => x.Open(), Times.Never); timer.Pulse(); @@ -416,7 +416,7 @@ namespace Avalonia.Controls.UnitTests.Platform } [Fact] - public void PointerEnter_Closes_Sibling_Submenu_After_Delay() + public void PointerEntered_Closes_Sibling_Submenu_After_Delay() { var timer = new TestTimer(); var target = new DefaultMenuInteractionHandler(false, null, timer.RunOnce); @@ -424,11 +424,11 @@ namespace Avalonia.Controls.UnitTests.Platform var parentItem = Mock.Of(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var item = Mock.Of(x => x.Parent == parentItem); var sibling = Mock.Of(x => x.Parent == parentItem && x.HasSubMenu == true && x.IsSubMenuOpen == true); - var e = CreateArgs(MenuItem.PointerEnterItemEvent, item); + var e = CreateArgs(MenuItem.PointerEnteredItemEvent, item); Mock.Get(parentItem).SetupGet(x => x.SubItems).Returns(new[] { item, sibling }); - target.PointerEnter(item, e); + target.PointerEntered(item, e); Mock.Get(sibling).Verify(x => x.Close(), Times.Never); timer.Pulse(); @@ -438,48 +438,48 @@ namespace Avalonia.Controls.UnitTests.Platform } [Fact] - public void PointerLeave_Deselects_Item() + public void PointerExited_Deselects_Item() { var target = new DefaultMenuInteractionHandler(false); var menu = Mock.Of(); var parentItem = Mock.Of(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var item = Mock.Of(x => x.Parent == parentItem); - var e = CreateArgs(MenuItem.PointerLeaveItemEvent, item); + var e = CreateArgs(MenuItem.PointerExitedItemEvent, item); Mock.Get(parentItem).SetupGet(x => x.SelectedItem).Returns(item); - target.PointerLeave(item, e); + target.PointerExited(item, e); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null); Assert.False(e.Handled); } [Fact] - public void PointerLeave_Doesnt_Deselect_Sibling() + public void PointerExited_Doesnt_Deselect_Sibling() { var target = new DefaultMenuInteractionHandler(false); var menu = Mock.Of(); var parentItem = Mock.Of(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var item = Mock.Of(x => x.Parent == parentItem); var sibling = Mock.Of(x => x.Parent == parentItem); - var e = CreateArgs(MenuItem.PointerLeaveItemEvent, item); + var e = CreateArgs(MenuItem.PointerExitedItemEvent, item); Mock.Get(parentItem).SetupGet(x => x.SelectedItem).Returns(sibling); - target.PointerLeave(item, e); + target.PointerExited(item, e); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null, Times.Never); Assert.False(e.Handled); } [Fact] - public void PointerLeave_Doesnt_Deselect_Item_If_Pointer_Over_Submenu() + public void PointerExited_Doesnt_Deselect_Item_If_Pointer_Over_Submenu() { var target = new DefaultMenuInteractionHandler(false); var menu = Mock.Of(); var parentItem = Mock.Of(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var item = Mock.Of(x => x.Parent == parentItem && x.HasSubMenu == true && x.IsPointerOverSubMenu == true); - var e = CreateArgs(MenuItem.PointerLeaveItemEvent, item); + var e = CreateArgs(MenuItem.PointerExitedItemEvent, item); - target.PointerLeave(item, e); + target.PointerExited(item, e); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = null, Times.Never); Assert.False(e.Handled); @@ -510,11 +510,11 @@ namespace Avalonia.Controls.UnitTests.Platform var parentItem = Mock.Of(x => x.IsTopLevel == true && x.HasSubMenu == true && x.Parent == menu); var item = Mock.Of(x => x.Parent == parentItem && x.HasSubMenu == true); var childItem = Mock.Of(x => x.Parent == item); - var enter = CreateArgs(MenuItem.PointerEnterItemEvent, item); - var leave = CreateArgs(MenuItem.PointerLeaveItemEvent, item); + var enter = CreateArgs(MenuItem.PointerEnteredItemEvent, item); + var leave = CreateArgs(MenuItem.PointerExitedItemEvent, item); // Pointer enters item; item is selected. - target.PointerEnter(item, enter); + target.PointerEntered(item, enter); Assert.True(timer.ActionIsQueued); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = item); Mock.Get(parentItem).Invocations.Clear(); @@ -526,13 +526,13 @@ namespace Avalonia.Controls.UnitTests.Platform Mock.Get(item).Invocations.Clear(); // Pointer briefly exits item, but submenu remains open. - target.PointerLeave(item, leave); + target.PointerExited(item, leave); Mock.Get(item).Verify(x => x.Close(), Times.Never); Mock.Get(item).Invocations.Clear(); // Pointer enters child item; is selected. enter.Source = childItem; - target.PointerEnter(childItem, enter); + target.PointerEntered(childItem, enter); Mock.Get(item).VerifySet(x => x.SelectedItem = childItem); Mock.Get(parentItem).VerifySet(x => x.SelectedItem = item); Mock.Get(item).Invocations.Clear(); diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs index ed44fbfc32..e82050528f 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs @@ -1,5 +1,6 @@ using Avalonia.Controls.Presenters; using Avalonia.Layout; +using Avalonia.UnitTests; using Xunit; namespace Avalonia.Controls.UnitTests.Presenters @@ -232,5 +233,68 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Equal(new Rect(32, 32, 0, 0), content.Bounds); } + + public class UseLayoutRounding + { + [Fact] + public void Measure_Rounds_Padding() + { + var target = new ContentPresenter + { + Padding = new Thickness(1), + Content = new Canvas + { + Width = 101, + Height = 101, + } + }; + + var root = CreatedRoot(1.5, target); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + // - 1 pixel padding is rounded up to 1.3333; for both sides it is 2.6666 + // - Size of 101 gets rounded up to 101.3333 + // - Desired size = 101.3333 + 2.6666 = 104 + Assert.Equal(new Size(104, 104), target.DesiredSize); + } + + [Fact] + public void Measure_Rounds_BorderThickness() + { + var target = new ContentPresenter + { + BorderThickness = new Thickness(1), + Content = new Canvas + { + Width = 101, + Height = 101, + } + }; + + var root = CreatedRoot(1.5, target); + + root.LayoutManager.ExecuteInitialLayoutPass(); + + // - 1 pixel border thickness is rounded up to 1.3333; for both sides it is 2.6666 + // - Size of 101 gets rounded up to 101.3333 + // - Desired size = 101.3333 + 2.6666 = 104 + Assert.Equal(new Size(104, 104), target.DesiredSize); + } + + private static TestRoot CreatedRoot( + double scaling, + Control child, + Size? constraint = null) + { + return new TestRoot + { + LayoutScaling = scaling, + UseLayoutRounding = true, + Child = child, + ClientSize = constraint ?? new Size(1000, 1000), + }; + } + } } -} \ No newline at end of file +} diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs index 59276a94d0..f4001a8ca1 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs @@ -67,7 +67,7 @@ namespace Avalonia.Controls.UnitTests.Primitives target.Measure(new Size(100, 100)); target.Arrange(new Rect(0, 0, 100, 100)); - Assert.Equal(new Rect(33, 0, 33, 12), thumb.Bounds); + Assert.Equal(new Rect(33, 0, 34, 12), thumb.Bounds); } [Fact] @@ -92,7 +92,7 @@ namespace Avalonia.Controls.UnitTests.Primitives target.Measure(new Size(100, 100)); target.Arrange(new Rect(0, 0, 100, 100)); - Assert.Equal(new Rect(0, 33, 12, 33), thumb.Bounds); + Assert.Equal(new Rect(0, 33, 12, 34), thumb.Bounds); } [Fact] diff --git a/tests/Avalonia.Controls.UnitTests/Utils/HotKeyManagerTests.cs b/tests/Avalonia.Controls.UnitTests/Utils/HotKeyManagerTests.cs index 8d9a4aa599..e4d177f7ca 100644 --- a/tests/Avalonia.Controls.UnitTests/Utils/HotKeyManagerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Utils/HotKeyManagerTests.cs @@ -12,6 +12,7 @@ using Moq; using Xunit; using Avalonia.Input.Raw; using Factory = System.Func, Avalonia.Controls.Window, Avalonia.AvaloniaObject>; +using Avalonia.Threading; namespace Avalonia.Controls.UnitTests.Utils { @@ -60,115 +61,6 @@ namespace Avalonia.Controls.UnitTests.Utils } } - [Fact] - public void HotKeyManager_Should_Release_Reference_When_Control_Detached() - { - using (AvaloniaLocator.EnterScope()) - { - var styler = new Mock(); - - AvaloniaLocator.CurrentMutable - .Bind().ToConstant(new WindowingPlatformMock()) - .Bind().ToConstant(styler.Object); - - var gesture1 = new KeyGesture(Key.A, KeyModifiers.Control); - - WeakReference reference = null; - - var tl = new Window(); - - new Action(() => - { - var button = new Button(); - reference = new WeakReference(button, true); - tl.Content = button; - tl.Template = CreateWindowTemplate(); - tl.ApplyTemplate(); - tl.Presenter.ApplyTemplate(); - HotKeyManager.SetHotKey(button, gesture1); - - // Detach the button from the logical tree, so there is no reference to it - tl.Content = null; - tl.ApplyTemplate(); - })(); - - - // The button should be collected since it's detached from the listbox - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); - GC.WaitForPendingFinalizers(); - - Assert.Null(reference?.Target); - } - } - - [Fact] - public void HotKeyManager_Should_Release_Reference_When_Control_In_Item_Template_Detached() - { - using (UnitTestApplication.Start(TestServices.StyledWindow)) - { - var styler = new Mock(); - - AvaloniaLocator.CurrentMutable - .Bind().ToConstant(new WindowingPlatformMock()) - .Bind().ToConstant(styler.Object); - - var gesture1 = new KeyGesture(Key.A, KeyModifiers.Control); - - var weakReferences = new List(); - var tl = new Window { SizeToContent = SizeToContent.WidthAndHeight, IsVisible = true }; - var lm = tl.LayoutManager; - - var keyGestures = new AvaloniaList { gesture1 }; - var listBox = new ListBox - { - Width = 100, - Height = 100, - VirtualizationMode = ItemVirtualizationMode.None, - // Create a button with binding to the KeyGesture in the template and add it to references list - ItemTemplate = new FuncDataTemplate(typeof(KeyGesture), (o, scope) => - { - var keyGesture = o as KeyGesture; - var button = new Button - { - DataContext = keyGesture, [!Button.HotKeyProperty] = new Binding("") - }; - weakReferences.Add(new WeakReference(button, true)); - return button; - }) - }; - // Add the listbox and render it - tl.Content = listBox; - lm.ExecuteInitialLayoutPass(); - listBox.Items = keyGestures; - lm.ExecuteLayoutPass(); - - // Let the button detach when clearing the source items - keyGestures.Clear(); - lm.ExecuteLayoutPass(); - - // Add it again to double check,and render - keyGestures.Add(gesture1); - lm.ExecuteLayoutPass(); - - keyGestures.Clear(); - lm.ExecuteLayoutPass(); - - // The button should be collected since it's detached from the listbox - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); - GC.WaitForPendingFinalizers(); - - Assert.True(weakReferences.Count > 0); - foreach (var weakReference in weakReferences) - { - Assert.Null(weakReference.Target); - } - } - } - [Theory] [MemberData(nameof(ElementsFactory), parameters: true)] public void HotKeyManager_Should_Use_CommandParameter(string factoryName, Factory factory) diff --git a/tests/Avalonia.Controls.UnitTests/WindowTests.cs b/tests/Avalonia.Controls.UnitTests/WindowTests.cs index 63ccf74c2b..a8c9b68d12 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowTests.cs @@ -695,6 +695,31 @@ namespace Avalonia.Controls.UnitTests } } + [Fact] + public void Width_Height_Should_Not_Be_NaN_After_Show_With_SizeToContent_Manual() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var child = new Canvas + { + Width = 400, + Height = 800, + }; + + var target = new Window() + { + SizeToContent = SizeToContent.Manual, + Content = child + }; + + Show(target); + + // Values come from MockWindowingPlatform defaults. + Assert.Equal(800, target.Width); + Assert.Equal(600, target.Height); + } + } + [Fact] public void Width_Height_Should_Not_Be_NaN_After_Show_With_SizeToContent_WidthAndHeight() { @@ -712,6 +737,8 @@ namespace Avalonia.Controls.UnitTests Content = child }; + target.GetObservable(Window.WidthProperty).Subscribe(x => { }); + Show(target); Assert.Equal(400, target.Width); diff --git a/tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj b/tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj index 095f0e63e0..03d9332051 100644 --- a/tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj +++ b/tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj @@ -5,6 +5,10 @@ enable + + + + diff --git a/tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs b/tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs index 2ac859e091..6c630ae782 100644 --- a/tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs @@ -44,7 +44,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("Button with TextBlock", button.Text); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void ButtonWithAcceleratorKey() { var button = _session.FindElementByAccessibilityId("ButtonWithAcceleratorKey"); diff --git a/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs b/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs index fad3e1eb9f..abdb4e2dd8 100644 --- a/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs @@ -46,7 +46,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("Item 0", comboBox.GetComboBoxValue()); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Can_Change_Selection_With_Keyboard() { var comboBox = _session.FindElementByAccessibilityId("BasicComboBox"); @@ -63,7 +63,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("Item 1", comboBox.GetComboBoxValue()); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Can_Change_Selection_With_Keyboard_From_Unselected() { var comboBox = _session.FindElementByAccessibilityId("BasicComboBox"); @@ -80,7 +80,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("Item 0", comboBox.GetComboBoxValue()); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Can_Cancel_Keyboard_Selection_With_Escape() { var comboBox = _session.FindElementByAccessibilityId("BasicComboBox"); diff --git a/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs b/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs index 3eb8646835..4b361c6716 100644 --- a/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs +++ b/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs @@ -1,8 +1,12 @@ using System; using System.Collections.Generic; +using System.Linq; +using System.Reactive.Disposables; using System.Runtime.InteropServices; +using OpenQA.Selenium; using OpenQA.Selenium.Appium; using OpenQA.Selenium.Interactions; +using Xunit; namespace Avalonia.IntegrationTests.Appium { @@ -11,6 +15,19 @@ namespace Avalonia.IntegrationTests.Appium public static IReadOnlyList GetChildren(this AppiumWebElement element) => element.FindElementsByXPath("*/*"); + public static (AppiumWebElement close, AppiumWebElement minimize, AppiumWebElement maximize) GetChromeButtons(this AppiumWebElement window) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + var closeButton = window.FindElementByXPath("//XCUIElementTypeButton[1]"); + var fullscreenButton = window.FindElementByXPath("//XCUIElementTypeButton[2]"); + var minimizeButton = window.FindElementByXPath("//XCUIElementTypeButton[3]"); + return (closeButton, minimizeButton, fullscreenButton); + } + + throw new NotSupportedException("GetChromeButtons not supported on this platform."); + } + public static string GetComboBoxValue(this AppiumWebElement element) { return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? @@ -43,21 +60,82 @@ namespace Avalonia.IntegrationTests.Appium } } - public static void SendClick(this AppiumWebElement element) + /// + /// Clicks a button which is expected to open a new window. + /// + /// The button to click. + /// + /// An object which when disposed will cause the newly opened window to close. + /// + public static IDisposable OpenWindowWithClick(this AppiumWebElement element) { + var session = element.WrappedDriver; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { + var oldHandle = session.CurrentWindowHandle; + var oldHandles = session.WindowHandles.ToList(); + var oldChildWindows = session.FindElements(By.XPath("//Window")); + element.Click(); + + var newHandle = session.WindowHandles.Except(oldHandles).SingleOrDefault(); + + if (newHandle is not null) + { + // A new top-level window was opened. We need to switch to it. + session.SwitchTo().Window(newHandle); + + return Disposable.Create(() => + { + session.Close(); + session.SwitchTo().Window(oldHandle); + }); + } + else + { + // If a new window handle hasn't been added to the session then it's likely + // that a child window was opened. These don't appear in session.WindowHandles + // so we have to use an XPath query to get hold of it. + var newChildWindows = session.FindElements(By.XPath("//Window")); + var childWindow = Assert.Single(newChildWindows.Except(oldChildWindows)); + + return Disposable.Create(() => + { + childWindow.SendKeys(Keys.Alt + Keys.F4 + Keys.Alt); + }); + } } else { - // The Click() method seems to correspond to accessibilityPerformPress on macOS but certain controls - // such as list items don't support this action, so instead simulate a physical click as VoiceOver - // does. - new Actions(element.WrappedDriver).MoveToElement(element).Click().Perform(); + var oldWindows = session.FindElements(By.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow")); + var oldWindowTitles = oldWindows.ToDictionary(x => x.Text); + + element.Click(); + + var newWindows = session.FindElements(By.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow")); + var newWindowTitles = newWindows.ToDictionary(x => x.Text); + var newWindowTitle = Assert.Single(newWindowTitles.Keys.Except(oldWindowTitles.Keys)); + var newWindow = (AppiumWebElement)newWindowTitles[newWindowTitle]; + + return Disposable.Create(() => + { + // TODO: We should be able to use Cmd+W here but Avalonia apps don't seem to have this shortcut + // set up by default. + var (close, _, _) = newWindow.GetChromeButtons(); + close!.Click(); + }); } } + public static void SendClick(this AppiumWebElement element) + { + // The Click() method seems to correspond to accessibilityPerformPress on macOS but certain controls + // such as list items don't support this action, so instead simulate a physical click as VoiceOver + // does. On Windows, Click() seems to fail with the WindowState checkbox for some reason. + new Actions(element.WrappedDriver).MoveToElement(element).Click().Perform(); + } + public static void MovePointerOver(this AppiumWebElement element) { new Actions(element.WrappedDriver).MoveToElement(element).Perform(); diff --git a/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs b/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs index 625742ac20..e2943b3349 100644 --- a/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs @@ -61,7 +61,7 @@ namespace Avalonia.IntegrationTests.Appium } // appium-mac2-driver just hangs - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Can_Select_Range_By_Shift_Clicking() { var listBox = GetTarget(); diff --git a/tests/Avalonia.IntegrationTests.Appium/MenuTests.cs b/tests/Avalonia.IntegrationTests.Appium/MenuTests.cs index 98fb335061..d1d231466f 100644 --- a/tests/Avalonia.IntegrationTests.Appium/MenuTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/MenuTests.cs @@ -57,7 +57,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("_Grandchild", clickedMenuItem.Text); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Select_Child_With_Alt_Arrow_Keys() { new Actions(_session) @@ -69,7 +69,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("_Child 1", clickedMenuItem.Text); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Select_Grandchild_With_Alt_Arrow_Keys() { new Actions(_session) @@ -81,7 +81,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("_Grandchild", clickedMenuItem.Text); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Select_Child_With_Alt_Access_Keys() { new Actions(_session) @@ -93,7 +93,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("_Child 1", clickedMenuItem.Text); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Select_Grandchild_With_Alt_Access_Keys() { new Actions(_session) @@ -105,7 +105,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("_Grandchild", clickedMenuItem.Text); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Select_Child_With_Click_Arrow_Keys() { var rootMenuItem = _session.FindElementByAccessibilityId("RootMenuItem"); @@ -119,7 +119,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("_Child 1", clickedMenuItem.Text); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Select_Grandchild_With_Click_Arrow_Keys() { var rootMenuItem = _session.FindElementByAccessibilityId("RootMenuItem"); @@ -133,7 +133,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("_Grandchild", clickedMenuItem.Text); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void Child_AcceleratorKey() { var rootMenuItem = _session.FindElementByAccessibilityId("RootMenuItem"); @@ -145,7 +145,7 @@ namespace Avalonia.IntegrationTests.Appium Assert.Equal("Ctrl+O", childMenuItem.GetAttribute("AcceleratorKey")); } - [PlatformFact(SkipOnOSX = true)] + [PlatformFact(TestPlatforms.Windows)] public void PointerOver_Does_Not_Steal_Focus() { // Issue #7906 diff --git a/tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs b/tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs index fde01f0e41..7858c4cc81 100644 --- a/tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs +++ b/tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs @@ -17,7 +17,7 @@ namespace Avalonia.IntegrationTests.Appium tab.Click(); } - [PlatformFact(SkipOnWindows = true)] + [PlatformFact(TestPlatforms.MacOS)] public void View_Menu_Select_Button_Tab() { var tabs = _session.FindElementByAccessibilityId("MainTabs"); diff --git a/tests/Avalonia.IntegrationTests.Appium/PlatformFactAttribute.cs b/tests/Avalonia.IntegrationTests.Appium/PlatformFactAttribute.cs index 60338b92c2..53ae5d924f 100644 --- a/tests/Avalonia.IntegrationTests.Appium/PlatformFactAttribute.cs +++ b/tests/Avalonia.IntegrationTests.Appium/PlatformFactAttribute.cs @@ -5,21 +5,33 @@ using Xunit; namespace Avalonia.IntegrationTests.Appium { + [Flags] + internal enum TestPlatforms + { + Windows = 0x01, + MacOS = 0x02, + All = Windows | MacOS, + } + internal class PlatformFactAttribute : FactAttribute { + public PlatformFactAttribute(TestPlatforms platforms = TestPlatforms.All) => Platforms = platforms; + + public TestPlatforms Platforms { get; } + public override string? Skip { - get - { - if (SkipOnWindows && RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - return "Ignored on Windows"; - if (SkipOnOSX && RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - return "Ignored on MacOS"; - return null; - } + get => IsSupported() ? null : $"Ignored on {RuntimeInformation.OSDescription}"; set => throw new NotSupportedException(); } - public bool SkipOnOSX { get; set; } - public bool SkipOnWindows { get; set; } + + private bool IsSupported() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + return Platforms.HasAnyFlag(TestPlatforms.Windows); + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + return Platforms.HasAnyFlag(TestPlatforms.MacOS); + return false; + } } } diff --git a/tests/Avalonia.IntegrationTests.Appium/PlatformTheoryAttribute.cs b/tests/Avalonia.IntegrationTests.Appium/PlatformTheoryAttribute.cs new file mode 100644 index 0000000000..7ac30ee11b --- /dev/null +++ b/tests/Avalonia.IntegrationTests.Appium/PlatformTheoryAttribute.cs @@ -0,0 +1,29 @@ +using System; +using System.Linq; +using System.Runtime.InteropServices; +using Xunit; + +namespace Avalonia.IntegrationTests.Appium +{ + internal class PlatformTheoryAttribute : TheoryAttribute + { + public PlatformTheoryAttribute(TestPlatforms platforms = TestPlatforms.All) => Platforms = platforms; + + public TestPlatforms Platforms { get; } + + public override string? Skip + { + get => IsSupported() ? null : $"Ignored on {RuntimeInformation.OSDescription}"; + set => throw new NotSupportedException(); + } + + private bool IsSupported() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + return Platforms.HasAnyFlag(TestPlatforms.Windows); + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + return Platforms.HasAnyFlag(TestPlatforms.MacOS); + return false; + } + } +} diff --git a/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs b/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs new file mode 100644 index 0000000000..2b10c302bc --- /dev/null +++ b/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs @@ -0,0 +1,217 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading; +using Avalonia.Controls; +using OpenQA.Selenium.Appium; +using OpenQA.Selenium.Interactions; +using Xunit; +using Xunit.Sdk; + +namespace Avalonia.IntegrationTests.Appium +{ + [Collection("Default")] + public class WindowTests + { + private readonly AppiumDriver _session; + + public WindowTests(TestAppFixture fixture) + { + _session = fixture.Session; + + var tabs = _session.FindElementByAccessibilityId("MainTabs"); + var tab = tabs.FindElementByName("Window"); + tab.Click(); + } + + [Theory] + [MemberData(nameof(StartupLocationData))] + public void StartupLocation(Size? size, ShowWindowMode mode, WindowStartupLocation location) + { + using var window = OpenWindow(size, mode, location); + var info = GetWindowInfo(); + + if (size.HasValue) + Assert.Equal(size.Value, info.ClientSize); + + Assert.True(info.FrameSize.Width >= info.ClientSize.Width, "Expected frame width >= client width."); + Assert.True(info.FrameSize.Height > info.ClientSize.Height, "Expected frame height > client height."); + + var frameRect = new PixelRect(info.Position, PixelSize.FromSize(info.FrameSize, info.Scaling)); + + switch (location) + { + case WindowStartupLocation.CenterScreen: + { + var expected = info.ScreenRect.CenterRect(frameRect); + AssertCloseEnough(expected.Position, frameRect.Position); + break; + } + case WindowStartupLocation.CenterOwner: + { + Assert.NotNull(info.OwnerRect); + var expected = info.OwnerRect!.Value.CenterRect(frameRect); + AssertCloseEnough(expected.Position, frameRect.Position); + break; + } + } + } + + + [Theory] + [InlineData(ShowWindowMode.NonOwned)] + [InlineData(ShowWindowMode.Owned)] + [InlineData(ShowWindowMode.Modal)] + public void WindowState(ShowWindowMode mode) + { + using var window = OpenWindow(null, mode, WindowStartupLocation.Manual); + var windowState = _session.FindElementByAccessibilityId("WindowState"); + var original = GetWindowInfo(); + + Assert.Equal("Normal", windowState.GetComboBoxValue()); + + windowState.Click(); + _session.FindElementByName("Maximized").SendClick(); + Assert.Equal("Maximized", windowState.GetComboBoxValue()); + + windowState.Click(); + _session.FindElementByName("Normal").SendClick(); + + var current = GetWindowInfo(); + Assert.Equal(original.Position, current.Position); + Assert.Equal(original.FrameSize, current.FrameSize); + + // On macOS, only non-owned windows can go fullscreen. + if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || mode == ShowWindowMode.NonOwned) + { + windowState.Click(); + _session.FindElementByName("Fullscreen").SendClick(); + Assert.Equal("Fullscreen", windowState.GetComboBoxValue()); + + current = GetWindowInfo(); + var clientSize = PixelSize.FromSize(current.ClientSize, current.Scaling); + Assert.True(clientSize.Width >= current.ScreenRect.Width); + Assert.True(clientSize.Height >= current.ScreenRect.Height); + + windowState.Click(); + _session.FindElementByName("Normal").SendClick(); + + current = GetWindowInfo(); + Assert.Equal(original.Position, current.Position); + Assert.Equal(original.FrameSize, current.FrameSize); + } + } + + public static TheoryData StartupLocationData() + { + var sizes = new Size?[] { null, new Size(400, 300) }; + var data = new TheoryData(); + + foreach (var size in sizes) + { + foreach (var mode in Enum.GetValues()) + { + foreach (var location in Enum.GetValues()) + { + if (!(location == WindowStartupLocation.CenterOwner && mode == ShowWindowMode.NonOwned)) + { + data.Add(size, mode, location); + } + } + } + } + + return data; + } + + private static void AssertCloseEnough(PixelPoint expected, PixelPoint actual) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + // On win32, accurate frame information cannot be obtained until a window is shown but + // WindowStartupLocation needs to be calculated before the window is shown, meaning that + // the position of a centered window can be off by a bit. From initial testing, looks + // like this shouldn't be more than 10 pixels. + if (Math.Abs(expected.X - actual.X) > 10) + throw new EqualException(expected, actual); + if (Math.Abs(expected.Y - actual.Y) > 10) + throw new EqualException(expected, actual); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + if (Math.Abs(expected.X - actual.X) > 15) + throw new EqualException(expected, actual); + if (Math.Abs(expected.Y - actual.Y) > 15) + throw new EqualException(expected, actual); + } + else + { + Assert.Equal(expected, actual); + } + } + + private IDisposable OpenWindow(Size? size, ShowWindowMode mode, WindowStartupLocation location) + { + var sizeTextBox = _session.FindElementByAccessibilityId("ShowWindowSize"); + var modeComboBox = _session.FindElementByAccessibilityId("ShowWindowMode"); + var locationComboBox = _session.FindElementByAccessibilityId("ShowWindowLocation"); + var showButton = _session.FindElementByAccessibilityId("ShowWindow"); + + if (size.HasValue) + sizeTextBox.SendKeys($"{size.Value.Width}, {size.Value.Height}"); + + modeComboBox.Click(); + _session.FindElementByName(mode.ToString()).SendClick(); + + locationComboBox.Click(); + _session.FindElementByName(location.ToString()).SendClick(); + + return showButton.OpenWindowWithClick(); + } + + private WindowInfo GetWindowInfo() + { + PixelRect? ReadOwnerRect() + { + var text = _session.FindElementByAccessibilityId("OwnerRect").Text; + return !string.IsNullOrWhiteSpace(text) ? PixelRect.Parse(text) : null; + } + + var retry = 0; + + for (;;) + { + try + { + return new( + Size.Parse(_session.FindElementByAccessibilityId("ClientSize").Text), + Size.Parse(_session.FindElementByAccessibilityId("FrameSize").Text), + PixelPoint.Parse(_session.FindElementByAccessibilityId("Position").Text), + ReadOwnerRect(), + PixelRect.Parse(_session.FindElementByAccessibilityId("ScreenRect").Text), + double.Parse(_session.FindElementByAccessibilityId("Scaling").Text)); + } + catch (OpenQA.Selenium.NoSuchElementException e) when (retry++ < 3) + { + // MacOS sometimes seems to need a bit of time to get itself back in order after switching out + // of fullscreen. + Thread.Sleep(1000); + } + } + } + + public enum ShowWindowMode + { + NonOwned, + Owned, + Modal + } + + private record WindowInfo( + Size ClientSize, + Size FrameSize, + PixelPoint Position, + PixelRect? OwnerRect, + PixelRect ScreenRect, + double Scaling); + } +} diff --git a/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs b/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs new file mode 100644 index 0000000000..15ca78fdac --- /dev/null +++ b/tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs @@ -0,0 +1,254 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using Avalonia.Controls; +using OpenQA.Selenium; +using OpenQA.Selenium.Appium; +using OpenQA.Selenium.Interactions; +using Xunit; + +namespace Avalonia.IntegrationTests.Appium +{ + [Collection("Default")] + public class WindowTests_MacOS + { + private readonly AppiumDriver _session; + + public WindowTests_MacOS(TestAppFixture fixture) + { + var retry = 0; + + _session = fixture.Session; + + for (;;) + { + try + { + var tabs = _session.FindElementByAccessibilityId("MainTabs"); + var tab = tabs.FindElementByName("Window"); + tab.Click(); + return; + } + catch (WebDriverException e) when (retry++ < 3) + { + // MacOS sometimes seems to need a bit of time to get itself back in order after switching out + // of fullscreen. + Thread.Sleep(1000); + } + } + + } + + [PlatformFact(TestPlatforms.MacOS)] + public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent() + { + var mainWindow = _session.FindElementByAccessibilityId("MainWindow"); + + using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.Manual)) + { + mainWindow.Click(); + + var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow")); + var mainWindowIndex = GetWindowOrder(windows, "MainWindow"); + var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow"); + + Assert.Equal(0, secondaryWindowIndex); + Assert.Equal(1, mainWindowIndex); + } + } + + [PlatformFact(TestPlatforms.MacOS)] + public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_Clicking_Resize_Grip() + { + var mainWindow = FindWindow(_session, "MainWindow"); + + using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.Manual)) + { + new Actions(_session) + .MoveToElement(mainWindow, 100, 1) + .ClickAndHold() + .Perform(); + + var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow")); + var mainWindowIndex = GetWindowOrder(windows, "MainWindow"); + var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow"); + + new Actions(_session) + .MoveToElement(mainWindow, 100, 1) + .Release() + .Perform(); + + Assert.Equal(0, secondaryWindowIndex); + Assert.Equal(1, mainWindowIndex); + } + } + + [PlatformFact(TestPlatforms.MacOS)] + public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_In_Fullscreen() + { + var mainWindow = FindWindow(_session, "MainWindow"); + var buttons = mainWindow.GetChromeButtons(); + + buttons.maximize.Click(); + + Thread.Sleep(500); + + try + { + using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.Manual)) + { + var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow")); + var mainWindowIndex = GetWindowOrder(windows, "MainWindow"); + var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow"); + + Assert.Equal(0, secondaryWindowIndex); + Assert.Equal(1, mainWindowIndex); + + Thread.Sleep(5000); + } + } + finally + { + _session.FindElementByAccessibilityId("ExitFullscreen").Click(); + } + } + + [PlatformFact(TestPlatforms.MacOS)] + public void WindowOrder_Owned_Dialog_Stays_InFront_Of_Parent() + { + var mainWindow = _session.FindElementByAccessibilityId("MainWindow"); + + using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Owned, WindowStartupLocation.Manual)) + { + mainWindow.Click(); + + var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow")); + var mainWindowIndex = GetWindowOrder(windows, "MainWindow"); + var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow"); + + Assert.Equal(0, secondaryWindowIndex); + Assert.Equal(1, mainWindowIndex); + } + } + + [PlatformFact(TestPlatforms.MacOS)] + public void WindowOrder_NonOwned_Window_Does_Not_Stay_InFront_Of_Parent() + { + var mainWindow = _session.FindElementByAccessibilityId("MainWindow"); + + using (OpenWindow(new PixelSize(1400, 100), ShowWindowMode.NonOwned, WindowStartupLocation.Manual)) + { + mainWindow.Click(); + + var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow")); + var mainWindowIndex = GetWindowOrder(windows, "MainWindow"); + var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow"); + + Assert.Equal(1, secondaryWindowIndex); + Assert.Equal(0, mainWindowIndex); + + var sendToBack = _session.FindElementByAccessibilityId("SendToBack"); + sendToBack.Click(); + } + } + + [PlatformFact(TestPlatforms.MacOS)] + public void Parent_Window_Has_Disabled_ChromeButtons_When_Modal_Dialog_Shown() + { + var window = FindWindow(_session, "MainWindow"); + var (closeButton, miniaturizeButton, zoomButton) = window.GetChromeButtons(); + + Assert.True(closeButton.Enabled); + Assert.True(zoomButton.Enabled); + Assert.True(miniaturizeButton.Enabled); + + using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner)) + { + Assert.False(closeButton.Enabled); + Assert.False(zoomButton.Enabled); + Assert.False(miniaturizeButton.Enabled); + } + } + + [PlatformFact(TestPlatforms.MacOS)] + public void Minimize_Button_Is_Disabled_On_Modal_Dialog() + { + using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner)) + { + var secondaryWindow = FindWindow(_session, "SecondaryWindow"); + var (closeButton, miniaturizeButton, zoomButton) = secondaryWindow.GetChromeButtons(); + + Assert.True(closeButton.Enabled); + Assert.True(zoomButton.Enabled); + Assert.False(miniaturizeButton.Enabled); + } + } + + [PlatformTheory(TestPlatforms.MacOS)] + [InlineData(ShowWindowMode.NonOwned)] + [InlineData(ShowWindowMode.Owned)] + public void Minimize_Button_Minimizes_Window(ShowWindowMode mode) + { + using (OpenWindow(new PixelSize(200, 100), mode, WindowStartupLocation.Manual)) + { + var secondaryWindow = FindWindow(_session, "SecondaryWindow"); + var (_, miniaturizeButton, _) = secondaryWindow.GetChromeButtons(); + + miniaturizeButton.Click(); + Thread.Sleep(1000); + + var hittable = _session.FindElementsByXPath("/XCUIElementTypeApplication/XCUIElementTypeWindow") + .Select(x => x.GetAttribute("hittable")).ToList(); + Assert.Equal(new[] { "true", "false" }, hittable); + + _session.FindElementByAccessibilityId("RestoreAll").Click(); + Thread.Sleep(1000); + + hittable = _session.FindElementsByXPath("/XCUIElementTypeApplication/XCUIElementTypeWindow") + .Select(x => x.GetAttribute("hittable")).ToList(); + Assert.Equal(new[] { "true", "true" }, hittable); + } + } + + private IDisposable OpenWindow(PixelSize? size, ShowWindowMode mode, WindowStartupLocation location) + { + var sizeTextBox = _session.FindElementByAccessibilityId("ShowWindowSize"); + var modeComboBox = _session.FindElementByAccessibilityId("ShowWindowMode"); + var locationComboBox = _session.FindElementByAccessibilityId("ShowWindowLocation"); + var showButton = _session.FindElementByAccessibilityId("ShowWindow"); + + if (size.HasValue) + sizeTextBox.SendKeys($"{size.Value.Width}, {size.Value.Height}"); + + modeComboBox.Click(); + _session.FindElementByName(mode.ToString()).SendClick(); + + locationComboBox.Click(); + _session.FindElementByName(location.ToString()).SendClick(); + + return showButton.OpenWindowWithClick(); + } + + private static int GetWindowOrder(IReadOnlyCollection elements, string identifier) + { + return elements.TakeWhile(x => + x.FindElementByXPath("XCUIElementTypeWindow")?.GetAttribute("identifier") != identifier).Count(); + } + + private static AppiumWebElement FindWindow(AppiumDriver session, string identifier) + { + var windows = session.FindElementsByXPath("XCUIElementTypeWindow"); + return windows.First(x => + x.FindElementsByXPath("XCUIElementTypeWindow") + .Any(y => y.GetAttribute("identifier") == identifier)); + } + + public enum ShowWindowMode + { + NonOwned, + Owned, + Modal + } + } +} diff --git a/tests/Avalonia.IntegrationTests.Appium/macos-clean-build-test.sh b/tests/Avalonia.IntegrationTests.Appium/macos-clean-build-test.sh new file mode 100755 index 0000000000..30a4a79f4a --- /dev/null +++ b/tests/Avalonia.IntegrationTests.Appium/macos-clean-build-test.sh @@ -0,0 +1,8 @@ +# Cleans, builds, and runs integration tests on macOS. +# Can be used by `git bisect run` to automatically find the commit which introduced a problem. +SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd) +cd "$SCRIPT_DIR"/../.. || exit +git clean -xdf +./build.sh CompileNative +./samples/IntegrationTestApp/bundle.sh +dotnet test tests/Avalonia.IntegrationTests.Appium/ -l "console;verbosity=detailed" diff --git a/tests/Avalonia.LeakTests/ControlTests.cs b/tests/Avalonia.LeakTests/ControlTests.cs index bb520c16aa..8c05f2a0a7 100644 --- a/tests/Avalonia.LeakTests/ControlTests.cs +++ b/tests/Avalonia.LeakTests/ControlTests.cs @@ -3,7 +3,10 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reactive.Disposables; + +using Avalonia.Collections; using Avalonia.Controls; +using Avalonia.Controls.Presenters; using Avalonia.Controls.Shapes; using Avalonia.Controls.Templates; using Avalonia.Data; @@ -67,6 +70,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); } @@ -100,6 +106,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); } @@ -141,6 +150,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); } @@ -179,6 +191,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); dotMemory.Check(memory => @@ -216,6 +231,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); } @@ -261,6 +279,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); dotMemory.Check(memory => @@ -351,6 +372,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); } @@ -384,6 +408,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); } @@ -421,6 +448,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); } @@ -496,6 +526,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); } @@ -536,9 +569,12 @@ namespace Avalonia.LeakTests initialMenuCount = memory.GetObjects(where => where.Type.Is()).ObjectsCount; initialMenuItemCount = memory.GetObjects(where => where.Type.Is()).ObjectsCount; }); - + AttachShowAndDetachContextMenu(window); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Mock.Get(window.PlatformImpl).Invocations.Clear(); dotMemory.Check(memory => Assert.Equal(initialMenuCount, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); @@ -580,10 +616,13 @@ namespace Avalonia.LeakTests initialMenuCount = memory.GetObjects(where => where.Type.Is()).ObjectsCount; initialMenuItemCount = memory.GetObjects(where => where.Type.Is()).ObjectsCount; }); - + BuildAndShowContextMenu(window); BuildAndShowContextMenu(window); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Mock.Get(window.PlatformImpl).Invocations.Clear(); dotMemory.Check(memory => Assert.Equal(initialMenuCount, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); @@ -623,6 +662,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); @@ -657,6 +699,9 @@ namespace Avalonia.LeakTests var result = run(); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); } @@ -725,14 +770,128 @@ namespace Avalonia.LeakTests Assert.Empty(lb.ItemContainerGenerator.Containers); + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + dotMemory.Check(memory => Assert.Equal(0, memory.GetObjects(where => where.Type.Is()).ObjectsCount)); } } + [Fact] + public void HotKeyManager_Should_Release_Reference_When_Control_Detached() + { + using (Start()) + { + Func run = () => + { + var gesture1 = new KeyGesture(Key.A, KeyModifiers.Control); + var tl = new Window + { + Content = new ItemsRepeater(), + }; + + tl.Show(); + + var button = new Button(); + tl.Content = button; + tl.Template = CreateWindowTemplate(); + tl.ApplyTemplate(); + tl.Presenter.ApplyTemplate(); + HotKeyManager.SetHotKey(button, gesture1); + + // Detach the button from the logical tree, so there is no reference to it + tl.Content = null; + tl.ApplyTemplate(); + + return tl; + }; + + var result = run(); + + // Process all Loaded events to free control reference(s) + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + + dotMemory.Check(memory => + Assert.Equal(0, memory.GetObjects(where => where.Type.Is