diff --git a/DEPS b/DEPS index 507ebe0c..eaaca04 100644 --- a/DEPS +++ b/DEPS
@@ -59,7 +59,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '0c92bed7ade20fe193dce0a481dad48e1be41622', + 'pdfium_revision': '93181f9a20db7ac706bb9405750303db93762a5b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other.
diff --git a/blimp/client/compositor/blimp_layer_tree_settings.cc b/blimp/client/compositor/blimp_layer_tree_settings.cc index 029e328..e80becd1 100644 --- a/blimp/client/compositor/blimp_layer_tree_settings.cc +++ b/blimp/client/compositor/blimp_layer_tree_settings.cc
@@ -66,12 +66,13 @@ settings->renderer_settings.highp_threshold_min = 2048; settings->ignore_root_layer_flings = false; bool use_low_memory_policy = base::SysInfo::IsLowEndDevice(); - settings->renderer_settings.use_rgba_4444_textures = use_low_memory_policy; if (use_low_memory_policy) { // On low-end we want to be very carefull about killing other // apps. So initially we use 50% more memory to avoid flickering // or raster-on-demand. settings->max_memory_for_prepaint_percentage = 67; + + settings->renderer_settings.preferred_tile_format = cc::RGBA_4444; } else { // On other devices we have increased memory excessively to avoid // raster-on-demand already, so now we reserve 50% _only_ to avoid
diff --git a/cc/base/switches.cc b/cc/base/switches.cc index 9cf6d5c..e73d17a 100644 --- a/cc/base/switches.cc +++ b/cc/base/switches.cc
@@ -50,6 +50,9 @@ const char kEnablePropertyTreeVerification[] = "enable-property-tree-verification"; +// Compress tile textures for GPUs supporting it. +const char kEnableTileCompression[] = "enable-tile-compression"; + // Use a BeginFrame signal from browser to renderer to schedule rendering. const char kEnableBeginFrameScheduling[] = "enable-begin-frame-scheduling";
diff --git a/cc/base/switches.h b/cc/base/switches.h index d8c67170..52da2c7 100644 --- a/cc/base/switches.h +++ b/cc/base/switches.h
@@ -26,6 +26,7 @@ CC_EXPORT extern const char kSlowDownRasterScaleFactor[]; CC_EXPORT extern const char kStrictLayerPropertyChangeChecking[]; CC_EXPORT extern const char kEnablePropertyTreeVerification[]; +CC_EXPORT extern const char kEnableTileCompression[]; // Switches for both the renderer and ui compositors. CC_EXPORT extern const char kEnableBeginFrameScheduling[];
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index 405d685..f547648 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc
@@ -48,6 +48,10 @@ // of using the same tile size. const int kTileRoundUp = 64; +// For performance reasons and to support compressed tile textures, tile +// width and height should be an even multiple of 4 in size. +const int kTileMinimalAlignment = 4; + } // namespace namespace cc { @@ -767,6 +771,10 @@ tile_height = std::min(tile_height, default_tile_height); } + // Ensure that tile width and height are properly aligned. + tile_width = MathUtil::UncheckedRoundUp(tile_width, kTileMinimalAlignment); + tile_height = MathUtil::UncheckedRoundUp(tile_height, kTileMinimalAlignment); + // Under no circumstance should we be larger than the max texture size. tile_width = std::min(tile_width, max_texture_size); tile_height = std::min(tile_height, max_texture_size);
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc index 1839690c..a437074 100644 --- a/cc/layers/picture_layer_impl_unittest.cc +++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -4984,8 +4984,10 @@ layer->set_gpu_raster_max_texture_size(host_impl_.device_viewport_size()); result = layer->CalculateTileSize(gfx::Size(10000, 10000)); - EXPECT_EQ(result.width(), 2000 + 2 * PictureLayerTiling::kBorderTexels); - EXPECT_EQ(result.height(), 500 + 2); + EXPECT_EQ(result.width(), + MathUtil::UncheckedRoundUp( + 2000 + 2 * PictureLayerTiling::kBorderTexels, 4)); + EXPECT_EQ(result.height(), 504); // 500 + 2, 4-byte aligned. // Clamp and round-up, when smaller than viewport. // Tile-height doubles to 50% when width shrinks to <= 50%. @@ -4993,7 +4995,7 @@ layer->set_gpu_raster_max_texture_size(host_impl_.device_viewport_size()); result = layer->CalculateTileSize(gfx::Size(447, 10000)); EXPECT_EQ(result.width(), 448); - EXPECT_EQ(result.height(), 500 + 2); + EXPECT_EQ(result.height(), 504); // 500 + 2, 4-byte aliged. // Largest layer is 50% of viewport width (rounded up), and // 50% of viewport in height. @@ -5002,7 +5004,7 @@ EXPECT_EQ(result.height(), 448); result = layer->CalculateTileSize(gfx::Size(500, 499)); EXPECT_EQ(result.width(), 512); - EXPECT_EQ(result.height(), 500 + 2); + EXPECT_EQ(result.height(), 504); // 500 + 2, 4-byte aligned. } TEST_F(NoLowResPictureLayerImplTest, LowResWasHighResCollision) {
diff --git a/cc/output/renderer_settings.cc b/cc/output/renderer_settings.cc index da79a48..4c747101 100644 --- a/cc/output/renderer_settings.cc +++ b/cc/output/renderer_settings.cc
@@ -8,6 +8,7 @@ #include "base/logging.h" #include "cc/proto/renderer_settings.pb.h" +#include "cc/resources/platform_color.h" namespace cc { @@ -22,9 +23,9 @@ delay_releasing_overlay_resources(false), refresh_rate(60.0), highp_threshold_min(0), - use_rgba_4444_textures(false), texture_id_allocation_chunk_size(64), - use_gpu_memory_buffer_resources(false) {} + use_gpu_memory_buffer_resources(false), + preferred_tile_format(PlatformColor::BestTextureFormat()) {} RendererSettings::~RendererSettings() { } @@ -41,9 +42,9 @@ delay_releasing_overlay_resources); proto->set_refresh_rate(refresh_rate); proto->set_highp_threshold_min(highp_threshold_min); - proto->set_use_rgba_4444_textures(use_rgba_4444_textures); proto->set_texture_id_allocation_chunk_size(texture_id_allocation_chunk_size); proto->set_use_gpu_memory_buffer_resources(use_gpu_memory_buffer_resources); + proto->set_preferred_tile_format(preferred_tile_format); } void RendererSettings::FromProtobuf(const proto::RendererSettings& proto) { @@ -57,9 +58,13 @@ delay_releasing_overlay_resources = proto.delay_releasing_overlay_resources(); refresh_rate = proto.refresh_rate(); highp_threshold_min = proto.highp_threshold_min(); - use_rgba_4444_textures = proto.use_rgba_4444_textures(); texture_id_allocation_chunk_size = proto.texture_id_allocation_chunk_size(); use_gpu_memory_buffer_resources = proto.use_gpu_memory_buffer_resources(); + + DCHECK_LE(proto.preferred_tile_format(), + static_cast<uint32_t>(RESOURCE_FORMAT_MAX)); + preferred_tile_format = + static_cast<ResourceFormat>(proto.preferred_tile_format()); } bool RendererSettings::operator==(const RendererSettings& other) const { @@ -74,11 +79,11 @@ other.delay_releasing_overlay_resources && refresh_rate == other.refresh_rate && highp_threshold_min == other.highp_threshold_min && - use_rgba_4444_textures == other.use_rgba_4444_textures && texture_id_allocation_chunk_size == other.texture_id_allocation_chunk_size && use_gpu_memory_buffer_resources == - other.use_gpu_memory_buffer_resources; + other.use_gpu_memory_buffer_resources && + preferred_tile_format == other.preferred_tile_format; } } // namespace cc
diff --git a/cc/output/renderer_settings.h b/cc/output/renderer_settings.h index 4910a25..3d7bf10 100644 --- a/cc/output/renderer_settings.h +++ b/cc/output/renderer_settings.h
@@ -7,6 +7,7 @@ #include "base/basictypes.h" #include "cc/base/cc_export.h" +#include "cc/resources/resource_format.h" namespace cc { @@ -29,9 +30,9 @@ bool delay_releasing_overlay_resources; double refresh_rate; int highp_threshold_min; - bool use_rgba_4444_textures; size_t texture_id_allocation_chunk_size; bool use_gpu_memory_buffer_resources; + ResourceFormat preferred_tile_format; void ToProtobuf(proto::RendererSettings* proto) const; void FromProtobuf(const proto::RendererSettings& proto);
diff --git a/cc/output/renderer_settings_unittest.cc b/cc/output/renderer_settings_unittest.cc index b7febd41..40d4f072 100644 --- a/cc/output/renderer_settings_unittest.cc +++ b/cc/output/renderer_settings_unittest.cc
@@ -30,9 +30,9 @@ settings.delay_releasing_overlay_resources = true; settings.refresh_rate = 6.0; settings.highp_threshold_min = 1; - settings.use_rgba_4444_textures = true; settings.texture_id_allocation_chunk_size = 46; settings.use_gpu_memory_buffer_resources = true; + settings.preferred_tile_format = RGBA_4444; VerifySerializeAndDeserializeProto(settings); } @@ -48,9 +48,9 @@ settings.delay_releasing_overlay_resources = true; settings.refresh_rate = 999.0; settings.highp_threshold_min = 1; - settings.use_rgba_4444_textures = true; settings.texture_id_allocation_chunk_size = 12; settings.use_gpu_memory_buffer_resources = true; + settings.preferred_tile_format = RGBA_4444; VerifySerializeAndDeserializeProto(settings); }
diff --git a/cc/proto/renderer_settings.proto b/cc/proto/renderer_settings.proto index 6666f500..ab6c4c1 100644 --- a/cc/proto/renderer_settings.proto +++ b/cc/proto/renderer_settings.proto
@@ -19,7 +19,7 @@ optional bool delay_releasing_overlay_resources = 8; optional double refresh_rate = 9; optional uint32 highp_threshold_min = 10; - optional bool use_rgba_4444_textures = 11; - optional uint32 texture_id_allocation_chunk_size = 12; - optional bool use_gpu_memory_buffer_resources = 13; + optional uint32 texture_id_allocation_chunk_size = 11; + optional bool use_gpu_memory_buffer_resources = 12; + optional uint32 preferred_tile_format = 13; }
diff --git a/cc/raster/one_copy_tile_task_worker_pool.cc b/cc/raster/one_copy_tile_task_worker_pool.cc index 28677343..c7b07b7 100644 --- a/cc/raster/one_copy_tile_task_worker_pool.cc +++ b/cc/raster/one_copy_tile_task_worker_pool.cc
@@ -181,11 +181,11 @@ int max_copy_texture_chromium_size, bool use_partial_raster, int max_staging_buffer_usage_in_bytes, - bool use_rgba_4444_texture_format) { + ResourceFormat preferred_tile_format) { return make_scoped_ptr<TileTaskWorkerPool>(new OneCopyTileTaskWorkerPool( task_runner, task_graph_runner, resource_provider, max_copy_texture_chromium_size, use_partial_raster, - max_staging_buffer_usage_in_bytes, use_rgba_4444_texture_format)); + max_staging_buffer_usage_in_bytes, preferred_tile_format)); } OneCopyTileTaskWorkerPool::OneCopyTileTaskWorkerPool( @@ -195,7 +195,7 @@ int max_copy_texture_chromium_size, bool use_partial_raster, int max_staging_buffer_usage_in_bytes, - bool use_rgba_4444_texture_format) + ResourceFormat preferred_tile_format) : task_runner_(task_runner), task_graph_runner_(task_graph_runner), namespace_token_(task_graph_runner->GetNamespaceToken()), @@ -208,7 +208,7 @@ use_partial_raster_(use_partial_raster), bytes_scheduled_since_last_flush_(0), max_staging_buffer_usage_in_bytes_(max_staging_buffer_usage_in_bytes), - use_rgba_4444_texture_format_(use_rgba_4444_texture_format), + preferred_tile_format_(preferred_tile_format), staging_buffer_usage_in_bytes_(0), free_staging_buffer_usage_in_bytes_(0), staging_buffer_expiration_delay_( @@ -281,9 +281,13 @@ ResourceFormat OneCopyTileTaskWorkerPool::GetResourceFormat( bool must_support_alpha) const { - return use_rgba_4444_texture_format_ - ? RGBA_4444 - : resource_provider_->best_texture_format(); + if (resource_provider_->IsResourceFormatSupported(preferred_tile_format_) && + (DoesResourceFormatSupportAlpha(preferred_tile_format_) || + !must_support_alpha)) { + return preferred_tile_format_; + } + + return resource_provider_->best_texture_format(); } bool OneCopyTileTaskWorkerPool::GetResourceRequiresSwizzle( @@ -427,32 +431,41 @@ #endif } - int bytes_per_row = - (BitsPerPixel(resource->format()) * resource->size().width()) / 8; - int chunk_size_in_rows = - std::max(1, max_bytes_per_copy_operation_ / bytes_per_row); - // Align chunk size to 4. Required to support compressed texture formats. - chunk_size_in_rows = MathUtil::UncheckedRoundUp(chunk_size_in_rows, 4); - int y = 0; - int height = resource->size().height(); - while (y < height) { - // Copy at most |chunk_size_in_rows|. - int rows_to_copy = std::min(chunk_size_in_rows, height - y); - DCHECK_GT(rows_to_copy, 0); + // Since compressed texture's cannot be pre-allocated we might have an + // unallocated resource in which case we need to perform a full size copy. + if (IsResourceFormatCompressed(resource->format())) { + gl->CompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, + staging_buffer->texture_id, + resource_lock->texture_id()); + } else { + int bytes_per_row = + (BitsPerPixel(resource->format()) * resource->size().width()) / 8; + int chunk_size_in_rows = + std::max(1, max_bytes_per_copy_operation_ / bytes_per_row); + // Align chunk size to 4. Required to support compressed texture formats. + chunk_size_in_rows = MathUtil::UncheckedRoundUp(chunk_size_in_rows, 4); + int y = 0; + int height = resource->size().height(); + while (y < height) { + // Copy at most |chunk_size_in_rows|. + int rows_to_copy = std::min(chunk_size_in_rows, height - y); + DCHECK_GT(rows_to_copy, 0); - gl->CopySubTextureCHROMIUM(GL_TEXTURE_2D, staging_buffer->texture_id, - resource_lock->texture_id(), 0, y, 0, y, - resource->size().width(), rows_to_copy, false, - false, false); - y += rows_to_copy; + gl->CopySubTextureCHROMIUM(GL_TEXTURE_2D, staging_buffer->texture_id, + resource_lock->texture_id(), 0, y, 0, y, + resource->size().width(), rows_to_copy, + false, false, false); + y += rows_to_copy; - // Increment |bytes_scheduled_since_last_flush_| by the amount of memory - // used for this copy operation. - bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row; + // Increment |bytes_scheduled_since_last_flush_| by the amount of memory + // used for this copy operation. + bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row; - if (bytes_scheduled_since_last_flush_ >= max_bytes_per_copy_operation_) { - gl->ShallowFlushCHROMIUM(); - bytes_scheduled_since_last_flush_ = 0; + if (bytes_scheduled_since_last_flush_ >= + max_bytes_per_copy_operation_) { + gl->ShallowFlushCHROMIUM(); + bytes_scheduled_since_last_flush_ = 0; + } } }
diff --git a/cc/raster/one_copy_tile_task_worker_pool.h b/cc/raster/one_copy_tile_task_worker_pool.h index 8dc861f..8ba2516 100644 --- a/cc/raster/one_copy_tile_task_worker_pool.h +++ b/cc/raster/one_copy_tile_task_worker_pool.h
@@ -50,7 +50,7 @@ int max_copy_texture_chromium_size, bool use_partial_raster, int max_staging_buffer_usage_in_bytes, - bool use_rgba_4444_texture_format); + ResourceFormat preferred_tile_format); // Overridden from TileTaskWorkerPool: TileTaskRunner* AsTileTaskRunner() override; @@ -92,7 +92,7 @@ int max_copy_texture_chromium_size, bool use_partial_raster, int max_staging_buffer_usage_in_bytes, - bool use_rgba_4444_texture_format); + ResourceFormat preferred_tile_format); private: struct StagingBuffer { @@ -149,7 +149,7 @@ StagingBufferDeque busy_buffers_; int bytes_scheduled_since_last_flush_; const int max_staging_buffer_usage_in_bytes_; - bool use_rgba_4444_texture_format_; + ResourceFormat preferred_tile_format_; int staging_buffer_usage_in_bytes_; int free_staging_buffer_usage_in_bytes_; const base::TimeDelta staging_buffer_expiration_delay_;
diff --git a/cc/raster/tile_task_worker_pool.cc b/cc/raster/tile_task_worker_pool.cc index b55f69d..81946252 100644 --- a/cc/raster/tile_task_worker_pool.cc +++ b/cc/raster/tile_task_worker_pool.cc
@@ -6,6 +6,7 @@ #include "base/trace_event/trace_event.h" #include "cc/playback/display_list_raster_source.h" +#include "cc/raster/texture_compressor.h" #include "skia/ext/refptr.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkDrawFilter.h" @@ -40,11 +41,11 @@ case RGBA_4444: case RGBA_8888: case BGRA_8888: + case ETC1: return true; case ALPHA_8: case LUMINANCE_8: case RGB_565: - case ETC1: case RED_8: return false; } @@ -81,8 +82,6 @@ // Uses kPremul_SkAlphaType since the result is not known to be opaque. SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType); - SkColorType buffer_color_type = ResourceFormatToSkColorType(format); - bool needs_copy = buffer_color_type != info.colorType(); // Use unknown pixel geometry to disable LCD text. SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry); @@ -99,33 +98,59 @@ if (!include_images) image_filter = skia::AdoptRef(new SkipImageFilter); - if (!needs_copy) { - skia::RefPtr<SkSurface> surface = skia::AdoptRef( - SkSurface::NewRasterDirect(info, memory, stride, &surface_props)); - skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); - canvas->setDrawFilter(image_filter.get()); - raster_source->PlaybackToCanvas(canvas.get(), canvas_bitmap_rect, - canvas_playback_rect, scale); - return; - } - - skia::RefPtr<SkSurface> surface = - skia::AdoptRef(SkSurface::NewRaster(info, &surface_props)); - skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); - canvas->setDrawFilter(image_filter.get()); - // TODO(reveman): Improve partial raster support by reducing the size of - // playback rect passed to PlaybackToCanvas. crbug.com/519070 - raster_source->PlaybackToCanvas(canvas.get(), canvas_bitmap_rect, - canvas_bitmap_rect, scale); - { TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory::ConvertPixels"); - SkImageInfo dst_info = - SkImageInfo::Make(info.width(), info.height(), buffer_color_type, - info.alphaType(), info.profileType()); - bool rv = canvas->readPixels(dst_info, memory, stride, 0, 0); - DCHECK(rv); + switch (format) { + case RGBA_8888: + case BGRA_8888: { + skia::RefPtr<SkSurface> surface = skia::AdoptRef( + SkSurface::NewRasterDirect(info, memory, stride, &surface_props)); + skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); + canvas->setDrawFilter(image_filter.get()); + raster_source->PlaybackToCanvas(canvas.get(), canvas_bitmap_rect, + canvas_playback_rect, scale); + return; + } + case RGBA_4444: + case ETC1: { + skia::RefPtr<SkSurface> surface = + skia::AdoptRef(SkSurface::NewRaster(info, &surface_props)); + skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); + canvas->setDrawFilter(image_filter.get()); + // TODO(reveman): Improve partial raster support by reducing the size of + // playback rect passed to PlaybackToCanvas. crbug.com/519070 + raster_source->PlaybackToCanvas(canvas.get(), canvas_bitmap_rect, + canvas_bitmap_rect, scale); + + if (format == ETC1) { + DCHECK_EQ(size.width() % 4, 0); + DCHECK_EQ(size.height() % 4, 0); + scoped_ptr<TextureCompressor> texture_compressor = + TextureCompressor::Create(TextureCompressor::kFormatETC1); + texture_compressor->Compress( + reinterpret_cast<const uint8_t*>( + surface->peekPixels(nullptr, nullptr)), + reinterpret_cast<uint8_t*>(memory), size.width(), size.height(), + TextureCompressor::kQualityHigh); + } else { + SkImageInfo dst_info = SkImageInfo::Make( + info.width(), info.height(), ResourceFormatToSkColorType(format), + info.alphaType(), info.profileType()); + bool rv = canvas->readPixels(dst_info, memory, stride, 0, 0); + DCHECK(rv); + } + return; + } + case ALPHA_8: + case LUMINANCE_8: + case RGB_565: + case RED_8: + NOTREACHED(); + return; + } + + NOTREACHED(); } }
diff --git a/cc/raster/tile_task_worker_pool_perftest.cc b/cc/raster/tile_task_worker_pool_perftest.cc index 70902c8..1e1ff1c 100644 --- a/cc/raster/tile_task_worker_pool_perftest.cc +++ b/cc/raster/tile_task_worker_pool_perftest.cc
@@ -254,7 +254,7 @@ Create3dOutputSurfaceAndResourceProvider(); tile_task_worker_pool_ = ZeroCopyTileTaskWorkerPool::Create( task_runner_.get(), task_graph_runner_.get(), - resource_provider_.get(), false); + resource_provider_.get(), PlatformColor::BestTextureFormat()); break; case TILE_TASK_WORKER_POOL_TYPE_ONE_COPY: Create3dOutputSurfaceAndResourceProvider(); @@ -262,7 +262,8 @@ task_runner_.get(), task_graph_runner_.get(), context_provider_.get(), resource_provider_.get(), std::numeric_limits<int>::max(), false, - std::numeric_limits<int>::max(), false); + std::numeric_limits<int>::max(), + PlatformColor::BestTextureFormat()); break; case TILE_TASK_WORKER_POOL_TYPE_GPU: Create3dOutputSurfaceAndResourceProvider();
diff --git a/cc/raster/tile_task_worker_pool_unittest.cc b/cc/raster/tile_task_worker_pool_unittest.cc index 62239c16..c5d3a416 100644 --- a/cc/raster/tile_task_worker_pool_unittest.cc +++ b/cc/raster/tile_task_worker_pool_unittest.cc
@@ -146,14 +146,15 @@ Create3dOutputSurfaceAndResourceProvider(); tile_task_worker_pool_ = ZeroCopyTileTaskWorkerPool::Create( base::ThreadTaskRunnerHandle::Get().get(), &task_graph_runner_, - resource_provider_.get(), false); + resource_provider_.get(), PlatformColor::BestTextureFormat()); break; case TILE_TASK_WORKER_POOL_TYPE_ONE_COPY: Create3dOutputSurfaceAndResourceProvider(); tile_task_worker_pool_ = OneCopyTileTaskWorkerPool::Create( base::ThreadTaskRunnerHandle::Get().get(), &task_graph_runner_, context_provider_.get(), resource_provider_.get(), - kMaxBytesPerCopyOperation, false, kMaxStagingBuffers, false); + kMaxBytesPerCopyOperation, false, kMaxStagingBuffers, + PlatformColor::BestTextureFormat()); break; case TILE_TASK_WORKER_POOL_TYPE_GPU: Create3dOutputSurfaceAndResourceProvider();
diff --git a/cc/raster/zero_copy_tile_task_worker_pool.cc b/cc/raster/zero_copy_tile_task_worker_pool.cc index 8830c1f02..c2358a6 100644 --- a/cc/raster/zero_copy_tile_task_worker_pool.cc +++ b/cc/raster/zero_copy_tile_task_worker_pool.cc
@@ -65,22 +65,22 @@ base::SequencedTaskRunner* task_runner, TaskGraphRunner* task_graph_runner, ResourceProvider* resource_provider, - bool use_rgba_4444_texture_format) { - return make_scoped_ptr<TileTaskWorkerPool>(new ZeroCopyTileTaskWorkerPool( - task_runner, task_graph_runner, resource_provider, - use_rgba_4444_texture_format)); + ResourceFormat preferred_tile_format) { + return make_scoped_ptr<TileTaskWorkerPool>( + new ZeroCopyTileTaskWorkerPool(task_runner, task_graph_runner, + resource_provider, preferred_tile_format)); } ZeroCopyTileTaskWorkerPool::ZeroCopyTileTaskWorkerPool( base::SequencedTaskRunner* task_runner, TaskGraphRunner* task_graph_runner, ResourceProvider* resource_provider, - bool use_rgba_4444_texture_format) + ResourceFormat preferred_tile_format) : task_runner_(task_runner), task_graph_runner_(task_graph_runner), namespace_token_(task_graph_runner->GetNamespaceToken()), resource_provider_(resource_provider), - use_rgba_4444_texture_format_(use_rgba_4444_texture_format) {} + preferred_tile_format_(preferred_tile_format) {} ZeroCopyTileTaskWorkerPool::~ZeroCopyTileTaskWorkerPool() { } @@ -122,9 +122,13 @@ ResourceFormat ZeroCopyTileTaskWorkerPool::GetResourceFormat( bool must_support_alpha) const { - return use_rgba_4444_texture_format_ - ? RGBA_4444 - : resource_provider_->best_texture_format(); + if (resource_provider_->IsResourceFormatSupported(preferred_tile_format_) && + (DoesResourceFormatSupportAlpha(preferred_tile_format_) || + !must_support_alpha)) { + return preferred_tile_format_; + } + + return resource_provider_->best_texture_format(); } bool ZeroCopyTileTaskWorkerPool::GetResourceRequiresSwizzle(
diff --git a/cc/raster/zero_copy_tile_task_worker_pool.h b/cc/raster/zero_copy_tile_task_worker_pool.h index 3ca9b06..79be7f50 100644 --- a/cc/raster/zero_copy_tile_task_worker_pool.h +++ b/cc/raster/zero_copy_tile_task_worker_pool.h
@@ -29,7 +29,7 @@ base::SequencedTaskRunner* task_runner, TaskGraphRunner* task_graph_runner, ResourceProvider* resource_provider, - bool use_rgba_4444_texture_format); + ResourceFormat preferred_tile_format); // Overridden from TileTaskWorkerPool: TileTaskRunner* AsTileTaskRunner() override; @@ -52,7 +52,7 @@ ZeroCopyTileTaskWorkerPool(base::SequencedTaskRunner* task_runner, TaskGraphRunner* task_graph_runner, ResourceProvider* resource_provider, - bool use_rgba_4444_texture_format); + ResourceFormat preferred_tile_format); private: scoped_refptr<base::trace_event::ConvertableToTraceFormat> StateAsValue() @@ -63,7 +63,7 @@ const NamespaceToken namespace_token_; ResourceProvider* resource_provider_; - bool use_rgba_4444_texture_format_; + ResourceFormat preferred_tile_format_; Task::Vector completed_tasks_;
diff --git a/cc/resources/platform_color.h b/cc/resources/platform_color.h index 17eddc1f..7e49863 100644 --- a/cc/resources/platform_color.h +++ b/cc/resources/platform_color.h
@@ -24,7 +24,19 @@ } // Returns the most efficient texture format for this platform. - static ResourceFormat BestTextureFormat(bool supports_bgra8888) { + static ResourceFormat BestTextureFormat() { + switch (Format()) { + case SOURCE_FORMAT_BGRA8: + return BGRA_8888; + case SOURCE_FORMAT_RGBA8: + return RGBA_8888; + } + NOTREACHED(); + return RGBA_8888; + } + + // Returns the most efficient supported texture format for this platform. + static ResourceFormat BestSupportedTextureFormat(bool supports_bgra8888) { switch (Format()) { case SOURCE_FORMAT_BGRA8: return (supports_bgra8888) ? BGRA_8888 : RGBA_8888;
diff --git a/cc/resources/resource_format.cc b/cc/resources/resource_format.cc index e11c097b..e762464 100644 --- a/cc/resources/resource_format.cc +++ b/cc/resources/resource_format.cc
@@ -97,14 +97,36 @@ return gfx::BufferFormat::RGBA_4444; case RGBA_8888: return gfx::BufferFormat::RGBA_8888; + case ETC1: + return gfx::BufferFormat::ETC1; case ALPHA_8: case LUMINANCE_8: case RGB_565: - case ETC1: break; } NOTREACHED(); return gfx::BufferFormat::RGBA_8888; } +bool IsResourceFormatCompressed(ResourceFormat format) { + return format == ETC1; +} + +bool DoesResourceFormatSupportAlpha(ResourceFormat format) { + switch (format) { + case RGBA_4444: + case RGBA_8888: + case BGRA_8888: + case ALPHA_8: + return true; + case LUMINANCE_8: + case RGB_565: + case ETC1: + case RED_8: + return false; + } + NOTREACHED(); + return false; +} + } // namespace cc
diff --git a/cc/resources/resource_format.h b/cc/resources/resource_format.h index 79b815f..e1a5fea 100644 --- a/cc/resources/resource_format.h +++ b/cc/resources/resource_format.h
@@ -38,6 +38,9 @@ CC_EXPORT GLenum GLInternalFormat(ResourceFormat format); CC_EXPORT gfx::BufferFormat BufferFormat(ResourceFormat format); +bool IsResourceFormatCompressed(ResourceFormat format); +bool DoesResourceFormatSupportAlpha(ResourceFormat format); + } // namespace cc #endif // CC_RESOURCES_RESOURCE_FORMAT_H_
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc index 4e490750..cc6392306 100644 --- a/cc/resources/resource_provider.cc +++ b/cc/resources/resource_provider.cc
@@ -368,6 +368,29 @@ gl->Finish(); } +bool ResourceProvider::IsResourceFormatSupported(ResourceFormat format) const { + const ContextProvider::Capabilities& caps = + output_surface_->context_provider()->ContextCapabilities(); + + switch (format) { + case ALPHA_8: + case RGBA_4444: + case RGBA_8888: + case RGB_565: + case LUMINANCE_8: + return true; + case BGRA_8888: + return caps.gpu.texture_format_bgra8888; + case ETC1: + return caps.gpu.texture_format_etc1; + case RED_8: + return caps.gpu.texture_rg; + } + + NOTREACHED(); + return false; +} + bool ResourceProvider::InUseByConsumer(ResourceId id) { Resource* resource = GetResource(id); return resource->lock_for_read_count > 0 || resource->exported_count > 0 || @@ -1067,10 +1090,10 @@ max_texture_size_ = 0; // Context expects cleared value. gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size_); best_texture_format_ = - PlatformColor::BestTextureFormat(use_texture_format_bgra_); + PlatformColor::BestSupportedTextureFormat(use_texture_format_bgra_); - best_render_buffer_format_ = - PlatformColor::BestTextureFormat(caps.gpu.render_buffer_format_bgra8888); + best_render_buffer_format_ = PlatformColor::BestSupportedTextureFormat( + caps.gpu.render_buffer_format_bgra8888); texture_id_allocator_.reset( new TextureIdAllocator(gl, id_allocation_chunk_size_));
diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h index 5a03cda..e7bf671 100644 --- a/cc/resources/resource_provider.h +++ b/cc/resources/resource_provider.h
@@ -106,6 +106,8 @@ } size_t num_resources() const { return resources_.size(); } + bool IsResourceFormatSupported(ResourceFormat format) const; + // Checks whether a resource is in use by a consumer. bool InUseByConsumer(ResourceId id);
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc index 347933ce3..5d810ab 100644 --- a/cc/test/layer_tree_pixel_resource_test.cc +++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -147,7 +147,8 @@ *resource_pool = ResourcePool::Create(resource_provider, task_runner); *tile_task_worker_pool = ZeroCopyTileTaskWorkerPool::Create( - task_runner, task_graph_runner(), resource_provider, false); + task_runner, task_graph_runner(), resource_provider, + PlatformColor::BestTextureFormat()); break; case ONE_COPY_TILE_TASK_WORKER_POOL: EXPECT_TRUE(context_provider); @@ -158,7 +159,8 @@ *tile_task_worker_pool = OneCopyTileTaskWorkerPool::Create( task_runner, task_graph_runner(), context_provider, resource_provider, max_bytes_per_copy_operation, false, - max_staging_buffer_usage_in_bytes, false); + max_staging_buffer_usage_in_bytes, + PlatformColor::BestTextureFormat()); break; } }
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc index 9804da0..6ae1235 100644 --- a/cc/tiles/tile_manager.cc +++ b/cc/tiles/tile_manager.cc
@@ -796,8 +796,6 @@ if (resource) { resource_content_id = tile->invalidated_id(); DCHECK_EQ(DetermineResourceFormat(tile), resource->format()); - DCHECK_EQ(tile->desired_texture_size().ToString(), - resource->size().ToString()); } else { resource = resource_pool_->AcquireResource(tile->desired_texture_size(), DetermineResourceFormat(tile));
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 9524e41..974d821 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -2229,7 +2229,7 @@ *tile_task_worker_pool = ZeroCopyTileTaskWorkerPool::Create( GetTaskRunner(), task_graph_runner, resource_provider_.get(), - settings_.renderer_settings.use_rgba_4444_textures); + settings_.renderer_settings.preferred_tile_format); return; } @@ -2243,7 +2243,7 @@ GetTaskRunner(), task_graph_runner, context_provider, resource_provider_.get(), max_copy_texture_chromium_size, settings_.use_partial_raster, settings_.max_staging_buffer_usage_in_bytes, - settings_.renderer_settings.use_rgba_4444_textures); + settings_.renderer_settings.preferred_tile_format); } void LayerTreeHostImpl::RecordMainFrameTiming(
diff --git a/cc/trees/layer_tree_host_unittest_copyrequest.cc b/cc/trees/layer_tree_host_unittest_copyrequest.cc index 32a54949..98198b30 100644 --- a/cc/trees/layer_tree_host_unittest_copyrequest.cc +++ b/cc/trees/layer_tree_host_unittest_copyrequest.cc
@@ -200,7 +200,6 @@ } void BeginTest() override { - callback_count_ = 0; PostSetNeedsCommitToMainThread(); } @@ -210,29 +209,24 @@ case 1: layer_->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( base::Bind(&LayerTreeHostCopyRequestCompletionCausesCommit:: - CopyOutputCallback, - base::Unretained(this)))); - EXPECT_EQ(0, callback_count_); + CopyOutputCallback))); break; case 2: - // This commit was triggered by the copy request. + // This commit is triggered by the copy request. break; case 3: - // This commit was triggered by the completion of the copy request. - EXPECT_EQ(1, callback_count_); + // This commit is triggered by the completion of the copy request. EndTest(); break; } } - void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { + static void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) { EXPECT_FALSE(result->IsEmpty()); - ++callback_count_; } void AfterTest() override {} - int callback_count_; FakeContentLayerClient client_; scoped_refptr<FakePictureLayer> root_; scoped_refptr<FakePictureLayer> layer_;
diff --git a/chrome/VERSION b/chrome/VERSION index 766590e..d9bd852 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=49 MINOR=0 -BUILD=2587 +BUILD=2588 PATCH=0
diff --git a/chrome/android/java/res/drawable/offline_badge_background.xml b/chrome/android/java/res/drawable/offline_badge_background.xml new file mode 100644 index 0000000..cede686 --- /dev/null +++ b/chrome/android/java/res/drawable/offline_badge_background.xml
@@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2015 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<shape + xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval" > + <solid + android:color="#FFFFFF" /> +</shape> +
diff --git a/chrome/android/java/res/layout/fre_data_reduction_proxy.xml b/chrome/android/java/res/layout/fre_data_reduction_proxy.xml index 5c7f2aa..f589125e 100644 --- a/chrome/android/java/res/layout/fre_data_reduction_proxy.xml +++ b/chrome/android/java/res/layout/fre_data_reduction_proxy.xml
@@ -69,7 +69,6 @@ android:id="@+id/enable_data_saver_switch" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="start" android:lineSpacingMultiplier="1.4" android:showText="false" android:text="@string/data_reduction_enabled_switch"
diff --git a/chrome/android/java/res/layout/icon_most_visited_item.xml b/chrome/android/java/res/layout/icon_most_visited_item.xml index deaf4d0..161e253 100644 --- a/chrome/android/java/res/layout/icon_most_visited_item.xml +++ b/chrome/android/java/res/layout/icon_most_visited_item.xml
@@ -18,6 +18,17 @@ android:layout_marginEnd="12dp" android:contentDescription="@null" /> + <ImageView + android:id="@+id/offline_badge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="48dp" + android:layout_marginTop="36dp" + android:visibility="gone" + android:background="@drawable/offline_badge_background" + android:contentDescription="@null" + android:src="@drawable/eb_filter_offline_pages" /> + <View android:layout_width="@dimen/icon_most_visited_icon_size" android:layout_height="@dimen/icon_most_visited_icon_size"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java index eab87fc4..400583c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java
@@ -12,9 +12,6 @@ // Switches used from Java. Please continue switch style used Chrome where // options-have-hypens and are_not_split_with_underscores. - /** Testing: pretend that the switch value is the name of a child account. */ - public static final String CHILD_ACCOUNT = "child-account"; - /** Mimic a low end device */ public static final String ENABLE_ACCESSIBILITY_TAB_SWITCHER = "enable-accessibility-tab-switcher"; @@ -161,6 +158,14 @@ public static final String PROGRESS_BAR_ANIMATION = "progress-bar-animation"; /** + * Specifies Android NTP behaviour on clicking a Most{Visited/Likely} tile. + * Specifically whether to refocus an existing tab with the same url or host or to load the url + * in the current tab. + * Native switch - switches::kNtpSwitchToExistingTab + */ + public static final String NTP_SWITCH_TO_EXISTING_TAB = "ntp-switch-to-existing-tab"; + + /** * Enable offline pages. */ public static final String ENABLE_OFFLINE_PAGES = "enable-offline-pages";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IconMostVisitedItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IconMostVisitedItemView.java index 444931b..21703a4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IconMostVisitedItemView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IconMostVisitedItemView.java
@@ -7,6 +7,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; @@ -40,4 +41,12 @@ ImageView iconView = (ImageView) findViewById(R.id.most_visited_icon); iconView.setImageDrawable(icon); } + + /** + * Sets whether the page is available offline. + */ + public void setOfflineAvailable(boolean offlineAvailable) { + findViewById(R.id.offline_badge).setVisibility( + offlineAvailable ? View.VISIBLE : View.INVISIBLE); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java index 8539a53..9abd516 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
@@ -4,13 +4,17 @@ package org.chromium.chrome.browser.ntp; +import android.annotation.TargetApi; import android.app.Activity; +import android.app.ActivityManager; import android.app.Dialog; import android.content.Context; +import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Rect; +import android.os.Build; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; @@ -23,11 +27,13 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.NativePage; import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.compositor.layouts.content.InvalidationAwareThumbnailProvider; import org.chromium.chrome.browser.document.DocumentMetricIds; +import org.chromium.chrome.browser.document.DocumentUtils; import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkUtils; import org.chromium.chrome.browser.favicon.FaviconHelper; import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback; @@ -39,6 +45,7 @@ import org.chromium.chrome.browser.ntp.LogoBridge.Logo; import org.chromium.chrome.browser.ntp.LogoBridge.LogoObserver; import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager; +import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; import org.chromium.chrome.browser.preferences.DocumentModeManager; import org.chromium.chrome.browser.preferences.DocumentModePreference; import org.chromium.chrome.browser.preferences.PrefServiceBridge; @@ -52,9 +59,14 @@ import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabObserver; +import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tabmodel.TabModelUtils; +import org.chromium.chrome.browser.tabmodel.document.ActivityDelegate; +import org.chromium.chrome.browser.tabmodel.document.DocumentTabModel; import org.chromium.chrome.browser.util.FeatureUtilities; +import org.chromium.chrome.browser.util.UrlUtilities; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.net.NetworkChangeNotifier; import org.chromium.ui.base.DeviceFormFactor; @@ -100,6 +112,7 @@ private String mOnLogoClickUrl; private String mAnimatedLogoUrl; private FakeboxDelegate mFakeboxDelegate; + private OfflinePageBridge mOfflinePageBridge; // The timestamp at which the constructor was called. private final long mConstructedTimeNs; @@ -254,7 +267,51 @@ public void open(MostVisitedItem item) { if (mIsDestroyed) return; recordOpenedMostVisitedItem(item); - open(item.getUrl()); + String url = item.getUrl(); + if (!switchToExistingTab(url)) open(url); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private boolean switchToExistingTab(String url) { + String matchPattern = CommandLine.getInstance().getSwitchValue( + ChromeSwitches.NTP_SWITCH_TO_EXISTING_TAB); + boolean matchByHost; + if ("url".equals(matchPattern)) { + matchByHost = false; + } else if ("host".equals(matchPattern)) { + matchByHost = true; + } else { + return false; + } + if (FeatureUtilities.isDocumentMode(mActivity)) { + ActivityManager am = + (ActivityManager) mActivity.getSystemService(Activity.ACTIVITY_SERVICE); + DocumentTabModel tabModel = + ChromeApplication.getDocumentTabModelSelector().getModel(false); + for (ActivityManager.AppTask task : am.getAppTasks()) { + Intent baseIntent = DocumentUtils.getBaseIntentFromTask(task); + int tabId = ActivityDelegate.getTabIdFromIntent(baseIntent); + String tabUrl = tabModel.getCurrentUrlForDocument(tabId); + if (matchURLs(tabUrl, url, matchByHost)) { + task.moveToFront(); + return true; + } + } + } else { + TabModel tabModel = mTabModelSelector.getModel(false); + for (int i = tabModel.getCount() - 1; i >= 0; --i) { + if (matchURLs(tabModel.getTabAt(i).getUrl(), url, matchByHost)) { + TabModelUtils.setIndex(tabModel, i); + return true; + } + } + } + return false; + } + + private boolean matchURLs(String url1, String url2, boolean matchByHost) { + if (url1 == null || url2 == null) return false; + return matchByHost ? UrlUtilities.sameHost(url1, url2) : url1.equals(url2); } @Override @@ -371,6 +428,13 @@ } @Override + public boolean isOfflineAvailable(String pageUrl) { + if (mIsDestroyed || !OfflinePageBridge.isEnabled()) return false; + if (mOfflinePageBridge == null) mOfflinePageBridge = new OfflinePageBridge(mProfile); + return mOfflinePageBridge.getPageByOnlineURL(pageUrl) != null; + } + + @Override public void onLogoClicked(boolean isAnimatedLogoShowing) { if (mIsDestroyed) return; @@ -609,6 +673,10 @@ assert !mIsDestroyed; assert getView().getParent() == null : "Destroy called before removed from window"; if (mIsVisible) recordNTPInteractionTime(); + if (mOfflinePageBridge != null) { + mOfflinePageBridge.destroy(); + mOfflinePageBridge = null; + } if (mFaviconHelper != null) { mFaviconHelper.destroy(); mFaviconHelper = null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java index d38d11b1..16c39b3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
@@ -48,6 +48,7 @@ import org.chromium.chrome.browser.ntp.MostVisitedItem.MostVisitedItemManager; import org.chromium.chrome.browser.ntp.NewTabPage.OnSearchBoxScrollListener; import org.chromium.chrome.browser.ntp.snippets.SnippetsManager; +import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.preferences.DocumentModeManager; import org.chromium.chrome.browser.profiles.MostVisitedSites.MostVisitedURLsObserver; import org.chromium.chrome.browser.profiles.MostVisitedSites.ThumbnailCallback; @@ -186,6 +187,12 @@ IconAvailabilityCallback callback); /** + * Checks if the page with the given URL is available offline. + * @param pageUrl The URL of the site whose offline availability is requested. + */ + boolean isOfflineAvailable(String pageUrl); + + /** * Called when the user clicks on the logo. * @param isAnimatedLogoShowing Whether the animated GIF logo is playing. */ @@ -949,6 +956,8 @@ final IconMostVisitedItemView view = (IconMostVisitedItemView) inflater.inflate( R.layout.icon_most_visited_item, mMostVisitedLayout, false); view.setTitle(displayTitle); + view.setOfflineAvailable(mManager.isOfflineAvailable(url) + && !OfflinePageUtils.isConnected(getContext())); LargeIconCallback iconCallback = new LargeIconCallbackImpl(item, isInitialLoad); if (isInitialLoad) mPendingLoadTasks++;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java index 01fbb80..cd9b8d4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
@@ -232,6 +232,17 @@ } /** + * Gets an offline page associated with a provided online URL. + * + * @param onlineURL URL of the page. + * @return An {@link OfflinePageItem} matching the URL or <code>null</code> if none exist. + */ + @VisibleForTesting + public OfflinePageItem getPageByOnlineURL(String onlineURL) { + return nativeGetPageByOnlineURL(mNativeOfflinePageBridge, onlineURL); + } + + /** * Saves the web page loaded into web contents offline. * * @param webContents Contents of the page to save. @@ -402,6 +413,8 @@ long nativeOfflinePageBridge, List<OfflinePageItem> offlinePages); private native OfflinePageItem nativeGetPageByBookmarkId( long nativeOfflinePageBridge, long bookmarkId); + private native OfflinePageItem nativeGetPageByOnlineURL( + long nativeOfflinePageBridge, String onlineURL); private native void nativeSavePage(long nativeOfflinePageBridge, SavePageCallback callback, WebContents webContents, long bookmarkId); private native void nativeMarkPageAccessed(long nativeOfflinePageBridge, long bookmarkId);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/UrlUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/UrlUtilities.java index a24ef16..76e86b2e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/util/UrlUtilities.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/util/UrlUtilities.java
@@ -192,6 +192,15 @@ } /** + * Determines whether or not the given URLs have the same host. + * Unlike the above sameDomainOrHost(...) method, this does a simpler host matching, so + * http://news.google.com and http://finance.google.com do not have the same host. + */ + public static boolean sameHost(String primaryUrl, String secondaryUrl) { + return nativeSameHost(primaryUrl, secondaryUrl); + } + + /** * This function works by calling net::registry_controlled_domains::GetDomainAndRegistry * * @param uri A URI @@ -369,6 +378,7 @@ private static native boolean nativeSameDomainOrHost(String primaryUrl, String secondaryUrl, boolean includePrivateRegistries); + private static native boolean nativeSameHost(String primaryUrl, String secondaryUrl); private static native String nativeGetDomainAndRegistry(String url, boolean includePrivateRegistries); public static native boolean nativeIsGoogleSearchUrl(String url);
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 1325b5b..1e36c0f1 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -5611,7 +5611,7 @@ Panels </message> <message name="IDS_FLAGS_PANELS_DESCRIPTION" desc="Description for the flag to enable Panel windows."> - Enable Panel windows that open outside of the browser frame. Attempts to open a Panel will open a popup instead if not enabled. Panels are always enabled on the dev and canary channels. + Allow extensions to create panel windows that open outside of the browser frame. Attempts to open a panel will open a popup instead if not enabled. </message> <message name="IDS_FLAGS_WEBGL_DRAFT_EXTENSIONS_NAME" desc="Name of the 'Enable WebGL Draft Extensions' flag."> WebGL Draft Extensions @@ -6062,9 +6062,14 @@ <message name="IDS_FLAGS_PUSH_API_BACKGROUND_MODE_DESCRIPTION" desc="Description for the flag to enable background mode for the Push API."> Enable background mode for the Push API. This allows Chrome to continue running after the last window is closed, and to launch at OS startup, if the Push API needs it. </message> - <message name="IDS_FLAGS_ENABLE_STALE_WHILE_REVALIDATE_NAME" desc="Name of the flag to enable the stale-while-revalidate cache directive."> - Enable the stale-while-revalidate cache directive - </message> + <if expr="not is_ios"> + <message name="IDS_FLAGS_ENABLE_STALE_WHILE_REVALIDATE_NAME" desc="Name of the flag to enable the "stale-while-revalidate" cache directive. This message is intended for web developers who are familiar with technical terms. "stale-while-revalidate" here is the literal string sent by the HTTP server, and so should be untranslated where possible. "cache" here refers to an HTTP cache. "directive" here is an instruction sent by an HTTP server to indicate what caching behaviour should be used."> + Enable the "stale-while-revalidate" cache directive + </message> + <message name="IDS_FLAGS_ENABLE_STALE_WHILE_REVALIDATE_DESCRIPTION" desc="Description of the flag to enable the "stale-while-revalidate" cache directive. This message is intended for web developers who are familiar with technical terms. "Cache-Control: stale-while-revalidate" is the literal string sent by the HTTP server, and so should be untranslated where possible. If necessary for translation it can be split into the HTTP header name part "Cache-Control" and the value part "stale-while-revalidate". "directive" here is an instruction sent by an HTTP server to indicate what caching behaviour should be used. The directive is typically configured by the server administrator. "servers" here refers to HTTP server software. "resources" here means individual files served by HTTP servers and cached by the browser. "be revalidated" means "be checked with the HTTP server whether or not the browser has the latest version". "in the background" here means without making the user wait. "latency" here refers to the time the user waits for a web page to be loaded or become usable."> + Enable the experimental implementation of the "Cache-Control: stale-while-revalidate" directive. This permits servers to specify that some resources may be revalidated in the background to improve latency. + </message> + </if> <message name="IDS_FLAGS_ENABLE_NAVIGATION_TRACING" desc="Name of the flag to enable navigation tracing"> Enable navigation tracing </message> @@ -14630,6 +14635,18 @@ <message name="IDS_FLAGS_NTP_POPULAR_SITES_DESCRIPTION" desc="Description for the flag to enable showing non-personalized popular suggestions on the New Tab Page, when no personal suggestions are available yet."> Pre-populate the New Tab page with popular sites. </message> + <message name="IDS_FLAGS_NTP_SWITCH_TO_EXISTING_TAB_NAME" desc="Name for the flag to control the behaviour when opening a suggestion from the New Tab Page if an existing tab for it is open."> + Switch to an existing tab for New Tab Page suggestions. + </message> + <message name="IDS_FLAGS_NTP_SWITCH_TO_EXISTING_TAB_DESCRIPTION" desc="Description for the flag to control the behaviour when opening a suggestion from the New Tab Page if an existing tab for it is open."> + When opening a suggestion from the New Tab Page, if a tab is already open for the suggestion, switch to that one instead of loading the suggestion in the new tab. + </message> + <message name="IDS_FLAGS_NTP_SWITCH_TO_EXISTING_TAB_MATCH_URL" desc="Match suggestions with existing tabs by their URL."> + Match by URL + </message> + <message name="IDS_FLAGS_NTP_SWITCH_TO_EXISTING_TAB_MATCH_HOST" desc="Match suggestions with existing tabs by their Hostname."> + Match by Hostname + </message> <message name="IDS_FLAGS_USE_ANDROID_MIDI_API_NAME" desc="Name for the flag to use android midi api."> Use Android Midi API </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 1a4b876..16397bb 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1111,8 +1111,6 @@ "signin/fake_signin_manager_builder.h", "ssl/ssl_client_auth_requestor_mock.cc", "ssl/ssl_client_auth_requestor_mock.h", - "sync/profile_sync_service_mock.cc", - "sync/profile_sync_service_mock.h", "sync/profile_sync_test_util.cc", "sync/profile_sync_test_util.h", ] @@ -1129,6 +1127,7 @@ "//chrome/browser", "//chrome/common", "//chrome/common/safe_browsing:proto", + "//components/browser_sync/browser:test_support", "//components/invalidation/impl", "//components/invalidation/impl:test_support", "//components/password_manager/core/browser:test_support",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 0068375..cf2b4a2 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -474,6 +474,18 @@ switches::kForceUIDirectionRTL}, }; +#if defined(OS_ANDROID) +const FeatureEntry::Choice kNtpSwitchToExistingTabChoices[] = { + {IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""}, + {IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, switches::kNtpSwitchToExistingTab, + "disabled"}, + {IDS_FLAGS_NTP_SWITCH_TO_EXISTING_TAB_MATCH_URL, + switches::kNtpSwitchToExistingTab, "url"}, + {IDS_FLAGS_NTP_SWITCH_TO_EXISTING_TAB_MATCH_HOST, + switches::kNtpSwitchToExistingTab, "host"}, +}; +#endif // defined(OS_ANDROID) + // RECORDING USER METRICS FOR FLAGS: // ----------------------------------------------------------------------------- // The first line of the entry is the internal name. If you'd like to gather @@ -1050,6 +1062,13 @@ IDS_FLAGS_TRACE_UPLOAD_URL_DESCRIPTION, kOsAll, MULTI_VALUE_TYPE(kTraceUploadURL)}, +#if !defined(OS_IOS) + {"enable-stale-while-revalidate", + IDS_FLAGS_ENABLE_STALE_WHILE_REVALIDATE_NAME, + IDS_FLAGS_ENABLE_STALE_WHILE_REVALIDATE_DESCRIPTION, + kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableStaleWhileRevalidate)}, +#endif {"enable-suggestions-with-substring-match", IDS_FLAGS_SUGGESTIONS_WITH_SUB_STRING_MATCH_NAME, IDS_FLAGS_SUGGESTIONS_WITH_SUB_STRING_MATCH_DESCRIPTION, @@ -1942,6 +1961,11 @@ kOsAndroid, ENABLE_DISABLE_VALUE_TYPE(switches::kEnableNTPPopularSites, switches::kDisableNTPPopularSites)}, + {"ntp-switch-to-existing-tab", + IDS_FLAGS_NTP_SWITCH_TO_EXISTING_TAB_NAME, + IDS_FLAGS_NTP_SWITCH_TO_EXISTING_TAB_DESCRIPTION, + kOsAndroid, + MULTI_VALUE_TYPE(kNtpSwitchToExistingTabChoices)}, {"use-android-midi-api", IDS_FLAGS_USE_ANDROID_MIDI_API_NAME, IDS_FLAGS_USE_ANDROID_MIDI_API_DESCRIPTION,
diff --git a/chrome/browser/android/data_usage/data_use_matcher.cc b/chrome/browser/android/data_usage/data_use_matcher.cc new file mode 100644 index 0000000..838dbed --- /dev/null +++ b/chrome/browser/android/data_usage/data_use_matcher.cc
@@ -0,0 +1,116 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/data_usage/data_use_matcher.h" + +#include "base/memory/weak_ptr.h" +#include "third_party/re2/re2/re2.h" +#include "url/gurl.h" + +namespace chrome { + +namespace android { + +DataUseMatcher::DataUseMatcher( + const base::WeakPtr<DataUseTabModel>& data_use_tab_model) + : data_use_tab_model_(data_use_tab_model) {} + +DataUseMatcher::~DataUseMatcher() {} + +void DataUseMatcher::RegisterURLRegexes( + const std::vector<std::string>* app_package_name, + const std::vector<std::string>* domain_path_regex, + const std::vector<std::string>* label) { + DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_EQ(app_package_name->size(), domain_path_regex->size()); + DCHECK_EQ(app_package_name->size(), label->size()); + + base::hash_set<std::string> removed_matching_rule_labels; + + for (const auto& matching_rule : matching_rules_) + removed_matching_rule_labels.insert(matching_rule->label()); + + matching_rules_.clear(); + re2::RE2::Options options(re2::RE2::DefaultOptions); + options.set_case_sensitive(false); + + for (size_t i = 0; i < domain_path_regex->size(); ++i) { + const std::string& url_regex = domain_path_regex->at(i); + if (url_regex.empty() && app_package_name->at(i).empty()) + continue; + scoped_ptr<re2::RE2> pattern(new re2::RE2(url_regex, options)); + if (!pattern->ok()) + continue; + DCHECK(!label->at(i).empty()); + matching_rules_.push_back(make_scoped_ptr(new MatchingRule( + app_package_name->at(i), pattern.Pass(), label->at(i)))); + + removed_matching_rule_labels.erase(label->at(i)); + } + + for (const std::string& label : removed_matching_rule_labels) { + if (data_use_tab_model_) + data_use_tab_model_->OnTrackingLabelRemoved(label); + } +} + +bool DataUseMatcher::MatchesURL(const GURL& url, std::string* label) const { + DCHECK(thread_checker_.CalledOnValidThread()); + *label = ""; + + if (!url.is_valid() || url.is_empty()) + return false; + + for (const auto& matching_rule : matching_rules_) { + if (re2::RE2::FullMatch(url.spec(), *(matching_rule->pattern()))) { + *label = matching_rule->label(); + return true; + } + } + + return false; +} + +bool DataUseMatcher::MatchesAppPackageName(const std::string& app_package_name, + std::string* label) const { + DCHECK(thread_checker_.CalledOnValidThread()); + *label = ""; + + if (app_package_name.empty()) + return false; + + for (const auto& matching_rule : matching_rules_) { + if (app_package_name == matching_rule->app_package_name()) { + *label = matching_rule->label(); + return true; + } + } + + return false; +} + +DataUseMatcher::MatchingRule::MatchingRule(const std::string& app_package_name, + scoped_ptr<re2::RE2> pattern, + const std::string& label) + : app_package_name_(app_package_name), + pattern_(pattern.Pass()), + label_(label) {} + +DataUseMatcher::MatchingRule::~MatchingRule() {} + +const re2::RE2* DataUseMatcher::MatchingRule::pattern() const { + return pattern_.get(); +} + +const std::string& DataUseMatcher::MatchingRule::app_package_name() const { + return app_package_name_; +} + +const std::string& DataUseMatcher::MatchingRule::label() const { + return label_; +} + +} // namespace android + +} // namespace chrome
diff --git a/chrome/browser/android/data_usage/data_use_matcher.h b/chrome/browser/android/data_usage/data_use_matcher.h new file mode 100644 index 0000000..6513b6c --- /dev/null +++ b/chrome/browser/android/data_usage/data_use_matcher.h
@@ -0,0 +1,98 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_MATCHER_H_ +#define CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_MATCHER_H_ + +#include <string> +#include <vector> + +#include "base/compiler_specific.h" +#include "base/containers/hash_tables.h" +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "base/threading/thread_checker.h" +#include "chrome/browser/android/data_usage/data_use_tab_model.h" + +namespace re2 { +class RE2; +} + +class GURL; + +namespace chrome { + +namespace android { + +// DataUseMatcher stores the matching URL patterns and package names along with +// the labels. It also provides functionality to get the matching label for a +// given URL or package. DataUseMatcher is not thread safe. +class DataUseMatcher { + public: + explicit DataUseMatcher( + const base::WeakPtr<DataUseTabModel>& data_use_tab_model); + + ~DataUseMatcher(); + + // Called by FetchMatchingRulesDoneOnIOThread to register multiple + // case-insensitive regular expressions. If the url of the data use request + // matches any of the regular expression, the observation is passed to the + // Java listener. All vectors must be non-null and are owned by the caller. + void RegisterURLRegexes(const std::vector<std::string>* app_package_name, + const std::vector<std::string>* domain_path_regex, + const std::vector<std::string>* label); + + // Returns true if the |url| matches the registered regular expressions. + // |label| must not be null. If a match is found, the |label| is set to the + // matching rule's label. + bool MatchesURL(const GURL& url, std::string* label) const WARN_UNUSED_RESULT; + + // Returns true if the |app_package_name| matches the registered package + // names. |label| must not be null. If a match is found, the |label| is set + // to the matching rule's label. + bool MatchesAppPackageName(const std::string& app_package_name, + std::string* label) const WARN_UNUSED_RESULT; + + private: + // Stores the matching rules. + class MatchingRule { + public: + MatchingRule(const std::string& app_package_name, + scoped_ptr<re2::RE2> pattern, + const std::string& label); + ~MatchingRule(); + + const re2::RE2* pattern() const; + const std::string& app_package_name() const; + const std::string& label() const; + + private: + // Package name of the app that should be matched. + const std::string app_package_name_; + + // RE2 pattern to match against URLs. + scoped_ptr<re2::RE2> pattern_; + + // Opaque label that uniquely identifies this matching rule. + const std::string label_; + + DISALLOW_COPY_AND_ASSIGN(MatchingRule); + }; + + base::ThreadChecker thread_checker_; + + std::vector<scoped_ptr<MatchingRule>> matching_rules_; + + // |data_use_tab_model_| is notified if a label is removed from the set of + // matching labels. + base::WeakPtr<DataUseTabModel> data_use_tab_model_; + + DISALLOW_COPY_AND_ASSIGN(DataUseMatcher); +}; + +} // namespace android + +} // namespace chrome + +#endif // CHROME_BROWSER_ANDROID_DATA_USAGE_DATA_USE_MATCHER_H_
diff --git a/chrome/browser/android/data_usage/data_use_matcher_unittest.cc b/chrome/browser/android/data_usage/data_use_matcher_unittest.cc new file mode 100644 index 0000000..e9cd5bf --- /dev/null +++ b/chrome/browser/android/data_usage/data_use_matcher_unittest.cc
@@ -0,0 +1,287 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/data_usage/data_use_matcher.h" + +#include <string> +#include <vector> + +#include "base/macros.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace chrome { + +namespace android { + +class DataUseMatcherTest : public testing::Test { + public: + DataUseMatcherTest() : data_use_matcher_(base::WeakPtr<DataUseTabModel>()) {} + + DataUseMatcher* data_use_matcher() { return &data_use_matcher_; } + + void RegisterURLRegexes(const std::vector<std::string>& app_package_name, + const std::vector<std::string>& domain_path_regex, + const std::vector<std::string>& label) { + data_use_matcher_.RegisterURLRegexes(&app_package_name, &domain_path_regex, + &label); + } + + private: + DataUseMatcher data_use_matcher_; + DISALLOW_COPY_AND_ASSIGN(DataUseMatcherTest); +}; + +TEST_F(DataUseMatcherTest, SingleRegex) { + const struct { + std::string url; + std::string regex; + bool expect_match; + } tests[] = { + {"http://www.google.com", "http://www.google.com/", true}, + {"http://www.Google.com", "http://www.google.com/", true}, + {"http://www.googleacom", "http://www.google.com/", true}, + {"http://www.googleaacom", "http://www.google.com/", false}, + {"http://www.google.com", "https://www.google.com/", false}, + {"http://www.google.com", "{http|https}://www[.]google[.]com/search.*", + false}, + {"https://www.google.com/search=test", + "https://www[.]google[.]com/search.*", true}, + {"https://www.googleacom/search=test", + "https://www[.]google[.]com/search.*", false}, + {"https://www.google.com/Search=test", + "https://www[.]google[.]com/search.*", true}, + {"www.google.com", "http://www.google.com", false}, + {"www.google.com:80", "http://www.google.com", false}, + {"http://www.google.com:80", "http://www.google.com", false}, + {"http://www.google.com:80/", "http://www.google.com/", true}, + {"", "http://www.google.com", false}, + {"", "", false}, + {"https://www.google.com", "http://www.google.com", false}, + }; + + for (size_t i = 0; i < arraysize(tests); ++i) { + std::string label(""); + RegisterURLRegexes( + // App package name not specified in the matching rule. + std::vector<std::string>(1, std::string()), + std::vector<std::string>(1, tests[i].regex), + std::vector<std::string>(1, "label")); + EXPECT_EQ(tests[i].expect_match, + data_use_matcher()->MatchesURL(GURL(tests[i].url), &label)) + << i; + + // Verify label matches the expected label. + std::string expected_label = ""; + if (tests[i].expect_match) + expected_label = "label"; + + EXPECT_EQ(expected_label, label); + EXPECT_FALSE(data_use_matcher()->MatchesAppPackageName( + "com.example.helloworld", &label)) + << i; + // Empty package name should not match against empty package name in the + // matching rule. + EXPECT_FALSE( + data_use_matcher()->MatchesAppPackageName(std::string(), &label)) + << i; + } +} + +TEST_F(DataUseMatcherTest, TwoRegex) { + const struct { + std::string url; + std::string regex1; + std::string regex2; + bool expect_match; + } tests[] = { + {"http://www.google.com", "http://www.google.com/", + "https://www.google.com/", true}, + {"http://www.googleacom", "http://www.google.com/", + "http://www.google.com/", true}, + {"https://www.google.com", "http://www.google.com/", + "https://www.google.com/", true}, + {"https://www.googleacom", "http://www.google.com/", + "https://www.google.com/", true}, + {"http://www.google.com", "{http|https}://www[.]google[.]com/search.*", + "", false}, + {"http://www.google.com/search=test", + "http://www[.]google[.]com/search.*", + "https://www[.]google[.]com/search.*", true}, + {"https://www.google.com/search=test", + "http://www[.]google[.]com/search.*", + "https://www[.]google[.]com/search.*", true}, + {"http://google.com/search=test", "http://www[.]google[.]com/search.*", + "https://www[.]google[.]com/search.*", false}, + {"https://www.googleacom/search=test", "", + "https://www[.]google[.]com/search.*", false}, + {"https://www.google.com/Search=test", "", + "https://www[.]google[.]com/search.*", true}, + {"www.google.com", "http://www.google.com", "", false}, + {"www.google.com:80", "http://www.google.com", "", false}, + {"http://www.google.com:80", "http://www.google.com", "", false}, + {"", "http://www.google.com", "", false}, + {"https://www.google.com", "http://www.google.com", "", false}, + }; + + for (size_t i = 0; i < arraysize(tests); ++i) { + std::string got_label(""); + std::vector<std::string> url_regexes; + url_regexes.push_back(tests[i].regex1 + "|" + tests[i].regex2); + const std::string label("label"); + RegisterURLRegexes( + std::vector<std::string>(url_regexes.size(), "com.example.helloworld"), + url_regexes, std::vector<std::string>(url_regexes.size(), label)); + EXPECT_EQ(tests[i].expect_match, + data_use_matcher()->MatchesURL(GURL(tests[i].url), &got_label)) + << i; + const std::string expected_label = + tests[i].expect_match ? label : std::string(); + EXPECT_EQ(expected_label, got_label); + + EXPECT_TRUE(data_use_matcher()->MatchesAppPackageName( + "com.example.helloworld", &got_label)) + << i; + EXPECT_EQ(label, got_label); + } +} + +TEST_F(DataUseMatcherTest, MultipleRegex) { + std::vector<std::string> url_regexes; + url_regexes.push_back( + "https?://www[.]google[.]com/#q=.*|https?://www[.]google[.]com[.]ph/" + "#q=.*|https?://www[.]google[.]com[.]ph/[?]gws_rd=ssl#q=.*"); + RegisterURLRegexes( + std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, + std::vector<std::string>(url_regexes.size(), "label")); + + const struct { + std::string url; + bool expect_match; + } tests[] = { + {"", false}, + {"http://www.google.com", false}, + {"http://www.googleacom", false}, + {"https://www.google.com", false}, + {"https://www.googleacom", false}, + {"https://www.google.com", false}, + {"quic://www.google.com/q=test", false}, + {"http://www.google.com/q=test", false}, + {"http://www.google.com/.q=test", false}, + {"http://www.google.com/#q=test", true}, + {"https://www.google.com/#q=test", true}, + {"https://www.google.com.ph/#q=test+abc", true}, + {"https://www.google.com.ph/?gws_rd=ssl#q=test+abc", true}, + {"http://www.google.com.ph/#q=test", true}, + {"https://www.google.com.ph/#q=test", true}, + {"http://www.google.co.in/#q=test", false}, + {"http://google.com/#q=test", false}, + {"https://www.googleacom/#q=test", false}, + {"https://www.google.com/#Q=test", true}, // case in-sensitive + {"www.google.com/#q=test", false}, + {"www.google.com:80/#q=test", false}, + {"http://www.google.com:80/#q=test", true}, + {"http://www.google.com:80/search?=test", false}, + }; + + for (size_t i = 0; i < arraysize(tests); ++i) { + std::string label(""); + EXPECT_EQ(tests[i].expect_match, + data_use_matcher()->MatchesURL(GURL(tests[i].url), &label)) + << i << " " << tests[i].url; + } +} + +TEST_F(DataUseMatcherTest, ChangeRegex) { + std::string label; + // When no regex is specified, the URL match should fail. + EXPECT_FALSE(data_use_matcher()->MatchesURL(GURL(""), &label)); + EXPECT_FALSE( + data_use_matcher()->MatchesURL(GURL("http://www.google.com"), &label)); + + std::vector<std::string> url_regexes; + url_regexes.push_back("http://www[.]google[.]com/#q=.*"); + url_regexes.push_back("https://www[.]google[.]com/#q=.*"); + RegisterURLRegexes( + std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, + std::vector<std::string>(url_regexes.size(), "label")); + + EXPECT_FALSE(data_use_matcher()->MatchesURL(GURL(""), &label)); + EXPECT_TRUE(data_use_matcher()->MatchesURL( + GURL("http://www.google.com#q=abc"), &label)); + EXPECT_FALSE(data_use_matcher()->MatchesURL( + GURL("http://www.google.co.in#q=abc"), &label)); + + // Change the regular expressions to verify that the new regexes replace + // the ones specified before. + url_regexes.clear(); + url_regexes.push_back("http://www[.]google[.]co[.]in/#q=.*"); + url_regexes.push_back("https://www[.]google[.]co[.]in/#q=.*"); + RegisterURLRegexes( + std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, + std::vector<std::string>(url_regexes.size(), "label")); + EXPECT_FALSE(data_use_matcher()->MatchesURL(GURL(""), &label)); + EXPECT_FALSE(data_use_matcher()->MatchesURL( + GURL("http://www.google.com#q=abc"), &label)); + EXPECT_TRUE(data_use_matcher()->MatchesURL( + GURL("http://www.google.co.in#q=abc"), &label)); +} + +TEST_F(DataUseMatcherTest, MultipleAppPackageName) { + std::vector<std::string> url_regexes; + url_regexes.push_back( + "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*"); + url_regexes.push_back( + "http://www[.]bar[.]com/#q=.*|https://www[.]bar[.]com/#q=.*"); + url_regexes.push_back(""); + + std::vector<std::string> labels; + const char kLabelFoo[] = "label_foo"; + const char kLabelBar[] = "label_bar"; + const char kLabelBaz[] = "label_baz"; + labels.push_back(kLabelFoo); + labels.push_back(kLabelBar); + labels.push_back(kLabelBaz); + + std::vector<std::string> app_package_names; + const char kAppFoo[] = "com.example.foo"; + const char kAppBar[] = "com.example.bar"; + const char kAppBaz[] = "com.example.baz"; + app_package_names.push_back(kAppFoo); + app_package_names.push_back(kAppBar); + app_package_names.push_back(kAppBaz); + + RegisterURLRegexes(app_package_names, url_regexes, labels); + + // Test if labels are matched properly for app package names. + std::string got_label; + EXPECT_TRUE(data_use_matcher()->MatchesAppPackageName(kAppFoo, &got_label)); + EXPECT_EQ(kLabelFoo, got_label); + + EXPECT_TRUE(data_use_matcher()->MatchesAppPackageName(kAppBar, &got_label)); + EXPECT_EQ(kLabelBar, got_label); + + EXPECT_TRUE(data_use_matcher()->MatchesAppPackageName(kAppBaz, &got_label)); + EXPECT_EQ(kLabelBaz, got_label); + + EXPECT_FALSE(data_use_matcher()->MatchesAppPackageName( + "com.example.unmatched", &got_label)); + EXPECT_EQ(std::string(), got_label); + + EXPECT_FALSE( + data_use_matcher()->MatchesAppPackageName(std::string(), &got_label)); + EXPECT_EQ(std::string(), got_label); + + EXPECT_FALSE( + data_use_matcher()->MatchesAppPackageName(std::string(), &got_label)); + + // An empty URL pattern should not match with any URL pattern. + EXPECT_FALSE(data_use_matcher()->MatchesURL(GURL(""), &got_label)); + EXPECT_FALSE( + data_use_matcher()->MatchesURL(GURL("http://www.baz.com"), &got_label)); +} + +} // namespace android + +} // namespace chrome
diff --git a/chrome/browser/android/data_usage/data_use_tab_model.cc b/chrome/browser/android/data_usage/data_use_tab_model.cc index 49900a9..54e15f4 100644 --- a/chrome/browser/android/data_usage/data_use_tab_model.cc +++ b/chrome/browser/android/data_usage/data_use_tab_model.cc
@@ -8,6 +8,7 @@ #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" +#include "chrome/browser/android/data_usage/data_use_matcher.h" #include "chrome/browser/android/data_usage/external_data_use_observer.h" #include "components/data_usage/core/data_use.h" #include "components/variations/variations_associated_data.h" @@ -52,13 +53,12 @@ namespace android { DataUseTabModel::DataUseTabModel( - const ExternalDataUseObserver* data_use_observer, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) - : data_use_observer_(data_use_observer), - max_tab_entries_(GetMaxTabEntries()), + const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) + : max_tab_entries_(GetMaxTabEntries()), ui_task_runner_(ui_task_runner), weak_factory_(this) { DCHECK(ui_task_runner_); + data_use_matcher_.reset(new DataUseMatcher(weak_factory_.GetWeakPtr())); } DataUseTabModel::~DataUseTabModel() { @@ -93,13 +93,13 @@ if (transition == TRANSITION_FROM_EXTERNAL_APP) { // Package name should match, for transitions from external app. if (!package.empty() && - data_use_observer_->MatchesAppPackageName(package, &label)) { + data_use_matcher_->MatchesAppPackageName(package, &label)) { DCHECK(!label.empty()); start_tracking = true; } } if (!start_tracking && !url.is_empty() && - data_use_observer_->Matches(url, &label)) { + data_use_matcher_->MatchesURL(url, &label)) { DCHECK(!label.empty()); start_tracking = true; } @@ -166,6 +166,14 @@ observers_.push_back(observer); } +void DataUseTabModel::RegisterURLRegexes( + const std::vector<std::string>* app_package_name, + const std::vector<std::string>* domain_path_regex, + const std::vector<std::string>* label) { + data_use_matcher_->RegisterURLRegexes(app_package_name, domain_path_regex, + label); +} + base::TimeTicks DataUseTabModel::Now() const { return base::TimeTicks::Now(); }
diff --git a/chrome/browser/android/data_usage/data_use_tab_model.h b/chrome/browser/android/data_usage/data_use_tab_model.h index 44e3b5f..a59b757 100644 --- a/chrome/browser/android/data_usage/data_use_tab_model.h +++ b/chrome/browser/android/data_usage/data_use_tab_model.h
@@ -7,11 +7,13 @@ #include <list> #include <string> +#include <vector> #include "base/containers/hash_tables.h" #include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" @@ -32,7 +34,7 @@ namespace android { -class ExternalDataUseObserver; +class DataUseMatcher; // Models tracking and labeling of data usage within each Tab. Within each tab, // the model tracks the data use of a sequence of navigations in a "tracking @@ -76,8 +78,8 @@ virtual void NotifyTrackingEnding(SessionID::id_type tab_id) = 0; }; - DataUseTabModel(const ExternalDataUseObserver* data_use_observer, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); + explicit DataUseTabModel( + const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner); virtual ~DataUseTabModel(); @@ -113,6 +115,12 @@ // TODO(tbansal): Remove observers that have been destroyed. void AddObserver(base::WeakPtr<TabDataUseObserver> observer); + // Called by ExternalDataUseObserver to register multiple case-insensitive + // regular expressions. + void RegisterURLRegexes(const std::vector<std::string>* app_package_name, + const std::vector<std::string>* domain_path_regex, + const std::vector<std::string>* label); + protected: // Notifies the observers that a data usage tracking session started for // |tab_id|. Protected for testing. @@ -161,10 +169,6 @@ // size is |kMaxTabEntries|. void CompactTabEntries(); - // Contains the ExternalDataUseObserver. The caller must ensure that the - // |data_use_observer_| outlives this instance. - const ExternalDataUseObserver* data_use_observer_; - // Collection of observers that receive tracking session start and end // notifications. Notifications are posted on UI thread. std::list<base::WeakPtr<TabDataUseObserver>> observers_; @@ -178,6 +182,9 @@ // |ui_task_runner_| is used to notify TabDataUseObserver on UI thread. scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; + // Stores the matching patterns. + scoped_ptr<DataUseMatcher> data_use_matcher_; + base::ThreadChecker thread_checker_; base::WeakPtrFactory<DataUseTabModel> weak_factory_;
diff --git a/chrome/browser/android/data_usage/data_use_tab_model_test_utils.cc b/chrome/browser/android/data_usage/data_use_tab_model_test_utils.cc index 2ee925e..0c2692d 100644 --- a/chrome/browser/android/data_usage/data_use_tab_model_test_utils.cc +++ b/chrome/browser/android/data_usage/data_use_tab_model_test_utils.cc
@@ -6,8 +6,8 @@ #include "base/memory/ref_counted.h" #include "base/single_thread_task_runner.h" +#include "chrome/browser/android/data_usage/data_use_matcher.h" #include "chrome/browser/android/data_usage/data_use_tab_model.h" -#include "chrome/browser/android/data_usage/external_data_use_observer.h" #include "components/data_usage/core/data_use.h" #include "url/gurl.h" @@ -16,16 +16,15 @@ namespace android { TestDataUseTabModel::TestDataUseTabModel( - const ExternalDataUseObserver* data_use_observer, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) - : DataUseTabModel(data_use_observer, ui_task_runner.get()) {} + const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) + : DataUseTabModel(ui_task_runner) {} TestDataUseTabModel::~TestDataUseTabModel() {} bool TestDataUseTabModel::GetLabelForDataUse( const data_usage::DataUse& data_use, std::string* output_label) const { - return data_use_observer_->Matches(data_use.url, output_label); + return data_use_matcher_->MatchesURL(data_use.url, output_label); } } // namespace android
diff --git a/chrome/browser/android/data_usage/data_use_tab_model_test_utils.h b/chrome/browser/android/data_usage/data_use_tab_model_test_utils.h index da932d62..27d05f5 100644 --- a/chrome/browser/android/data_usage/data_use_tab_model_test_utils.h +++ b/chrome/browser/android/data_usage/data_use_tab_model_test_utils.h
@@ -18,13 +18,10 @@ namespace android { -class ExternalDataUseObserver; - class TestDataUseTabModel : public DataUseTabModel { public: - TestDataUseTabModel( - const ExternalDataUseObserver* data_use_observer, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); + explicit TestDataUseTabModel( + const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner); ~TestDataUseTabModel() override;
diff --git a/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc b/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc index dccdf6b..b76fe5c 100644 --- a/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc +++ b/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc
@@ -8,6 +8,8 @@ #include <string> +#include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" #include "base/strings/stringprintf.h" @@ -58,8 +60,8 @@ public: DataUseTabModelNowTest( const ExternalDataUseObserver* data_use_observer, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) - : DataUseTabModel(data_use_observer, ui_task_runner) {} + const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) + : DataUseTabModel(ui_task_runner) {} ~DataUseTabModelNowTest() override {} @@ -80,13 +82,11 @@ class DataUseTabModelTest : public testing::Test { public: - DataUseTabModelTest() {} + DataUseTabModelTest() + : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {} protected: void SetUp() override { - thread_bundle_.reset(new content::TestBrowserThreadBundle( - content::TestBrowserThreadBundle::IO_MAINLOOP)); - data_use_aggregator_.reset(new data_usage::DataUseAggregator( scoped_ptr<data_usage::DataUseAnnotator>(), scoped_ptr<data_usage::DataUseAmortizer>())); @@ -181,8 +181,8 @@ const std::vector<std::string>& app_package_names, const std::vector<std::string>& domain_regexes, const std::vector<std::string>& labels) { - data_use_observer_->RegisterURLRegexes(&app_package_names, &domain_regexes, - &labels); + data_use_tab_model_->RegisterURLRegexes(&app_package_names, &domain_regexes, + &labels); } scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_; @@ -192,7 +192,7 @@ DataUseTabModelNowTest* data_use_tab_model_; private: - scoped_ptr<content::TestBrowserThreadBundle> thread_bundle_; + content::TestBrowserThreadBundle thread_bundle_; DISALLOW_COPY_AND_ASSIGN(DataUseTabModelTest); };
diff --git a/chrome/browser/android/data_usage/data_use_ui_tab_model_unittest.cc b/chrome/browser/android/data_usage/data_use_ui_tab_model_unittest.cc index fd16f52d..3780ab3 100644 --- a/chrome/browser/android/data_usage/data_use_ui_tab_model_unittest.cc +++ b/chrome/browser/android/data_usage/data_use_ui_tab_model_unittest.cc
@@ -33,8 +33,8 @@ public: TestDataUseTabModel( ExternalDataUseObserver* external_data_use_observer, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) - : DataUseTabModel(external_data_use_observer, ui_task_runner) {} + const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) + : DataUseTabModel(ui_task_runner) {} ~TestDataUseTabModel() override {} @@ -56,11 +56,11 @@ return data_use_tab_model_.get(); } - void FetchMatchingRulesDone(const std::vector<std::string>& app_package_name, - const std::vector<std::string>& domain_path_regex, - const std::vector<std::string>& label) { - external_data_use_observer_->FetchMatchingRulesDone( - &app_package_name, &domain_path_regex, &label); + void RegisterURLRegexes(const std::vector<std::string>& app_package_name, + const std::vector<std::string>& domain_path_regex, + const std::vector<std::string>& label) { + data_use_tab_model_->RegisterURLRegexes(&app_package_name, + &domain_path_regex, &label); } protected: @@ -111,9 +111,9 @@ std::vector<std::string> url_regexes; url_regexes.push_back( "http://www[.]foo[.]com/#q=.*|https://www[.]foo[.]com/#q=.*"); - FetchMatchingRulesDone( - std::vector<std::string>(url_regexes.size(), kFooPackage), url_regexes, - std::vector<std::string>(url_regexes.size(), kFooLabel)); + RegisterURLRegexes(std::vector<std::string>(url_regexes.size(), kFooPackage), + url_regexes, + std::vector<std::string>(url_regexes.size(), kFooLabel)); const struct { ui::PageTransition transition_type;
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.cc b/chrome/browser/android/data_usage/external_data_use_observer.cc index 94eea52..d951d11 100644 --- a/chrome/browser/android/data_usage/external_data_use_observer.cc +++ b/chrome/browser/android/data_usage/external_data_use_observer.cc
@@ -16,8 +16,6 @@ #include "components/data_usage/core/data_use.h" #include "components/variations/variations_associated_data.h" #include "content/public/browser/browser_thread.h" -#include "third_party/re2/re2/re2.h" -#include "url/gurl.h" namespace { @@ -74,12 +72,11 @@ ExternalDataUseObserver::ExternalDataUseObserver( data_usage::DataUseAggregator* data_use_aggregator, - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) + const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, + const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) : data_use_aggregator_(data_use_aggregator), matching_rules_fetch_pending_(false), submit_data_report_pending_(false), - registered_as_observer_(false), ui_task_runner_(ui_task_runner), previous_report_time_(base::Time::Now()), last_matching_rules_fetch_time_(base::TimeTicks::Now()), @@ -104,18 +101,16 @@ io_task_runner, GetWeakPtr())); // |this| owns and must outlive the |data_use_tab_model_|. - data_use_tab_model_.reset(new DataUseTabModel(this, ui_task_runner_)); + data_use_tab_model_.reset(new DataUseTabModel(ui_task_runner_)); matching_rules_fetch_pending_ = true; data_use_aggregator_->AddObserver(this); - registered_as_observer_ = true; } ExternalDataUseObserver::~ExternalDataUseObserver() { DCHECK(thread_checker_.CalledOnValidThread()); - if (registered_as_observer_) - data_use_aggregator_->RemoveObserver(this); + data_use_aggregator_->RemoveObserver(this); // Delete |external_data_use_observer_bridge_| on the UI thread. if (!ui_task_runner_->DeleteSoon(FROM_HERE, @@ -131,7 +126,8 @@ const std::vector<std::string>* label) { DCHECK(thread_checker_.CalledOnValidThread()); - RegisterURLRegexes(app_package_name, domain_path_regex, label); + data_use_tab_model_->RegisterURLRegexes(app_package_name, domain_path_regex, + label); matching_rules_fetch_pending_ = false; // Process buffered reports. } @@ -256,94 +252,11 @@ report.bytes_uploaded)); } -void ExternalDataUseObserver::RegisterURLRegexes( - const std::vector<std::string>* app_package_name, - const std::vector<std::string>* domain_path_regex, - const std::vector<std::string>* label) { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK_EQ(app_package_name->size(), domain_path_regex->size()); - DCHECK_EQ(app_package_name->size(), label->size()); - - base::hash_set<std::string> removed_matching_rule_labels; - - for (const auto& matching_rule : matching_rules_) - removed_matching_rule_labels.insert(matching_rule->label()); - - matching_rules_.clear(); - re2::RE2::Options options(re2::RE2::DefaultOptions); - options.set_case_sensitive(false); - - for (size_t i = 0; i < domain_path_regex->size(); ++i) { - const std::string& url_regex = domain_path_regex->at(i); - if (url_regex.empty() && app_package_name[i].empty()) - continue; - scoped_ptr<re2::RE2> pattern(new re2::RE2(url_regex, options)); - if (!pattern->ok()) - continue; - DCHECK(!label->at(i).empty()); - matching_rules_.push_back(make_scoped_ptr(new MatchingRule( - app_package_name->at(i), pattern.Pass(), label->at(i)))); - - removed_matching_rule_labels.erase(label->at(i)); - } - - for (std::string label : removed_matching_rule_labels) - data_use_tab_model_->OnTrackingLabelRemoved(label); - - if (matching_rules_.size() == 0 && registered_as_observer_) { - // Unregister as an observer if no regular expressions were received. - data_use_aggregator_->RemoveObserver(this); - registered_as_observer_ = false; - } else if (matching_rules_.size() > 0 && !registered_as_observer_) { - // Register as an observer if regular expressions were received. - data_use_aggregator_->AddObserver(this); - registered_as_observer_ = true; - } -} - base::WeakPtr<ExternalDataUseObserver> ExternalDataUseObserver::GetWeakPtr() { DCHECK(thread_checker_.CalledOnValidThread()); return weak_factory_.GetWeakPtr(); } -bool ExternalDataUseObserver::Matches(const GURL& gurl, - std::string* label) const { - DCHECK(thread_checker_.CalledOnValidThread()); - *label = ""; - - if (!gurl.is_valid() || gurl.is_empty()) - return false; - - for (const auto& matching_rule : matching_rules_) { - const re2::RE2* pattern = matching_rule->pattern(); - if (re2::RE2::FullMatch(gurl.spec(), *pattern)) { - *label = matching_rule->label(); - return true; - } - } - - return false; -} - -bool ExternalDataUseObserver::MatchesAppPackageName( - const std::string& app_package_name, - std::string* label) const { - DCHECK(thread_checker_.CalledOnValidThread()); - *label = ""; - - if (app_package_name.empty()) - return false; - - for (const auto& matching_rule : matching_rules_) { - if (app_package_name == matching_rule->app_package_name()) { - *label = matching_rule->label(); - return true; - } - } - - return false; -} - DataUseTabModel* ExternalDataUseObserver::GetDataUseTabModel() const { DCHECK(thread_checker_.CalledOnValidThread()); return data_use_tab_model_.get(); @@ -388,29 +301,6 @@ return hash; } -ExternalDataUseObserver::MatchingRule::MatchingRule( - const std::string& app_package_name, - scoped_ptr<re2::RE2> pattern, - const std::string& label) - : app_package_name_(app_package_name), - pattern_(pattern.Pass()), - label_(label) {} - -ExternalDataUseObserver::MatchingRule::~MatchingRule() {} - -const re2::RE2* ExternalDataUseObserver::MatchingRule::pattern() const { - return pattern_.get(); -} - -const std::string& ExternalDataUseObserver::MatchingRule::app_package_name() - const { - return app_package_name_; -} - -const std::string& ExternalDataUseObserver::MatchingRule::label() const { - return label_; -} - } // namespace android } // namespace chrome
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.h b/chrome/browser/android/data_usage/external_data_use_observer.h index 808960e..84792ed7 100644 --- a/chrome/browser/android/data_usage/external_data_use_observer.h +++ b/chrome/browser/android/data_usage/external_data_use_observer.h
@@ -21,8 +21,6 @@ #include "components/data_usage/core/data_use_aggregator.h" #include "net/base/network_change_notifier.h" -class GURL; - namespace base { class SingleThreadTaskRunner; } @@ -31,10 +29,6 @@ struct DataUse; } -namespace re2 { -class RE2; -} - namespace chrome { namespace android { @@ -56,21 +50,10 @@ ExternalDataUseObserver( data_usage::DataUseAggregator* data_use_aggregator, - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); + const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, + const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner); ~ExternalDataUseObserver() override; - // Returns true if the |gurl| matches the registered regular expressions. - // |label| must not be null. If a match is found, the |label| is set to the - // matching rule's label. - bool Matches(const GURL& gurl, std::string* label) const; - - // Returns true if the |app_package_name| matches the registered package - // names. |label| must not be null. If a match is found, the |label| is set - // to the matching rule's label. - bool MatchesAppPackageName(const std::string& app_package_name, - std::string* label) const; - DataUseTabModel* GetDataUseTabModel() const; // Called by ExternalDataUseObserverBridge::FetchMatchingRulesDone when new @@ -100,19 +83,15 @@ friend class ExternalDataUseObserverTest; FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, BufferDataUseReports); FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, BufferSize); - FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, ChangeRegex); FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, HashFunction); FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, LabelRemoved); FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, MultipleMatchingRules); - FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, MultipleRegex); FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, PeriodicFetchMatchingRules); FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, ReportsMergedCorrectly); FRIEND_TEST_ALL_PREFIXES(DataUseUITabModelTest, ReportTabEventsTest); - FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, SingleRegex); FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, TimestampsMergedCorrectly); - FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, TwoRegex); FRIEND_TEST_ALL_PREFIXES(ExternalDataUseObserverTest, Variations); // DataUseReportKey is a unique identifier for a data use report. @@ -174,31 +153,6 @@ typedef base::hash_map<DataUseReportKey, DataUseReport, DataUseReportKeyHash> DataUseReports; - // Stores the matching rules. - class MatchingRule { - public: - MatchingRule(const std::string& app_package_name, - scoped_ptr<re2::RE2> pattern, - const std::string& label); - ~MatchingRule(); - - const re2::RE2* pattern() const; - const std::string& app_package_name() const; - const std::string& label() const; - - private: - // Package name of the app that should be matched. - const std::string app_package_name_; - - // RE2 pattern to match against URLs. - scoped_ptr<re2::RE2> pattern_; - - // Opaque label that uniquely identifies this matching rule. - const std::string label_; - - DISALLOW_COPY_AND_ASSIGN(MatchingRule); - }; - // Maximum buffer size. If an entry needs to be added to the buffer that has // size |kMaxBufferSize|, then the oldest entry will be removed. static const size_t kMaxBufferSize; @@ -223,14 +177,6 @@ // submitted is the oldest one buffered. void SubmitBufferedDataUseReport(); - // Registers multiple case-insensitive regular expressions. If the url of the - // data use request matches any of the regular expression, the observation is - // passed to the |external_data_use_observer_bridge_|. All vectors must be - // non-null and are owned by the caller. - void RegisterURLRegexes(const std::vector<std::string>* app_package_name, - const std::vector<std::string>* domain_path_regex, - const std::vector<std::string>* label); - base::WeakPtr<ExternalDataUseObserver> GetWeakPtr(); // Aggregator that sends data use observations to |this|. @@ -245,16 +191,10 @@ // True if callback from |SubmitDataUseReportCallback| is currently pending. bool submit_data_report_pending_; - // Contains matching rules. - std::vector<scoped_ptr<MatchingRule>> matching_rules_; - // Buffered data reports that need to be submitted to the // |external_data_use_observer_bridge_|. DataUseReports buffered_data_reports_; - // True if |this| is currently registered as a data use observer. - bool registered_as_observer_; - // |ui_task_runner_| is used to call ExternalDataUseObserverBridge methods on // UI thread. scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
diff --git a/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc b/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc index 80d80ef..cf74c992 100644 --- a/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc +++ b/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc
@@ -47,8 +47,7 @@ // Wait for |external_data_use_observer_| to create the Java object. base::RunLoop().RunUntilIdle(); - test_data_use_tab_model_ = new TestDataUseTabModel( - external_data_use_observer_.get(), ui_task_runner_.get()); + test_data_use_tab_model_ = new TestDataUseTabModel(ui_task_runner_.get()); external_data_use_observer_->data_use_tab_model_.reset( test_data_use_tab_model_); } @@ -93,201 +92,6 @@ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; }; -TEST_F(ExternalDataUseObserverTest, SingleRegex) { - const struct { - std::string url; - std::string regex; - bool expect_match; - } tests[] = { - {"http://www.google.com", "http://www.google.com/", true}, - {"http://www.Google.com", "http://www.google.com/", true}, - {"http://www.googleacom", "http://www.google.com/", true}, - {"http://www.googleaacom", "http://www.google.com/", false}, - {"http://www.google.com", "https://www.google.com/", false}, - {"http://www.google.com", "{http|https}://www[.]google[.]com/search.*", - false}, - {"https://www.google.com/search=test", - "https://www[.]google[.]com/search.*", true}, - {"https://www.googleacom/search=test", - "https://www[.]google[.]com/search.*", false}, - {"https://www.google.com/Search=test", - "https://www[.]google[.]com/search.*", true}, - {"www.google.com", "http://www.google.com", false}, - {"www.google.com:80", "http://www.google.com", false}, - {"http://www.google.com:80", "http://www.google.com", false}, - {"http://www.google.com:80/", "http://www.google.com/", true}, - {"", "http://www.google.com", false}, - {"", "", false}, - {"https://www.google.com", "http://www.google.com", false}, - }; - - std::string label("test"); - for (size_t i = 0; i < arraysize(tests); ++i) { - FetchMatchingRulesDone( - // App package name not specified in the matching rule. - std::vector<std::string>(1, std::string()), - std::vector<std::string>(1, tests[i].regex), - std::vector<std::string>(1, "label")); - EXPECT_EQ(tests[i].expect_match, - external_data_use_observer()->Matches(GURL(tests[i].url), &label)) - << i; - - // Verify label matches the expected label. - std::string expected_label = ""; - if (tests[i].expect_match) - expected_label = "label"; - - EXPECT_EQ(expected_label, label); - EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( - "com.example.helloworld", &label)) - << i; - // Empty package name should not match against empty package name in the - // matching rule. - EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( - std::string(), &label)) - << i; - } -} - -TEST_F(ExternalDataUseObserverTest, TwoRegex) { - const struct { - std::string url; - std::string regex1; - std::string regex2; - bool expect_match; - } tests[] = { - {"http://www.google.com", "http://www.google.com/", - "https://www.google.com/", true}, - {"http://www.googleacom", "http://www.google.com/", - "http://www.google.com/", true}, - {"https://www.google.com", "http://www.google.com/", - "https://www.google.com/", true}, - {"https://www.googleacom", "http://www.google.com/", - "https://www.google.com/", true}, - {"http://www.google.com", "{http|https}://www[.]google[.]com/search.*", - "", false}, - {"http://www.google.com/search=test", - "http://www[.]google[.]com/search.*", - "https://www[.]google[.]com/search.*", true}, - {"https://www.google.com/search=test", - "http://www[.]google[.]com/search.*", - "https://www[.]google[.]com/search.*", true}, - {"http://google.com/search=test", "http://www[.]google[.]com/search.*", - "https://www[.]google[.]com/search.*", false}, - {"https://www.googleacom/search=test", "", - "https://www[.]google[.]com/search.*", false}, - {"https://www.google.com/Search=test", "", - "https://www[.]google[.]com/search.*", true}, - {"www.google.com", "http://www.google.com", "", false}, - {"www.google.com:80", "http://www.google.com", "", false}, - {"http://www.google.com:80", "http://www.google.com", "", false}, - {"", "http://www.google.com", "", false}, - {"https://www.google.com", "http://www.google.com", "", false}, - }; - - std::string got_label; - for (size_t i = 0; i < arraysize(tests); ++i) { - std::vector<std::string> url_regexes; - url_regexes.push_back(tests[i].regex1 + "|" + tests[i].regex2); - const std::string label("label"); - FetchMatchingRulesDone( - std::vector<std::string>(url_regexes.size(), "com.example.helloworld"), - url_regexes, std::vector<std::string>(url_regexes.size(), label)); - EXPECT_EQ(tests[i].expect_match, external_data_use_observer()->Matches( - GURL(tests[i].url), &got_label)) - << i; - const std::string expected_label = - tests[i].expect_match ? label : std::string(); - EXPECT_EQ(expected_label, got_label); - - EXPECT_TRUE(external_data_use_observer()->MatchesAppPackageName( - "com.example.helloworld", &got_label)) - << i; - EXPECT_EQ(label, got_label); - } -} - -TEST_F(ExternalDataUseObserverTest, MultipleRegex) { - std::vector<std::string> url_regexes; - url_regexes.push_back( - "https?://www[.]google[.]com/#q=.*|https?://www[.]google[.]com[.]ph/" - "#q=.*|https?://www[.]google[.]com[.]ph/[?]gws_rd=ssl#q=.*"); - FetchMatchingRulesDone( - std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, - std::vector<std::string>(url_regexes.size(), "label")); - - const struct { - std::string url; - bool expect_match; - } tests[] = { - {"", false}, - {"http://www.google.com", false}, - {"http://www.googleacom", false}, - {"https://www.google.com", false}, - {"https://www.googleacom", false}, - {"https://www.google.com", false}, - {"quic://www.google.com/q=test", false}, - {"http://www.google.com/q=test", false}, - {"http://www.google.com/.q=test", false}, - {"http://www.google.com/#q=test", true}, - {"https://www.google.com/#q=test", true}, - {"https://www.google.com.ph/#q=test+abc", true}, - {"https://www.google.com.ph/?gws_rd=ssl#q=test+abc", true}, - {"http://www.google.com.ph/#q=test", true}, - {"https://www.google.com.ph/#q=test", true}, - {"http://www.google.co.in/#q=test", false}, - {"http://google.com/#q=test", false}, - {"https://www.googleacom/#q=test", false}, - {"https://www.google.com/#Q=test", true}, // case in-sensitive - {"www.google.com/#q=test", false}, - {"www.google.com:80/#q=test", false}, - {"http://www.google.com:80/#q=test", true}, - {"http://www.google.com:80/search?=test", false}, - }; - - std::string label; - for (size_t i = 0; i < arraysize(tests); ++i) { - EXPECT_EQ(tests[i].expect_match, - external_data_use_observer()->Matches(GURL(tests[i].url), &label)) - << i << " " << tests[i].url; - } -} - -TEST_F(ExternalDataUseObserverTest, ChangeRegex) { - std::string label; - // When no regex is specified, the URL match should fail. - EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label)); - EXPECT_FALSE(external_data_use_observer()->Matches( - GURL("http://www.google.com"), &label)); - - std::vector<std::string> url_regexes; - url_regexes.push_back("http://www[.]google[.]com/#q=.*"); - url_regexes.push_back("https://www[.]google[.]com/#q=.*"); - FetchMatchingRulesDone( - std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, - std::vector<std::string>(url_regexes.size(), "label")); - - EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label)); - EXPECT_TRUE(external_data_use_observer()->Matches( - GURL("http://www.google.com#q=abc"), &label)); - EXPECT_FALSE(external_data_use_observer()->Matches( - GURL("http://www.google.co.in#q=abc"), &label)); - - // Change the regular expressions to verify that the new regexes replace - // the ones specified before. - url_regexes.clear(); - url_regexes.push_back("http://www[.]google[.]co[.]in/#q=.*"); - url_regexes.push_back("https://www[.]google[.]co[.]in/#q=.*"); - FetchMatchingRulesDone( - std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, - std::vector<std::string>(url_regexes.size(), "label")); - EXPECT_FALSE(external_data_use_observer()->Matches(GURL(""), &label)); - EXPECT_FALSE(external_data_use_observer()->Matches( - GURL("http://www.google.com#q=abc"), &label)); - EXPECT_TRUE(external_data_use_observer()->Matches( - GURL("http://www.google.co.in#q=abc"), &label)); -} - // Tests that tab model is notified when tracking labels are removed. TEST_F(ExternalDataUseObserverTest, LabelRemoved) { std::vector<std::string> labels; @@ -510,26 +314,6 @@ kLabelBar, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc"); EXPECT_NE(buffered_data_reports().end(), buffered_data_reports().find(key_bar)); - - // Test if labels are matched properly for app package names. - std::string got_label; - EXPECT_TRUE( - external_data_use_observer()->MatchesAppPackageName(kAppFoo, &got_label)); - EXPECT_EQ(kLabelFoo, got_label); - - got_label = ""; - EXPECT_TRUE( - external_data_use_observer()->MatchesAppPackageName(kAppBar, &got_label)); - EXPECT_EQ(kLabelBar, got_label); - - got_label = ""; - EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( - "com.example.unmatched", &got_label)); - EXPECT_EQ(std::string(), got_label); - - EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( - std::string(), &got_label)); - EXPECT_EQ(std::string(), got_label); } // Tests that hash function reports distinct values. This test may fail if there
diff --git a/chrome/browser/android/offline_pages/offline_page_bridge.cc b/chrome/browser/android/offline_pages/offline_page_bridge.cc index bc912ffe..62f1aac5 100644 --- a/chrome/browser/android/offline_pages/offline_page_bridge.cc +++ b/chrome/browser/android/offline_pages/offline_page_bridge.cc
@@ -20,6 +20,7 @@ #include "jni/OfflinePageBridge_jni.h" #include "net/base/filename_util.h" +using base::android::ConvertJavaStringToUTF8; using base::android::ConvertUTF8ToJavaString; using base::android::ScopedJavaGlobalRef; using base::android::ScopedJavaLocalRef; @@ -73,7 +74,7 @@ static jboolean CanSavePage(JNIEnv* env, const JavaParamRef<jclass>& clazz, const JavaParamRef<jstring>& j_url) { - GURL url(base::android::ConvertJavaStringToUTF8(env, j_url)); + GURL url(ConvertJavaStringToUTF8(env, j_url)); return url.is_valid() && OfflinePageModel::CanSavePage(url); } @@ -143,15 +144,18 @@ offline_page_model_->GetPageByBookmarkId(bookmark_id); if (!offline_page) return ScopedJavaLocalRef<jobject>(); + return CreateOfflinePageItem(env, *offline_page); +} - return Java_OfflinePageBridge_createOfflinePageItem( - env, ConvertUTF8ToJavaString(env, offline_page->url.spec()).obj(), - offline_page->bookmark_id, - ConvertUTF8ToJavaString(env, offline_page->GetOfflineURL().spec()).obj(), - offline_page->file_size, - offline_page->creation_time.ToJavaTime(), - offline_page->access_count, - offline_page->last_access_time.ToJavaTime()); +ScopedJavaLocalRef<jobject> OfflinePageBridge::GetPageByOnlineURL( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + const JavaParamRef<jstring>& online_url) { + const OfflinePageItem* offline_page = offline_page_model_->GetPageByOnlineURL( + GURL(ConvertJavaStringToUTF8(env, online_url))); + if (!offline_page) + return ScopedJavaLocalRef<jobject>(); + return CreateOfflinePageItem(env, *offline_page); } void OfflinePageBridge::SavePage(JNIEnv* env, @@ -231,6 +235,19 @@ Java_OfflinePageBridge_offlinePageModelLoaded(env, obj.obj()); } +ScopedJavaLocalRef<jobject> OfflinePageBridge::CreateOfflinePageItem( + JNIEnv* env, + const OfflinePageItem& offline_page) const { + return Java_OfflinePageBridge_createOfflinePageItem( + env, ConvertUTF8ToJavaString(env, offline_page.url.spec()).obj(), + offline_page.bookmark_id, + ConvertUTF8ToJavaString(env, offline_page.GetOfflineURL().spec()).obj(), + offline_page.file_size, + offline_page.creation_time.ToJavaTime(), + offline_page.access_count, + offline_page.last_access_time.ToJavaTime()); +} + // static bool OfflinePageBridge::MightBeOfflineURL(const GURL& url) { // It has to be a file URL ending with .mhtml extension.
diff --git a/chrome/browser/android/offline_pages/offline_page_bridge.h b/chrome/browser/android/offline_pages/offline_page_bridge.h index 642f7c0..cf53187b5 100644 --- a/chrome/browser/android/offline_pages/offline_page_bridge.h +++ b/chrome/browser/android/offline_pages/offline_page_bridge.h
@@ -48,6 +48,11 @@ const base::android::JavaParamRef<jobject>& obj, jlong bookmark_id); + base::android::ScopedJavaLocalRef<jobject> GetPageByOnlineURL( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + const base::android::JavaParamRef<jstring>& online_url); + void SavePage(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& j_callback_obj, @@ -76,6 +81,10 @@ private: void NotifyIfDoneLoading() const; + base::android::ScopedJavaLocalRef<jobject> CreateOfflinePageItem( + JNIEnv* env, + const OfflinePageItem& offline_page) const; + JavaObjectWeakGlobalRef weak_java_ref_; // Not owned. OfflinePageModel* offline_page_model_;
diff --git a/chrome/browser/android/url_utilities.cc b/chrome/browser/android/url_utilities.cc index 27c9ed43..742cd09db 100644 --- a/chrome/browser/android/url_utilities.cc +++ b/chrome/browser/android/url_utilities.cc
@@ -46,6 +46,15 @@ filter); } +static jboolean SameHost(JNIEnv* env, + const JavaParamRef<jclass>& clazz, + const JavaParamRef<jstring>& url_1_str, + const JavaParamRef<jstring>& url_2_str) { + GURL url_1 = ConvertJavaStringToGURL(env, url_1_str); + GURL url_2 = ConvertJavaStringToGURL(env, url_2_str); + return url_1.host() == url_2.host(); +} + static ScopedJavaLocalRef<jstring> GetDomainAndRegistry( JNIEnv* env, const JavaParamRef<jclass>& clazz,
diff --git a/chrome/browser/app_controller_mac_unittest.mm b/chrome/browser/app_controller_mac_unittest.mm index 5f96a993..5a9d8dd 100644 --- a/chrome/browser/app_controller_mac_unittest.mm +++ b/chrome/browser/app_controller_mac_unittest.mm
@@ -15,7 +15,6 @@ #include "chrome/browser/signin/signin_error_controller_factory.h" #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/sync/profile_sync_service_factory.h" -#include "chrome/browser/sync/profile_sync_service_mock.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/pref_names.h" #include "chrome/grit/chromium_strings.h" @@ -24,6 +23,7 @@ #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" #include "components/browser_sync/browser/profile_sync_service.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include "components/signin/core/browser/fake_auth_status_provider.h" #include "components/signin/core/browser/signin_error_controller.h" #include "components/signin/core/browser/signin_manager.h"
diff --git a/chrome/browser/apps/app_browsertest.cc b/chrome/browser/apps/app_browsertest.cc index 68adec3d..ea0c629 100644 --- a/chrome/browser/apps/app_browsertest.cc +++ b/chrome/browser/apps/app_browsertest.cc
@@ -877,29 +877,11 @@ } // namespace -// http://crbug.com/246634 -#if defined(OS_CHROMEOS) -#define MAYBE_ReOpenedWithID DISABLED_ReOpenedWithID -#else -#define MAYBE_ReOpenedWithID ReOpenedWithID -#endif -IN_PROC_BROWSER_TEST_F(PlatformAppDevToolsBrowserTest, MAYBE_ReOpenedWithID) { -#if defined(OS_WIN) && defined(USE_ASH) - // Disable this test in Metro+Ash for now (http://crbug.com/262796). - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kAshBrowserTests)) - return; -#endif +IN_PROC_BROWSER_TEST_F(PlatformAppDevToolsBrowserTest, ReOpenedWithID) { RunTestWithDevTools("minimal_id", RELAUNCH | HAS_ID); } -// http://crbug.com/246999 -#if defined(OS_CHROMEOS) || defined(OS_WIN) -#define MAYBE_ReOpenedWithURL DISABLED_ReOpenedWithURL -#else -#define MAYBE_ReOpenedWithURL ReOpenedWithURL -#endif -IN_PROC_BROWSER_TEST_F(PlatformAppDevToolsBrowserTest, MAYBE_ReOpenedWithURL) { +IN_PROC_BROWSER_TEST_F(PlatformAppDevToolsBrowserTest, ReOpenedWithURL) { RunTestWithDevTools("minimal", RELAUNCH); }
diff --git a/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chrome/browser/extensions/api/sessions/sessions_apitest.cc index 2343a8d..900535d 100644 --- a/chrome/browser/extensions/api/sessions/sessions_apitest.cc +++ b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
@@ -14,7 +14,6 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/sync/chrome_sync_client.h" #include "chrome/browser/sync/profile_sync_service_factory.h" -#include "chrome/browser/sync/profile_sync_service_mock.h" #include "chrome/browser/sync/profile_sync_test_util.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" @@ -22,6 +21,7 @@ #include "chrome/test/base/test_switches.h" #include "chrome/test/base/testing_browser_process.h" #include "components/browser_sync/browser/profile_sync_service.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include "components/sync_driver/local_device_info_provider_mock.h" #include "components/sync_driver/sync_api_component_factory_mock.h" #include "extensions/browser/api_test_utils.h"
diff --git a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc index e64820e..dab20b6 100644 --- a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc +++ b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc
@@ -16,8 +16,8 @@ #include "chrome/browser/extensions/test_extension_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/profile_sync_service_factory.h" -#include "chrome/browser/sync/profile_sync_service_mock.h" #include "chrome/browser/sync/profile_sync_test_util.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include "components/sync_driver/device_info.h" #include "content/public/test/test_browser_thread_bundle.h" #include "extensions/common/extension.h"
diff --git a/chrome/browser/resources/chromeos/login/gaia_card.css b/chrome/browser/resources/chromeos/login/gaia_card.css index dda92a8f..8fd09300 100644 --- a/chrome/browser/resources/chromeos/login/gaia_card.css +++ b/chrome/browser/resources/chromeos/login/gaia_card.css
@@ -22,7 +22,7 @@ } .gaia-footer { - background-color: rgb(238, 238, 238); + background-color: white; } .gaia-footer {
diff --git a/chrome/browser/resources/chromeos/login/gaia_input.css b/chrome/browser/resources/chromeos/login/gaia_input.css index f0427d6b..c23d0e0 100644 --- a/chrome/browser/resources/chromeos/login/gaia_input.css +++ b/chrome/browser/resources/chromeos/login/gaia_input.css
@@ -29,7 +29,6 @@ } #domainLabel { - color: rgba(0, 0, 0, 0.54); direction: ltr; width: auto; }
diff --git a/chrome/browser/resources/chromeos/login/offline_gaia.js b/chrome/browser/resources/chromeos/login/offline_gaia.js index 76993ff..19148fe9 100644 --- a/chrome/browser/resources/chromeos/login/offline_gaia.js +++ b/chrome/browser/resources/chromeos/login/offline_gaia.js
@@ -5,6 +5,12 @@ Polymer((function() { var DEFAULT_EMAIL_DOMAIN = '@gmail.com'; + var TRANSITION_TYPE = { + FORWARD: 0, + BACKWARD: 1, + NONE: 2 + }; + return { is: 'offline-gaia', @@ -39,7 +45,7 @@ }, back: function() { - this.switchToEmailCard(); + this.switchToEmailCard(true /* animated */); }, onAnimationFinish_: function() { @@ -66,11 +72,12 @@ if (email) { if (this.emailDomain) email = email.replace(this.emailDomain, ''); - this.switchToPasswordCard(email); + this.switchToPasswordCard(email, false /* animated */); this.$.passwordInput.isInvalid = true; + this.fire('backButton', true); } else { this.$.emailInput.value = ''; - this.switchToEmailCard(); + this.switchToEmailCard(false /* animated */); } }, @@ -82,20 +89,18 @@ return this.$.animatedPages.selected == 'emailSection'; }, - switchToEmailCard() { + switchToEmailCard(animated) { this.$.passwordInput.value = ''; this.$.passwordInput.isInvalid = false; this.$.emailInput.isInvalid = false; if (this.isEmailSectionActive_()) return; - this.$.animatedPages.entryAnimation = - 'slide-from-' + (this.isRTL_() ? 'right' : 'left') + '-animation'; - this.$.animatedPages.exitAnimation = - 'slide-' + (this.isRTL_() ? 'left' : 'right') + '-animation'; + this.setUpPageTransitions_( + animated ? TRANSITION_TYPE.BACKWARD : TRANSITION_TYPE.NONE); this.$.animatedPages.selected = 'emailSection'; }, - switchToPasswordCard(email) { + switchToPasswordCard(email, animated) { this.$.emailInput.value = email; if (email.indexOf('@') === -1) { if (this.emailDomain) @@ -106,16 +111,14 @@ this.$.passwordHeader.email = email; if (!this.isEmailSectionActive_()) return; - this.$.animatedPages.entryAnimation = - 'slide-from-' + (this.isRTL_() ? 'left' : 'right') + '-animation'; - this.$.animatedPages.exitAnimation = - 'slide-' + (this.isRTL_() ? 'right' : 'left') + '-animation'; + this.setUpPageTransitions_( + animated ? TRANSITION_TYPE.FORWARD : TRANSITION_TYPE.NONE); this.$.animatedPages.selected = 'passwordSection'; }, onEmailSubmitted_: function() { if (this.$.emailInput.checkValidity()) - this.switchToPasswordCard(this.$.emailInput.value); + this.switchToPasswordCard(this.$.emailInput.value, true /* animated */); else this.$.emailInput.focus(); }, @@ -130,6 +133,21 @@ }; this.$.passwordInput.value = ''; this.fire('authCompleted', msg); + }, + + setUpPageTransitions_: function(transitionType) { + if (transitionType === TRANSITION_TYPE.NONE) { + this.$.animatedPages.entryAnimation = ''; + this.$.animatedPages.exitAnimation = ''; + return; + } + var isForward = transitionType === TRANSITION_TYPE.FORWARD; + var isRTL = this.isRTL_(); + this.$.animatedPages.entryAnimation = + 'slide-from-' + (isForward === isRTL ? 'left' : 'right') + + '-animation'; + this.$.animatedPages.exitAnimation = + 'slide-' + (isForward === isRTL ? 'right' : 'left') + '-animation'; } }; })());
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js index 81f2c03..05abdf5f 100644 --- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js +++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -460,6 +460,7 @@ onBeforeHide: function() { chrome.send('loginUIStateChanged', ['gaia-signin', false]); $('login-header-bar').signinUIState = SIGNIN_UI_STATE.HIDDEN; + $('offline-gaia').switchToEmailCard(false /* animated */); }, /**
diff --git a/chrome/browser/resources/inspect/inspect.js b/chrome/browser/resources/inspect/inspect.js index bfaa219b..b8747ff 100644 --- a/chrome/browser/resources/inspect/inspect.js +++ b/chrome/browser/resources/inspect/inspect.js
@@ -748,6 +748,7 @@ var newSelection = line.nextElementSibling; line.parentNode.removeChild(line); selectLine(newSelection); + commitPortForwardingConfig(false); }); line.appendChild(lineDelete);
diff --git a/chrome/browser/safe_browsing/safe_browsing_database.cc b/chrome/browser/safe_browsing/safe_browsing_database.cc index 8a8dddf..d3d95f9 100644 --- a/chrome/browser/safe_browsing/safe_browsing_database.cc +++ b/chrome/browser/safe_browsing/safe_browsing_database.cc
@@ -111,47 +111,6 @@ return chunk << 1 | list_id % 2; } -// Generate the set of full hashes to check for |url|. If -// |include_whitelist_hashes| is true we will generate additional path-prefixes -// to match against the csd whitelist. E.g., if the path-prefix /foo is on the -// whitelist it should also match /foo/bar which is not the case for all the -// other lists. We'll also always add a pattern for the empty path. -// TODO(shess): This function is almost the same as -// |CompareFullHashes()| in safe_browsing_util.cc, except that code -// does an early exit on match. Since match should be the infrequent -// case (phishing or malware found), consider combining this function -// with that one. -void UrlToFullHashes(const GURL& url, - bool include_whitelist_hashes, - std::vector<SBFullHash>* full_hashes) { - std::vector<std::string> hosts; - if (url.HostIsIPAddress()) { - hosts.push_back(url.host()); - } else { - GenerateHostsToCheck(url, &hosts); - } - - std::vector<std::string> paths; - GeneratePathsToCheck(url, &paths); - - for (size_t i = 0; i < hosts.size(); ++i) { - for (size_t j = 0; j < paths.size(); ++j) { - const std::string& path = paths[j]; - full_hashes->push_back( - SBFullHashForString(hosts[i] + path)); - - // We may have /foo as path-prefix in the whitelist which should - // also match with /foo/bar and /foo?bar. Hence, for every path - // that ends in '/' we also add the path without the slash. - if (include_whitelist_hashes && path.size() > 1 && - path[path.size() - 1] == '/') { - full_hashes->push_back(SBFullHashForString( - hosts[i] + path.substr(0, path.size() - 1))); - } - } - } -} - // Helper function to compare addprefixes in |store| with |prefixes|. // The |list_bit| indicates which list (url or hash) to compare. //
diff --git a/chrome/browser/signin/oauth2_token_service_delegate_android.cc b/chrome/browser/signin/oauth2_token_service_delegate_android.cc index 4bccc15..c3a5eb0 100644 --- a/chrome/browser/signin/oauth2_token_service_delegate_android.cc +++ b/chrome/browser/signin/oauth2_token_service_delegate_android.cc
@@ -309,9 +309,8 @@ std::vector<std::string> curr_ids; for (const std::string& curr_name : GetSystemAccountNames()) { std::string curr_id(MapAccountNameToAccountId(curr_name)); - // TODO(knn): Convert to DCHECK after https://crbug.com/535211 - CHECK(!curr_id.empty()); - curr_ids.push_back(curr_id); + if (!curr_id.empty()) + curr_ids.push_back(curr_id); } std::vector<std::string> prev_ids;
diff --git a/chrome/browser/signin/signin_tracker_unittest.cc b/chrome/browser/signin/signin_tracker_unittest.cc index cfb056f..709c3ea 100644 --- a/chrome/browser/signin/signin_tracker_unittest.cc +++ b/chrome/browser/signin/signin_tracker_unittest.cc
@@ -16,8 +16,8 @@ #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/signin/signin_tracker_factory.h" #include "chrome/browser/sync/profile_sync_service_factory.h" -#include "chrome/browser/sync/profile_sync_service_mock.h" #include "chrome/test/base/testing_profile.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include "components/signin/core/browser/account_tracker_service.h" #include "components/signin/core/browser/fake_auth_status_provider.h" #include "components/signin/core/browser/fake_profile_oauth2_token_service.h"
diff --git a/chrome/browser/sync/profile_sync_test_util.h b/chrome/browser/sync/profile_sync_test_util.h index e3dfe1a1..db21a95 100644 --- a/chrome/browser/sync/profile_sync_test_util.h +++ b/chrome/browser/sync/profile_sync_test_util.h
@@ -11,7 +11,7 @@ #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" #include "base/synchronization/waitable_event.h" -#include "chrome/browser/sync/profile_sync_service_mock.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include "components/sync_driver/sync_service_observer.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h"
diff --git a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc index 9284b6e..70f5d0c5 100644 --- a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc +++ b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
@@ -9,7 +9,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/notifications/notification.h" #include "chrome/browser/notifications/notification_ui_manager.h" -#include "chrome/browser/sync/profile_sync_service_mock.h" #include "chrome/browser/sync/profile_sync_test_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/webui/signin/login_ui_service.h" @@ -17,6 +16,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include "components/sync_driver/sync_error_controller.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/sync/sync_ui_util_unittest.cc b/chrome/browser/sync/sync_ui_util_unittest.cc index 4d18c0a..c42c2dd 100644 --- a/chrome/browser/sync/sync_ui_util_unittest.cc +++ b/chrome/browser/sync/sync_ui_util_unittest.cc
@@ -9,11 +9,11 @@ #include "chrome/browser/signin/account_tracker_service_factory.h" #include "chrome/browser/signin/chrome_signin_client_factory.h" #include "chrome/browser/signin/signin_error_controller_factory.h" -#include "chrome/browser/sync/profile_sync_service_mock.h" #include "chrome/browser/sync/profile_sync_test_util.h" #include "chrome/browser/sync/sync_ui_util.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/testing_profile.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include "components/signin/core/browser/fake_auth_status_provider.h" #include "components/signin/core/browser/fake_signin_manager.h" #include "components/signin/core/browser/signin_manager.h"
diff --git a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc index 90fe871..91c215d 100644 --- a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
@@ -1980,7 +1980,6 @@ IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, FirstClientEnablesEncryptionWithPassSecondChanges) { - GetFakeServer()->EnableImplicitPermanentFolderCreation(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllModelsMatchVerifier());
diff --git a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc index ad71e73..36677a1 100644 --- a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
@@ -76,7 +76,6 @@ IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, SetPassphraseAndAddPassword) { - GetFakeServer()->EnableImplicitPermanentFolderCreation(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; SetEncryptionPassphrase(0, kValidPassphrase, ProfileSyncService::EXPLICIT);
diff --git a/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc index e832fb5..4d595455 100644 --- a/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc +++ b/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc
@@ -12,11 +12,11 @@ #include "base/test/simple_test_clock.h" #include "chrome/browser/password_manager/password_store_factory.h" #include "chrome/browser/sync/profile_sync_service_factory.h" -#include "chrome/browser/sync/profile_sync_service_mock.h" #include "chrome/browser/sync/profile_sync_test_util.h" #include "chrome/browser/ui/passwords/manage_passwords_bubble_model.h" #include "chrome/browser/ui/passwords/manage_passwords_ui_controller_mock.h" #include "chrome/test/base/testing_profile.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include "components/password_manager/core/browser/mock_password_store.h" #include "components/password_manager/core/browser/password_bubble_experiment.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h"
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc index c1415fd..72e0203 100644 --- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc +++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
@@ -15,7 +15,6 @@ #include "chrome/browser/sessions/session_service.h" #include "chrome/browser/sessions/session_service_factory.h" #include "chrome/browser/sessions/tab_restore_service_factory.h" -#include "chrome/browser/sync/profile_sync_service_mock.h" #include "chrome/browser/sync/profile_sync_test_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_tabstrip.h" @@ -26,6 +25,7 @@ #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/menu_model_test.h" #include "chrome/test/base/testing_profile.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include "components/sessions/core/persistent_tab_restore_service.h" #include "components/sessions/core/serialized_navigation_entry_test_helper.h" #include "components/sessions/core/session_types.h"
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_ui.cc b/chrome/browser/ui/webui/omnibox/omnibox_ui.cc index cb02a897..0c8021da 100644 --- a/chrome/browser/ui/webui/omnibox/omnibox_ui.cc +++ b/chrome/browser/ui/webui/omnibox/omnibox_ui.cc
@@ -30,6 +30,6 @@ void OmniboxUI::BindUIHandler( mojo::InterfaceRequest<OmniboxUIHandlerMojo> request) { - // OmniboxUIHandler deletes itself when the pipe is closed. - new OmniboxUIHandler(Profile::FromWebUI(web_ui()), request.Pass()); + omnibox_ui_handler_.reset( + new OmniboxUIHandler(Profile::FromWebUI(web_ui()), request.Pass())); }
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_ui.h b/chrome/browser/ui/webui/omnibox/omnibox_ui.h index d1bfb9c5..c91af32c 100644 --- a/chrome/browser/ui/webui/omnibox/omnibox_ui.h +++ b/chrome/browser/ui/webui/omnibox/omnibox_ui.h
@@ -9,6 +9,8 @@ #include "chrome/browser/ui/webui/mojo_web_ui_controller.h" #include "chrome/browser/ui/webui/omnibox/omnibox.mojom.h" +class OmniboxUIHandler; + // The UI for chrome://omnibox/ class OmniboxUI : public MojoWebUIController<OmniboxUIHandlerMojo> { public: @@ -20,6 +22,8 @@ void BindUIHandler( mojo::InterfaceRequest<OmniboxUIHandlerMojo> request) override; + scoped_ptr<OmniboxUIHandler> omnibox_ui_handler_; + DISALLOW_COPY_AND_ASSIGN(OmniboxUI); };
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_ui_handler.h b/chrome/browser/ui/webui/omnibox/omnibox_ui_handler.h index 4f9b66a..15158da 100644 --- a/chrome/browser/ui/webui/omnibox/omnibox_ui_handler.h +++ b/chrome/browser/ui/webui/omnibox/omnibox_ui_handler.h
@@ -14,7 +14,7 @@ #include "components/omnibox/browser/autocomplete_controller_delegate.h" #include "components/omnibox/browser/autocomplete_input.h" #include "components/omnibox/browser/autocomplete_match.h" -#include "mojo/public/cpp/bindings/strong_binding.h" +#include "mojo/public/cpp/bindings/binding.h" class AutocompleteController; class Profile; @@ -71,7 +71,7 @@ // The Profile* handed to us in our constructor. Profile* profile_; - mojo::StrongBinding<OmniboxUIHandlerMojo> binding_; + mojo::Binding<OmniboxUIHandlerMojo> binding_; DISALLOW_COPY_AND_ASSIGN(OmniboxUIHandler); };
diff --git a/chrome/browser/ui/webui/options/cookies_view_browsertest.js b/chrome/browser/ui/webui/options/cookies_view_browsertest.js index 1babc6d..7fea55b 100644 --- a/chrome/browser/ui/webui/options/cookies_view_browsertest.js +++ b/chrome/browser/ui/webui/options/cookies_view_browsertest.js
@@ -19,7 +19,7 @@ }; // Test opening the cookies view has correct location. -TEST_F('CookiesViewWebUITest', 'DISABLED_testOpenCookiesView', function() { +TEST_F('CookiesViewWebUITest', 'testOpenCookiesView', function() { assertEquals(this.browsePreload, document.location.href); });
diff --git a/chrome/browser/ui/webui/sync_internals_ui_unittest.cc b/chrome/browser/ui/webui/sync_internals_ui_unittest.cc index 490873b..edcd28dbe7 100644 --- a/chrome/browser/ui/webui/sync_internals_ui_unittest.cc +++ b/chrome/browser/ui/webui/sync_internals_ui_unittest.cc
@@ -10,8 +10,8 @@ #include "base/message_loop/message_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" -#include "chrome/browser/sync/profile_sync_service_mock.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include "content/public/browser/web_ui_controller.h" #include "content/public/test/test_browser_thread.h" #include "sync/js/js_arg_list.h"
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 7e012da..125dff3 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi
@@ -696,6 +696,8 @@ 'browser/android/contextualsearch/resolved_search_term.h', 'browser/android/cookies/cookies_fetcher.cc', 'browser/android/cookies/cookies_fetcher.h', + 'browser/android/data_usage/data_use_matcher.cc', + 'browser/android/data_usage/data_use_matcher.h', 'browser/android/data_usage/data_use_tab_helper.cc', 'browser/android/data_usage/data_use_tab_helper.h', 'browser/android/data_usage/data_use_tab_model.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 83f9388..3d530cd 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi
@@ -13,6 +13,7 @@ 'browser/after_startup_task_utils_unittest.cc', 'browser/android/bookmarks/partner_bookmarks_shim_unittest.cc', 'browser/android/contextualsearch/contextual_search_delegate_unittest.cc', + 'browser/android/data_usage/data_use_matcher_unittest.cc', 'browser/android/data_usage/data_use_tab_model_test_utils.cc', 'browser/android/data_usage/data_use_tab_model_test_utils.h', 'browser/android/data_usage/data_use_tab_model_unittest.cc', @@ -1675,6 +1676,7 @@ '../base/base.gyp:base_prefs_test_support', '../base/base.gyp:test_support_base', '../components/components.gyp:bookmarks_test_support', + '../components/components.gyp:browser_sync_browser_test_support', '../components/components.gyp:gcm_driver_test_support', '../components/components.gyp:history_core_test_support', '../components/components.gyp:instance_id_test_support', @@ -1774,8 +1776,6 @@ 'browser/signin/fake_signin_manager_builder.h', 'browser/ssl/ssl_client_auth_requestor_mock.cc', 'browser/ssl/ssl_client_auth_requestor_mock.h', - 'browser/sync/profile_sync_service_mock.cc', - 'browser/sync/profile_sync_service_mock.h', 'browser/sync/profile_sync_test_util.cc', 'browser/sync/profile_sync_test_util.h', 'browser/ui/browser.h',
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 692790e..c8d5a0c 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc
@@ -1152,6 +1152,9 @@ // Enabled tab switcher in document mode. const char kEnableTabSwitcherInDocumentMode[] = "enable-tab-switcher-in-document-mode"; + +// Switch to an existing tab for a suggestion opened from the New Tab Page. +const char kNtpSwitchToExistingTab[] = "ntp-switch-to-existing-tab"; #endif // defined(OS_ANDROID) #if defined(USE_ASH)
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 2e931fc..3d03778b 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h
@@ -316,6 +316,7 @@ extern const char kEnableThemeColorInTabbedMode[]; extern const char kDisableAutoHidingToolbarThreshold[]; extern const char kEnableTabSwitcherInDocumentMode[]; +extern const char kNtpSwitchToExistingTab[]; #endif // defined(OS_ANDROID) #if defined(USE_ASH)
diff --git a/components/browser_sync.gypi b/components/browser_sync.gypi index 6abdffd2..018c551 100644 --- a/components/browser_sync.gypi +++ b/components/browser_sync.gypi
@@ -64,5 +64,25 @@ 'browser_sync/common/browser_sync_switches.h', ], }, + { + # GN version: //components/browser_sync/browser:test_support + 'target_name': 'browser_sync_browser_test_support', + 'type': 'static_library', + 'dependencies': [ + '../base/base.gyp:base', + '../google_apis/google_apis.gyp:google_apis', + '../sync/sync.gyp:sync', + '../testing/gmock.gyp:gmock', + 'sync_driver_test_support', + ], + 'include_dirs': [ + '..', + ], + 'sources': [ + # Note: file list duplicated in GN build. + 'browser_sync/browser/profile_sync_service_mock.cc', + 'browser_sync/browser/profile_sync_service_mock.h', + ], + } ], }
diff --git a/components/browser_sync/browser/BUILD.gn b/components/browser_sync/browser/BUILD.gn index c76c80aa..6d0dd78b 100644 --- a/components/browser_sync/browser/BUILD.gn +++ b/components/browser_sync/browser/BUILD.gn
@@ -76,3 +76,19 @@ "//ui/base", ] } + +source_set("test_support") { + testonly = true + sources = [ + "profile_sync_service_mock.cc", + "profile_sync_service_mock.h", + ] + + deps = [ + ":browser", + "//base", + "//components/sync_driver:test_support", + "//google_apis", + "//testing/gmock", + ] +}
diff --git a/chrome/browser/sync/profile_sync_service_mock.cc b/components/browser_sync/browser/profile_sync_service_mock.cc similarity index 88% rename from chrome/browser/sync/profile_sync_service_mock.cc rename to components/browser_sync/browser/profile_sync_service_mock.cc index a267d80a1..494ba77 100644 --- a/chrome/browser/sync/profile_sync_service_mock.cc +++ b/components/browser_sync/browser/profile_sync_service_mock.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/sync/profile_sync_service_mock.h" +#include "components/browser_sync/browser/profile_sync_service_mock.h" #include <utility>
diff --git a/chrome/browser/sync/profile_sync_service_mock.h b/components/browser_sync/browser/profile_sync_service_mock.h similarity index 95% rename from chrome/browser/sync/profile_sync_service_mock.h rename to components/browser_sync/browser/profile_sync_service_mock.h index 4527c6f..c610b87 100644 --- a/chrome/browser/sync/profile_sync_service_mock.h +++ b/components/browser_sync/browser/profile_sync_service_mock.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_MOCK_H_ -#define CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_MOCK_H_ +#ifndef COMPONENTS_BROWSER_SYNC_BROWSER_PROFILE_SYNC_SERVICE_MOCK_H_ +#define COMPONENTS_BROWSER_SYNC_BROWSER_PROFILE_SYNC_SERVICE_MOCK_H_ #include <string> #include <vector> @@ -101,4 +101,4 @@ MOCK_METHOD1(StartUpSlowBackendComponents, void(BackendMode)); }; -#endif // CHROME_BROWSER_SYNC_PROFILE_SYNC_SERVICE_MOCK_H_ +#endif // COMPONENTS_BROWSER_SYNC_BROWSER_PROFILE_SYNC_SERVICE_MOCK_H_
diff --git a/components/nacl/loader/nonsfi/DEPS b/components/nacl/loader/nonsfi/DEPS index dae642b..af61a9f7 100644 --- a/components/nacl/loader/nonsfi/DEPS +++ b/components/nacl/loader/nonsfi/DEPS
@@ -1,10 +1,5 @@ include_rules = [ "+ppapi/nacl_irt", "+sandbox/linux/seccomp-bpf-helpers", - "+native_client/src/shared/platform/nacl_log.h", - "+native_client/src/trusted/desc/nacl_desc_base.h", - "+native_client/src/trusted/desc/nacl_desc_effector_trusted_mem.h", - "+native_client/src/trusted/service_runtime/nacl_exception.h", - "+native_client/src/trusted/service_runtime/nacl_signal.h", "+third_party/lss/linux_syscall_support.h", # for BPF policy tests ]
diff --git a/components/safe_browsing_db/util.cc b/components/safe_browsing_db/util.cc index c34c161..3183998 100644 --- a/components/safe_browsing_db/util.cc +++ b/components/safe_browsing_db/util.cc
@@ -296,6 +296,36 @@ } } +void UrlToFullHashes(const GURL& url, + bool include_whitelist_hashes, + std::vector<SBFullHash>* full_hashes) { + std::vector<std::string> hosts; + if (url.HostIsIPAddress()) { + hosts.push_back(url.host()); + } else { + GenerateHostsToCheck(url, &hosts); + } + + std::vector<std::string> paths; + GeneratePathsToCheck(url, &paths); + + for (const std::string& host : hosts) { + for (const std::string& path : paths) { + full_hashes->push_back( + SBFullHashForString(host + path)); + + // We may have /foo as path-prefix in the whitelist which should + // also match with /foo/bar and /foo?bar. Hence, for every path + // that ends in '/' we also add the path without the slash. + if (include_whitelist_hashes && path.size() > 1 && + path[path.size() - 1] == '/') { + full_hashes->push_back(SBFullHashForString( + host + path.substr(0, path.size() - 1))); + } + } + } +} + void GenerateHostsToCheck(const GURL& url, std::vector<std::string>* hosts) { hosts->clear();
diff --git a/components/safe_browsing_db/util.h b/components/safe_browsing_db/util.h index 9948020..dfa38e88 100644 --- a/components/safe_browsing_db/util.h +++ b/components/safe_browsing_db/util.h
@@ -149,6 +149,15 @@ std::string* canonicalized_path, std::string* canonicalized_query); + +// Generate the set of full hashes to check for |url|. If +// |include_whitelist_hashes| is true we will generate additional path-prefixes +// to match against the csd whitelist. E.g., if the path-prefix /foo is on the +// whitelist it should also match /foo/bar which is not the case for all the +// other lists. We'll also always add a pattern for the empty path. +void UrlToFullHashes(const GURL& url, bool include_whitelist_hashes, + std::vector<SBFullHash>* full_hashes); + // Given a URL, returns all the hosts we need to check. They are returned // in order of size (i.e. b.c is first, then a.b.c). void GenerateHostsToCheck(const GURL& url, std::vector<std::string>* hosts);
diff --git a/components/safe_browsing_db/util_unittest.cc b/components/safe_browsing_db/util_unittest.cc index 11128331..44e514ee 100644 --- a/components/safe_browsing_db/util_unittest.cc +++ b/components/safe_browsing_db/util_unittest.cc
@@ -278,6 +278,48 @@ } } +TEST(SafeBrowsingDbUtilTest, UrlToFullHashes) { + std::vector<SBFullHash> results; + GURL url("http://www.evil.com/evil1/evilness.html"); + UrlToFullHashes(url, false, &results); + + EXPECT_EQ(6UL, results.size()); + EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("evil.com/"), + results[0])); + EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("evil.com/evil1/"), + results[1])); + EXPECT_TRUE(SBFullHashEqual( + SBFullHashForString("evil.com/evil1/evilness.html"), results[2])); + EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("www.evil.com/"), + results[3])); + EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("www.evil.com/evil1/"), + results[4])); + EXPECT_TRUE(SBFullHashEqual( + SBFullHashForString("www.evil.com/evil1/evilness.html"), results[5])); + + results.clear(); + GURL url2("http://www.evil.com/evil1/evilness.html"); + UrlToFullHashes(url2, true, &results); + + EXPECT_EQ(8UL, results.size()); + EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("evil.com/"), + results[0])); + EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("evil.com/evil1/"), + results[1])); + EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("evil.com/evil1"), + results[2])); + EXPECT_TRUE(SBFullHashEqual( + SBFullHashForString("evil.com/evil1/evilness.html"), results[3])); + EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("www.evil.com/"), + results[4])); + EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("www.evil.com/evil1/"), + results[5])); + EXPECT_TRUE(SBFullHashEqual(SBFullHashForString("www.evil.com/evil1"), + results[6])); + EXPECT_TRUE(SBFullHashEqual( + SBFullHashForString("www.evil.com/evil1/evilness.html"), results[7])); +} + TEST(SafeBrowsingDbUtilTest, ListIdListNameConversion) { std::string list_name; EXPECT_FALSE(GetListName(INVALID, &list_name));
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 14c9458..80fcea5 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1455,6 +1455,7 @@ cc::switches::kEnableBeginFrameScheduling, cc::switches::kEnableGpuBenchmarking, cc::switches::kEnableMainFrameBeforeActivation, + cc::switches::kEnableTileCompression, cc::switches::kShowCompositedLayerBorders, cc::switches::kShowLayerAnimationBounds, cc::switches::kShowPropertyChangedRects,
diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc index a82cd35..3acec61 100644 --- a/content/child/child_thread_impl.cc +++ b/content/child/child_thread_impl.cc
@@ -563,7 +563,7 @@ } void ChildThreadImpl::OnChannelError() { - set_on_channel_error_called(true); + on_channel_error_called_ = true; base::MessageLoop::current()->QuitWhenIdle(); } @@ -751,10 +751,8 @@ #endif void ChildThreadImpl::OnProcessFinalRelease() { - if (on_channel_error_called_) { - base::MessageLoop::current()->QuitWhenIdle(); + if (on_channel_error_called_) return; - } // The child process shutdown sequence is a request response based mechanism, // where we send out an initial feeler request to the child process host
diff --git a/content/child/child_thread_impl.h b/content/child/child_thread_impl.h index 9f4df7f..5a89895 100644 --- a/content/child/child_thread_impl.h +++ b/content/child/child_thread_impl.h
@@ -190,10 +190,6 @@ virtual bool OnControlMessageReceived(const IPC::Message& msg); virtual void OnProcessBackgrounded(bool backgrounded); - void set_on_channel_error_called(bool on_channel_error_called) { - on_channel_error_called_ = on_channel_error_called; - } - // IPC::Listener implementation: bool OnMessageReceived(const IPC::Message& msg) override; void OnChannelConnected(int32 peer_pid) override;
diff --git a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc index 236d7840..283949f5 100644 --- a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc +++ b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc
@@ -109,24 +109,6 @@ DEFINE_GUID(MF_XVP_PLAYBACK_MODE, 0x3c5d293f, 0xad67, 0x4e29, 0xaf, 0x12, 0xcf, 0x3e, 0x23, 0x8a, 0xcc, 0xe9); -// Helper class to automatically lock unlock the DX11 device in a scope. -class AutoDX11DeviceLock { - public: - explicit AutoDX11DeviceLock(ID3D10Multithread* multi_threaded) - : multi_threaded_(multi_threaded) { - multi_threaded_->Enter(); - } - - ~AutoDX11DeviceLock() { - multi_threaded_->Leave(); - } - - private: - base::win::ScopedComPtr<ID3D10Multithread> multi_threaded_; - - DISALLOW_COPY_AND_ASSIGN(AutoDX11DeviceLock); -}; - } // namespace namespace content { @@ -803,21 +785,43 @@ d3d11_device_manager_.Receive()); RETURN_ON_HR_FAILURE(hr, "MFCreateDXGIDeviceManager failed", false); - base::win::ScopedComPtr<ID3D11Device> angle_device = - QueryDeviceObjectFromANGLE<ID3D11Device>(EGL_D3D11_DEVICE_ANGLE); - RETURN_ON_FAILURE( - angle_device.get(), - "Failed to query DX11 device object from ANGLE", - false); + // This array defines the set of DirectX hardware feature levels we support. + // The ordering MUST be preserved. All applications are assumed to support + // 9.1 unless otherwise stated by the application. + D3D_FEATURE_LEVEL feature_levels[] = { + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + D3D_FEATURE_LEVEL_9_3, + D3D_FEATURE_LEVEL_9_2, + D3D_FEATURE_LEVEL_9_1 + }; - using_angle_device_ = true; - d3d11_device_ = angle_device; + UINT flags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT; + +#if defined _DEBUG + flags |= D3D11_CREATE_DEVICE_DEBUG; +#endif + + D3D_FEATURE_LEVEL feature_level_out = D3D_FEATURE_LEVEL_11_0; + hr = D3D11CreateDevice(NULL, + D3D_DRIVER_TYPE_HARDWARE, + NULL, + flags, + feature_levels, + arraysize(feature_levels), + D3D11_SDK_VERSION, + d3d11_device_.Receive(), + &feature_level_out, + d3d11_device_context_.Receive()); + RETURN_ON_HR_FAILURE(hr, "Failed to create DX11 device", false); // Enable multithreaded mode on the device. This ensures that accesses to // context are synchronized across threads. We have multiple threads // accessing the context, the media foundation decoder threads and the // decoder thread via the video format conversion transform. - hr = multi_threaded_.QueryFrom(angle_device.get()); + hr = multi_threaded_.QueryFrom(d3d11_device_.get()); RETURN_ON_HR_FAILURE(hr, "Failed to query ID3D10Multithread", false); multi_threaded_->SetMultithreadProtected(TRUE); @@ -825,6 +829,14 @@ dx11_dev_manager_reset_token_); RETURN_ON_HR_FAILURE(hr, "Failed to reset device", false); + D3D11_QUERY_DESC query_desc; + query_desc.Query = D3D11_QUERY_EVENT; + query_desc.MiscFlags = 0; + hr = d3d11_device_->CreateQuery( + &query_desc, + d3d11_query_.Receive()); + RETURN_ON_HR_FAILURE(hr, "Failed to create DX11 device query", false); + HMODULE video_processor_dll = ::GetModuleHandle(L"msvproc.dll"); RETURN_ON_FAILURE(video_processor_dll, "Failed to load video processor", false); @@ -1532,8 +1544,10 @@ MFT_MESSAGE_NOTIFY_END_STREAMING, 0); video_format_converter_mft_.Release(); } + d3d11_device_context_.Release(); d3d11_device_.Release(); d3d11_device_manager_.Release(); + d3d11_query_.Release(); dx11_video_format_converter_media_type_needs_init_ = true; } else { d3d9_.Release(); @@ -2034,10 +2048,6 @@ output_sample->AddBuffer(output_buffer.get()); - // Lock the device here as we are accessing the DX11 video context and the - // texture which need to be synchronized with the main thread. - AutoDX11DeviceLock device_lock(multi_threaded_.get()); - hr = video_format_converter_mft_->ProcessInput(0, video_frame, 0); if (FAILED(hr)) { DCHECK(false); @@ -2064,14 +2074,18 @@ "Failed to convert output sample format.", PLATFORM_FAILURE,); } - main_thread_task_runner_->PostTask( + d3d11_device_context_->Flush(); + d3d11_device_context_->End(d3d11_query_.get()); + + decoder_thread_task_runner_->PostDelayedTask( FROM_HERE, - base::Bind(&DXVAVideoDecodeAccelerator::CopySurfaceComplete, - weak_this_factory_.GetWeakPtr(), - nullptr, - nullptr, - picture_buffer_id, - input_buffer_id)); + base::Bind(&DXVAVideoDecodeAccelerator::FlushDecoder, + base::Unretained(this), 0, + reinterpret_cast<IDirect3DSurface9*>(NULL), + reinterpret_cast<IDirect3DSurface9*>(NULL), + picture_buffer_id, input_buffer_id), + base::TimeDelta::FromMilliseconds( + kFlushDecoderSurfaceTimeoutMs)); } void DXVAVideoDecodeAccelerator::FlushDecoder( @@ -2095,11 +2109,22 @@ // infinite loop. // Workaround is to have an upper limit of 4 on the number of iterations to // wait for the Flush to finish. - DCHECK(!use_dx11_); HRESULT hr = E_FAIL; - - hr = query_->GetData(NULL, 0, D3DGETDATA_FLUSH); + if (use_dx11_) { + BOOL query_data = 0; + hr = d3d11_device_context_->GetData(d3d11_query_.get(), &query_data, + sizeof(BOOL), 0); + if (FAILED(hr)) { + base::debug::Alias(&hr); + // TODO(ananta) + // Remove this CHECK when the change to use DX11 for H/W decoding + // stablizes. + CHECK(false); + } + } else { + hr = query_->GetData(NULL, 0, D3DGETDATA_FLUSH); + } if ((hr == S_FALSE) && (++iterations < kMaxIterationsForD3DFlush)) { decoder_thread_task_runner_->PostDelayedTask(
diff --git a/content/common/gpu/media/dxva_video_decode_accelerator_win.h b/content/common/gpu/media/dxva_video_decode_accelerator_win.h index c3708bd2..cbdc58ec 100644 --- a/content/common/gpu/media/dxva_video_decode_accelerator_win.h +++ b/content/common/gpu/media/dxva_video_decode_accelerator_win.h
@@ -258,6 +258,8 @@ base::win::ScopedComPtr<ID3D11Device > d3d11_device_; base::win::ScopedComPtr<IMFDXGIDeviceManager> d3d11_device_manager_; base::win::ScopedComPtr<ID3D10Multithread> multi_threaded_; + base::win::ScopedComPtr<ID3D11DeviceContext> d3d11_device_context_; + base::win::ScopedComPtr<ID3D11Query> d3d11_query_; // Ideally the reset token would be a stack variable which is used while // creating the device manager. However it seems that the device manager
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc index 74aae79..6c2b12ba 100644 --- a/content/renderer/gpu/render_widget_compositor.cc +++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -405,14 +405,16 @@ // low end, so always use default policy. bool use_low_memory_policy = base::SysInfo::IsLowEndDevice() && !using_synchronous_compositor; - // RGBA_4444 textures are only enabled by default for low end devices - // and are disabled for Android WebView as it doesn't support the format. - settings.renderer_settings.use_rgba_4444_textures = use_low_memory_policy; if (use_low_memory_policy) { // On low-end we want to be very carefull about killing other // apps. So initially we use 50% more memory to avoid flickering // or raster-on-demand. settings.max_memory_for_prepaint_percentage = 67; + + // RGBA_4444 textures are only enabled by default for low end devices + // and are disabled for Android WebView as it doesn't support the format. + if (!cmd->HasSwitch(switches::kDisableRGBA4444Textures)) + settings.renderer_settings.preferred_tile_format = cc::RGBA_4444; } else { // On other devices we have increased memory excessively to avoid // raster-on-demand already, so now we reserve 50% _only_ to avoid @@ -448,10 +450,14 @@ if (cmd->HasSwitch(cc::switches::kEnableBeginFrameScheduling)) settings.use_external_begin_frame_source = true; - settings.renderer_settings.use_rgba_4444_textures |= - cmd->HasSwitch(switches::kEnableRGBA4444Textures); - settings.renderer_settings.use_rgba_4444_textures &= - !cmd->HasSwitch(switches::kDisableRGBA4444Textures); + if (cmd->HasSwitch(switches::kEnableRGBA4444Textures) && + !cmd->HasSwitch(switches::kDisableRGBA4444Textures)) { + settings.renderer_settings.preferred_tile_format = cc::RGBA_4444; + } + + if (cmd->HasSwitch(cc::switches::kEnableTileCompression)) { + settings.renderer_settings.preferred_tile_format = cc::ETC1; + } if (widget_->for_oopif()) { // TODO(simonhong): Apply BeginFrame scheduling for OOPIF.
diff --git a/content/test/gpu/gpu_tests/screenshot_sync.py b/content/test/gpu/gpu_tests/screenshot_sync.py index c62865c..caa3853 100644 --- a/content/test/gpu/gpu_tests/screenshot_sync.py +++ b/content/test/gpu/gpu_tests/screenshot_sync.py
@@ -8,7 +8,6 @@ from gpu_tests import path_util from gpu_tests import screenshot_sync_expectations -from telemetry import benchmark from telemetry.page import page_test from telemetry.story import story_set as story_set_module from telemetry.util import image_util @@ -55,7 +54,6 @@ expectations=expectations) -@benchmark.Disabled('linux', 'mac', 'win') class ScreenshotSyncProcess(gpu_test_base.TestBase): """Tests that screenhots are properly synchronized with the frame one which they were requested"""
diff --git a/content/test/gpu/gpu_tests/screenshot_sync_expectations.py b/content/test/gpu/gpu_tests/screenshot_sync_expectations.py index 44f8e06c..07ec586 100644 --- a/content/test/gpu/gpu_tests/screenshot_sync_expectations.py +++ b/content/test/gpu/gpu_tests/screenshot_sync_expectations.py
@@ -11,4 +11,4 @@ super(ScreenshotSyncExpectations, self).__init__(*args, **kwargs) def SetExpectations(self): - pass + self.Skip('ScreenshotSync', ['win', 'mac', 'linux'], bug=459820)
diff --git a/ios/web/public/web_thread.h b/ios/web/public/web_thread.h index c51cc98..01b65ea 100644 --- a/ios/web/public/web_thread.h +++ b/ios/web/public/web_thread.h
@@ -9,6 +9,7 @@ #include "base/callback_forward.h" #include "base/compiler_specific.h" +#include "base/location.h" #include "base/logging.h" #include "base/macros.h" #include "base/task_runner_util.h" @@ -221,6 +222,53 @@ // DCHECK_CURRENTLY_ON_WEB_THREAD() fails. static std::string GetDCheckCurrentlyOnErrorMessage(ID expected); + // Use these templates in conjunction with RefCountedThreadSafe or scoped_ptr + // when you want to ensure that an object is deleted on a specific thread. + // This is needed when an object can hop between threads + // (i.e. IO -> FILE -> IO), and thread switching delays can mean that the + // final IO tasks executes before the FILE task's stack unwinds. + // This would lead to the object destructing on the FILE thread, which often + // is not what you want (i.e. to unregister from NotificationService, to + // notify other objects on the creating thread etc). + template <ID thread> + struct DeleteOnThread { + template <typename T> + static void Destruct(const T* x) { + if (CurrentlyOn(thread)) { + delete x; + } else { + if (!DeleteSoon(thread, FROM_HERE, x)) { + // Leaks at shutdown are acceptable under normal circumstances, + // do not report. + } + } + } + template <typename T> + inline void operator()(T* ptr) const { + enum { type_must_be_complete = sizeof(T) }; + Destruct(ptr); + } + }; + + // Sample usage with RefCountedThreadSafe: + // class Foo + // : public base::RefCountedThreadSafe< + // Foo, web::WebThread::DeleteOnIOThread> { + // + // ... + // private: + // friend struct web::WebThread::DeleteOnThread<web::WebThread::IO>; + // friend class base::DeleteHelper<Foo>; + // + // ~Foo(); + // + // Sample usage with scoped_ptr: + // scoped_ptr<Foo, web::WebThread::DeleteOnIOThread> ptr; + struct DeleteOnUIThread : public DeleteOnThread<UI> {}; + struct DeleteOnIOThread : public DeleteOnThread<IO> {}; + struct DeleteOnFileThread : public DeleteOnThread<FILE> {}; + struct DeleteOnDBThread : public DeleteOnThread<DB> {}; + private: friend class WebThreadImpl;
diff --git a/mojo/public/c/system/wait_set.h b/mojo/public/c/system/wait_set.h index c237403..3f3365af 100644 --- a/mojo/public/c/system/wait_set.h +++ b/mojo/public/c/system/wait_set.h
@@ -38,6 +38,10 @@ // any number of different wait sets. To modify the signals being waited for, // the handle must first be removed, and then added with the new signals. // +// If a handle is closed while still in the wait set, it is implicitly removed +// from the set after being returned from |MojoGetReadyHandles()| with the +// result |MOJO_RESULT_CANCELLED|. +// // It is safe to add a handle to a wait set while performing a wait on another // thread. If the added handle already has its signals satisfied, the waiting // thread will be woken. @@ -80,7 +84,7 @@ // |MOJO_HANDLE_SIGNAL_READABLE| signal. Since handles may be added and removed // from a wait set concurrently, it is possible for a wait set to satisfy // |MOJO_HANDLE_SIGNAL_READABLE|, but not have any ready handles when -// |MojoGetReadyHandle()| is called. These spurious wake-ups must be gracefully +// |MojoGetReadyHandles()| is called. These spurious wake-ups must be gracefully // handled. // // |*count| on input, must contain the maximum number of ready handles to be @@ -99,11 +103,12 @@ // |signals_state| (optional) if non-null, must point to an array of size // |*count| of |MojoHandleSignalsState|. It will be populated with the signals // state of the corresponding handle in |*handles|. See documentation for -// |MojoHandleSignalsState|. +// |MojoHandleSignalsState| for more details about the meaning of each array +// entry. The array will always be updated for every returned handle. // // Mojo signals and satisfiability are logically 'level-triggered'. Therefore, // if a signal continues to be satisfied and is not removed from the wait set, -// subsequent calls to |MojoGetReadyHandle()| will return the same handle. +// subsequent calls to |MojoGetReadyHandles()| will return the same handle. // // If multiple handles have their signals satisfied, the order in which handles // are returned is undefined. The same handle, if not removed, may be returned
diff --git a/mojo/public/platform/native/system_thunks.cc b/mojo/public/platform/native/system_thunks.cc index ed3227f0..74aaa080 100644 --- a/mojo/public/platform/native/system_thunks.cc +++ b/mojo/public/platform/native/system_thunks.cc
@@ -158,6 +158,33 @@ return g_thunks.UnmapBuffer(buffer); } +MojoResult MojoCreateWaitSet(MojoHandle* wait_set) { + assert(g_thunks.CreateWaitSet); + return g_thunks.CreateWaitSet(wait_set); +} + +MojoResult MojoAddHandle(MojoHandle wait_set, + MojoHandle handle, + MojoHandleSignals signals) { + assert(g_thunks.AddHandle); + return g_thunks.AddHandle(wait_set, handle, signals); +} + +MojoResult MojoRemoveHandle(MojoHandle wait_set, MojoHandle handle) { + assert(g_thunks.RemoveHandle); + return g_thunks.RemoveHandle(wait_set, handle); +} + +MojoResult MojoGetReadyHandles(MojoHandle wait_set, + uint32_t* count, + MojoHandle* handles, + MojoResult* results, + struct MojoHandleSignalsState* signals_states) { + assert(g_thunks.GetReadyHandles); + return g_thunks.GetReadyHandles(wait_set, count, handles, results, + signals_states); +} + extern "C" THUNK_EXPORT size_t MojoSetSystemThunks( const MojoSystemThunks* system_thunks) { if (system_thunks->size >= sizeof(g_thunks))
diff --git a/mojo/public/platform/native/system_thunks.h b/mojo/public/platform/native/system_thunks.h index bb6ca964..8c8ea1e 100644 --- a/mojo/public/platform/native/system_thunks.h +++ b/mojo/public/platform/native/system_thunks.h
@@ -101,6 +101,18 @@ void** buffer, MojoMapBufferFlags flags); MojoResult (*UnmapBuffer)(void* buffer); + + MojoResult (*CreateWaitSet)(MojoHandle* wait_set); + MojoResult (*AddHandle)(MojoHandle wait_set, + MojoHandle handle, + MojoHandleSignals signals); + MojoResult (*RemoveHandle)(MojoHandle wait_set, + MojoHandle handle); + MojoResult (*GetReadyHandles)(MojoHandle wait_set, + uint32_t* count, + MojoHandle* handles, + MojoResult* results, + struct MojoHandleSignalsState* signals_states); }; #pragma pack(pop) @@ -127,7 +139,11 @@ MojoCreateSharedBuffer, MojoDuplicateBufferHandle, MojoMapBuffer, - MojoUnmapBuffer}; + MojoUnmapBuffer, + MojoCreateWaitSet, + MojoAddHandle, + MojoRemoveHandle, + MojoGetReadyHandles}; return system_thunks; } #endif
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index c1a1761b..464677b 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc
@@ -11481,13 +11481,13 @@ &ssl_socket_data_provider); } - ScopedVector<StaticSocketDataProvider> data_providers; + std::vector<scoped_ptr<StaticSocketDataProvider>> data_providers; for (size_t i = 0; i < mock_reads.size(); ++i) { - data_providers.push_back(new StaticSocketDataProvider( + data_providers.push_back(make_scoped_ptr(new StaticSocketDataProvider( mock_reads[i].data(), mock_reads[i].size(), mock_writes[i].data(), - mock_writes[i].size())); + mock_writes[i].size()))); session_deps_.socket_factory->AddSocketDataProvider( - data_providers.back()); + data_providers.back().get()); } // Transaction must be created after DataProviders, so it's destroyed before
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h index 589260ffc..2da8dff 100644 --- a/net/http/transport_security_state_static.h +++ b/net/http/transport_security_state_static.h
@@ -2231,1996 +2231,1999 @@ 0x6f, 0xae, 0x72, 0x3c, 0x75, 0xfd, 0x2d, 0x2b, 0xc7, 0x61, 0xd7, 0x87, 0xda, 0x3a, 0xf0, 0xa4, 0x8e, 0xbf, 0x6b, 0xf1, 0xfd, 0x87, 0x5f, 0xde, 0x9a, 0x59, 0xbc, 0x8e, 0xa8, 0x45, 0xda, 0x17, 0x38, 0xdf, 0xe3, 0x5f, - 0x4a, 0x6f, 0xfe, 0xeb, 0x71, 0xcd, 0x63, 0x6f, 0xc5, 0x4e, 0xbf, 0x60, - 0x43, 0x8b, 0x3a, 0xff, 0xf7, 0xb7, 0x62, 0x77, 0x66, 0x3d, 0xdf, 0xba, - 0x3a, 0xff, 0x44, 0x93, 0xd2, 0x8f, 0x1d, 0x73, 0x4f, 0x47, 0x70, 0xd8, - 0xdf, 0xf7, 0x5f, 0xda, 0x60, 0xe4, 0xe7, 0x5c, 0xc4, 0x3a, 0xf8, 0x53, - 0x79, 0x1d, 0x7f, 0xc9, 0xbf, 0x70, 0x3c, 0x76, 0x1d, 0x50, 0x7b, 0x3c, - 0x21, 0xbf, 0xee, 0xc7, 0x21, 0x88, 0x2c, 0x3a, 0xf2, 0xaf, 0xa6, 0x23, - 0x17, 0x8d, 0xdb, 0x04, 0x35, 0x89, 0xa1, 0x7a, 0x1f, 0xb5, 0x25, 0x50, - 0x3c, 0x46, 0x59, 0x37, 0xf0, 0x81, 0x6e, 0x36, 0xcb, 0xf9, 0xb5, 0x5f, - 0xc3, 0x07, 0x5f, 0x7e, 0xbc, 0x09, 0xd5, 0xb9, 0xe7, 0xec, 0x16, 0xdf, - 0xfb, 0xb9, 0xb0, 0xe2, 0xae, 0x6f, 0xe3, 0xaf, 0xfb, 0x19, 0xd4, 0x0f, - 0x7f, 0x54, 0xeb, 0xde, 0xc6, 0x1d, 0x4b, 0x3d, 0x5d, 0x1d, 0x5e, 0x92, - 0xc0, 0x75, 0x2a, 0x8d, 0x40, 0x42, 0x5b, 0xc4, 0x57, 0xfc, 0xab, 0xfc, - 0x85, 0x8a, 0x2a, 0x75, 0xff, 0x9f, 0x4b, 0x84, 0xe7, 0x11, 0xb3, 0xad, - 0xa5, 0x4f, 0xdf, 0xa7, 0x57, 0xcf, 0x27, 0xe1, 0xd7, 0xfd, 0x9e, 0xf2, - 0x2b, 0xec, 0x61, 0xd7, 0xf4, 0x6f, 0xac, 0xdf, 0xc7, 0x5d, 0xc8, 0x3a, - 0x82, 0x78, 0x7e, 0x2e, 0xbf, 0xde, 0x46, 0x20, 0x63, 0xc7, 0x5f, 0xb5, - 0x0c, 0xc5, 0x9d, 0x50, 0x7a, 0xfa, 0x31, 0xb6, 0x82, 0x98, 0xae, 0x3d, - 0xf1, 0xe6, 0xb7, 0x4e, 0x51, 0x65, 0x3e, 0x8c, 0xd6, 0xff, 0xbc, 0x93, - 0xc6, 0xe0, 0xe4, 0x1d, 0x7b, 0x5e, 0xc3, 0xae, 0xcd, 0x7c, 0x3d, 0x4f, - 0xa7, 0x37, 0xff, 0x67, 0x93, 0x79, 0x0c, 0x34, 0x9a, 0x9e, 0xc9, 0xd7, - 0xff, 0xbf, 0x97, 0x5d, 0x3c, 0x83, 0xef, 0xfa, 0x75, 0xfb, 0x3c, 0x07, - 0xf1, 0xd5, 0x24, 0x60, 0x71, 0x43, 0x65, 0x2a, 0xff, 0xfd, 0x1d, 0x7c, - 0x18, 0xe2, 0xa1, 0xfd, 0xf9, 0x23, 0xaa, 0x49, 0xbc, 0x7a, 0x1e, 0x3b, - 0x06, 0x75, 0x0b, 0xc4, 0x19, 0x0a, 0x84, 0x87, 0xd3, 0xca, 0x41, 0xfe, - 0x50, 0x25, 0xf7, 0x51, 0xe4, 0x75, 0xfe, 0xc1, 0x96, 0x6b, 0xea, 0xce, - 0xbf, 0x2f, 0x40, 0x77, 0x3a, 0xbc, 0x7b, 0x3f, 0x4c, 0xef, 0xfb, 0x98, - 0x3f, 0x3b, 0x9b, 0xb6, 0x75, 0xff, 0x48, 0x7f, 0x07, 0xc6, 0x2c, 0x07, - 0x54, 0xe9, 0x8a, 0x49, 0xe7, 0x09, 0x37, 0x3b, 0xbf, 0xf9, 0xfb, 0xa4, - 0x92, 0x7a, 0x3d, 0xa3, 0xaf, 0xf8, 0x63, 0x37, 0xf6, 0x72, 0x0e, 0xbf, - 0xf4, 0x77, 0xee, 0x87, 0x3d, 0xdc, 0x3a, 0xa1, 0x1e, 0xa8, 0x7e, 0xe8, - 0x40, 0x36, 0xbf, 0x3e, 0xd0, 0x86, 0x0e, 0xbb, 0x5a, 0x3a, 0xf3, 0x6d, - 0xb6, 0x75, 0xc0, 0x72, 0x94, 0x2f, 0xeb, 0x87, 0xb5, 0xa3, 0x5b, 0xff, - 0x66, 0x85, 0xd5, 0x98, 0x52, 0x63, 0xaf, 0xe0, 0x44, 0xbb, 0xf7, 0x47, - 0x5f, 0xc8, 0x20, 0x63, 0x10, 0xeb, 0xce, 0x0c, 0x2a, 0xa4, 0x9a, 0xb2, - 0xe1, 0x05, 0xd2, 0x20, 0x1f, 0x6d, 0x2f, 0xd9, 0x2b, 0xbe, 0x80, 0xa0, - 0x4e, 0xbf, 0x07, 0x89, 0xfc, 0xe7, 0x5f, 0xe6, 0xf0, 0x73, 0x6a, 0x70, - 0xeb, 0xf8, 0x73, 0x70, 0x7d, 0x91, 0xd5, 0x32, 0x22, 0xc4, 0xa7, 0xc6, - 0x77, 0xec, 0xcf, 0x77, 0x0e, 0xb9, 0xd6, 0x75, 0xfe, 0xcd, 0xb8, 0xa3, - 0x6d, 0xb6, 0x55, 0xfa, 0x68, 0xce, 0xe8, 0xea, 0x13, 0xdf, 0xfa, 0x71, - 0x7f, 0x9a, 0x71, 0xfb, 0x3a, 0x9c, 0x3a, 0xf2, 0xdf, 0xc7, 0x54, 0xc8, - 0xe9, 0xeb, 0xa7, 0xe4, 0x7b, 0x4d, 0xef, 0xe1, 0xda, 0xeb, 0x45, 0x9d, - 0x7e, 0xc9, 0xa5, 0x12, 0x3a, 0xfe, 0x9c, 0x31, 0x82, 0x13, 0xaa, 0x15, - 0x86, 0x49, 0x89, 0x21, 0x57, 0xd3, 0x07, 0x8c, 0x3b, 0x48, 0x3e, 0x2d, - 0xfa, 0x4f, 0x79, 0xc0, 0x87, 0x5f, 0xf0, 0x47, 0xfd, 0x64, 0xf9, 0x39, - 0xd7, 0xa3, 0x82, 0x75, 0xfe, 0xc0, 0x8b, 0xe9, 0x02, 0x75, 0xba, 0x75, - 0xef, 0xde, 0x71, 0x3c, 0x0d, 0x18, 0x59, 0x38, 0x88, 0xef, 0x2d, 0x52, - 0xd3, 0x0a, 0x71, 0xa6, 0x9c, 0x32, 0x2f, 0xc3, 0x13, 0xc4, 0x8e, 0xbf, - 0xfd, 0x81, 0x75, 0xe6, 0xf2, 0xc0, 0x60, 0x4e, 0xbb, 0xae, 0x75, 0xd3, - 0x68, 0xeb, 0xf6, 0x6d, 0x41, 0x0e, 0x1a, 0xcf, 0xa2, 0xb7, 0xf7, 0xcf, - 0x66, 0xb5, 0x07, 0x5f, 0xbb, 0x9b, 0xfa, 0x0e, 0xbf, 0x6c, 0x3c, 0xff, - 0x64, 0x75, 0x7c, 0x4c, 0xd5, 0x47, 0x48, 0x3f, 0xc2, 0xef, 0xc9, 0xef, - 0x83, 0x9d, 0x73, 0xaf, 0xfd, 0x83, 0x2e, 0xe0, 0x8c, 0x36, 0x75, 0xff, - 0xb3, 0x9c, 0x79, 0x7c, 0xdb, 0x0d, 0x67, 0x54, 0x1f, 0xfc, 0x8e, 0xeb, - 0x89, 0x86, 0x8a, 0x6f, 0xa1, 0x3f, 0x7f, 0xb9, 0xae, 0xe0, 0xa6, 0x8e, - 0xa8, 0x55, 0x9c, 0x92, 0x9a, 0x1c, 0xd6, 0xff, 0xb0, 0x38, 0x30, 0x3f, - 0xc1, 0xd7, 0x43, 0x67, 0x54, 0x3b, 0xe1, 0x69, 0xe1, 0x47, 0x29, 0xc9, - 0xe0, 0xce, 0x3a, 0xe4, 0x22, 0x55, 0x84, 0x03, 0x25, 0xeb, 0xee, 0xe8, - 0x91, 0x86, 0x4d, 0x09, 0x0e, 0x53, 0xed, 0x57, 0x2a, 0x0f, 0xb3, 0x9f, - 0x2e, 0xaa, 0x08, 0x74, 0x8d, 0x23, 0xaf, 0x52, 0x9a, 0xfd, 0x39, 0x39, - 0xfc, 0x70, 0xfb, 0x65, 0x83, 0xfd, 0x36, 0xd8, 0x35, 0xbf, 0xec, 0xe0, - 0xc7, 0xa5, 0x9d, 0x3a, 0xfe, 0x10, 0x60, 0x5e, 0x47, 0x5f, 0xf7, 0xb5, - 0xd4, 0x85, 0xb8, 0x4e, 0xbf, 0xf7, 0x50, 0x63, 0x7d, 0x22, 0xe0, 0xeb, - 0xda, 0x8e, 0x1d, 0x77, 0xb4, 0xc3, 0xd7, 0xdc, 0xf2, 0xa1, 0x17, 0xbf, - 0xc2, 0x3a, 0xff, 0x30, 0x72, 0x52, 0x7d, 0x1d, 0x7f, 0x3b, 0x78, 0x0f, - 0xbe, 0x3a, 0xfc, 0xf2, 0xf8, 0x14, 0x3a, 0xfe, 0xd6, 0x05, 0x35, 0x39, - 0xd7, 0xa5, 0x00, 0x3a, 0xfd, 0xf6, 0x69, 0x43, 0x59, 0x55, 0x0a, 0x90, - 0xf0, 0xd9, 0x58, 0x74, 0x21, 0x47, 0x0c, 0x7a, 0x5f, 0xa2, 0x8f, 0x16, - 0xfd, 0x1b, 0xb3, 0x0e, 0xbf, 0xf9, 0x51, 0xfd, 0xfe, 0xe6, 0x92, 0x04, - 0xeb, 0xdb, 0x28, 0x13, 0xab, 0x87, 0xc4, 0xb4, 0x4b, 0xff, 0xb7, 0xf7, - 0xeb, 0xec, 0x20, 0xb8, 0x4e, 0xbe, 0x57, 0x8e, 0xd9, 0xd6, 0xfa, 0x68, - 0x81, 0x6d, 0xe3, 0x50, 0x29, 0x5e, 0x37, 0x8d, 0x8f, 0xd6, 0x22, 0x05, - 0x17, 0xef, 0xe4, 0x69, 0xb3, 0xb0, 0xd9, 0xd7, 0xfb, 0xa9, 0xf5, 0x40, - 0x02, 0x0a, 0xae, 0x1f, 0x36, 0xc9, 0x8d, 0xf0, 0xec, 0x34, 0xf4, 0x75, - 0x21, 0xe6, 0xfd, 0x25, 0xbf, 0xbb, 0x9f, 0xb4, 0xf3, 0x47, 0x5f, 0xf0, - 0xfb, 0x5f, 0xef, 0xe4, 0x6c, 0xeb, 0xfd, 0xfb, 0xeb, 0x30, 0x55, 0x3a, - 0xa0, 0xfb, 0x7a, 0x77, 0x7f, 0xd1, 0xed, 0x7c, 0xc5, 0xa0, 0x4e, 0xbf, - 0xf7, 0xc1, 0x75, 0x7e, 0x68, 0x00, 0x83, 0xaf, 0xff, 0x4f, 0xf8, 0x35, - 0x24, 0xd6, 0xa3, 0x92, 0x3a, 0xc8, 0xaa, 0x23, 0xb8, 0x85, 0x7f, 0x9f, - 0xbb, 0xea, 0x07, 0xc7, 0x56, 0x8f, 0x6f, 0xc5, 0x37, 0xfb, 0xa9, 0x34, - 0xa0, 0x64, 0x75, 0xff, 0xa1, 0xbd, 0x34, 0x1d, 0x99, 0xbf, 0x8e, 0xa6, - 0x1f, 0xaf, 0x8c, 0xaf, 0xa5, 0xdc, 0x9c, 0xeb, 0xfe, 0x8d, 0xd6, 0xfe, - 0xcd, 0xfc, 0x75, 0x6e, 0x7b, 0x62, 0x45, 0x7f, 0xd0, 0xcf, 0x7f, 0xde, - 0x43, 0x67, 0x5d, 0xc7, 0x3a, 0xff, 0xed, 0xa9, 0xad, 0x60, 0xb1, 0xc4, - 0x07, 0x5f, 0xee, 0xa0, 0x43, 0x8d, 0xcc, 0x75, 0xe8, 0xe0, 0x30, 0xfd, - 0xd8, 0x87, 0x5c, 0x45, 0xf7, 0x61, 0x19, 0x7f, 0xe7, 0xdf, 0x59, 0xe4, - 0x5b, 0xc8, 0xeb, 0x78, 0xea, 0x01, 0xe6, 0xfd, 0x3d, 0xbf, 0xff, 0xd3, - 0x0c, 0x2f, 0x90, 0xcc, 0xe6, 0x75, 0x39, 0xd7, 0x3a, 0xff, 0xff, 0xef, - 0xf5, 0xd7, 0x96, 0xa4, 0x9e, 0xfb, 0xc8, 0xec, 0x7b, 0x4f, 0xb9, 0xd7, - 0xe8, 0xc1, 0xf6, 0xc9, 0xd7, 0xf2, 0x6e, 0x0e, 0x38, 0x4e, 0xb2, 0xce, - 0xa5, 0x9f, 0x2f, 0x4a, 0x04, 0xb6, 0xee, 0x35, 0x9d, 0x7a, 0x5f, 0x84, - 0xeb, 0x9f, 0x7f, 0x87, 0xc9, 0x31, 0x73, 0x8c, 0xd6, 0x27, 0xb3, 0xc5, - 0xed, 0x46, 0x7d, 0x7f, 0xff, 0x60, 0xcf, 0xad, 0x40, 0x33, 0xa9, 0xc7, - 0x6f, 0xc7, 0x5f, 0xc1, 0xc1, 0x57, 0x90, 0x75, 0x49, 0x7c, 0xf4, 0x30, - 0x9e, 0x61, 0x0e, 0xf1, 0x91, 0x4d, 0x09, 0x7e, 0x3e, 0xac, 0x8b, 0xb0, - 0xf8, 0x03, 0xaf, 0xa3, 0xfd, 0x6c, 0xdb, 0x65, 0x6a, 0xff, 0xff, 0x0e, - 0x07, 0xb0, 0xd8, 0xe2, 0x4f, 0xb3, 0xff, 0x53, 0x87, 0x54, 0x32, 0x23, - 0x12, 0x7d, 0x83, 0xf8, 0x64, 0xdf, 0xff, 0x92, 0x67, 0x79, 0x6a, 0x16, - 0x1e, 0xc0, 0xb0, 0xeb, 0xfe, 0xc9, 0xa5, 0x1b, 0xe6, 0xfe, 0x3a, 0xee, - 0x4f, 0x88, 0x8d, 0x15, 0x3b, 0xe0, 0xf7, 0xf9, 0xce, 0xbf, 0xc1, 0x79, - 0x64, 0xff, 0x89, 0xd7, 0xfe, 0xe6, 0x35, 0xcd, 0xd7, 0x5a, 0x68, 0xeb, - 0x4f, 0x08, 0x98, 0xc2, 0x4e, 0x19, 0xdc, 0xd3, 0xc3, 0xab, 0x0f, 0x39, - 0xcd, 0x6f, 0xef, 0x6c, 0xff, 0xdc, 0x61, 0xd7, 0xfb, 0x91, 0xe4, 0x04, - 0x48, 0xeb, 0xfb, 0x79, 0xde, 0x50, 0xd6, 0x75, 0xc3, 0x23, 0xaa, 0x0f, - 0x1a, 0x73, 0x1a, 0x68, 0x33, 0x61, 0x21, 0xc9, 0x08, 0x97, 0x0c, 0x5e, - 0xd2, 0x58, 0x1e, 0x19, 0xa3, 0x18, 0xa6, 0x88, 0x3c, 0x63, 0xfb, 0xbd, - 0xff, 0x9a, 0x1f, 0x61, 0x6c, 0xeb, 0xee, 0x03, 0xaf, 0xf4, 0xa6, 0xc1, - 0x7e, 0xe1, 0xd7, 0xdb, 0xca, 0x16, 0x75, 0xfc, 0xf3, 0x06, 0x06, 0x73, - 0xaa, 0x73, 0xcf, 0xda, 0x45, 0x7e, 0x78, 0x99, 0x3a, 0x75, 0xf4, 0x7e, - 0xd3, 0x43, 0xaf, 0x7b, 0xd0, 0x75, 0xfe, 0x4e, 0x44, 0xef, 0xc6, 0x1d, - 0x6f, 0x7c, 0x44, 0xc7, 0x09, 0x9c, 0x97, 0xc3, 0x77, 0xff, 0xb8, 0xc1, - 0xcd, 0xa3, 0x91, 0xc8, 0xd1, 0xd7, 0xf9, 0xe6, 0xee, 0x2f, 0x34, 0x75, - 0x61, 0xfd, 0x6d, 0x48, 0xbf, 0xc2, 0xaf, 0xc8, 0xda, 0x9b, 0x4e, 0xbf, - 0x2b, 0xec, 0xc5, 0x9d, 0x58, 0x7b, 0xe8, 0x71, 0x7f, 0xfa, 0x61, 0xc5, - 0x55, 0x7f, 0x69, 0x06, 0x63, 0xaf, 0xd8, 0x14, 0xe6, 0x8e, 0xbd, 0xef, - 0x6e, 0x75, 0xff, 0xdb, 0xb1, 0x3b, 0xf3, 0x63, 0x3a, 0x8b, 0x3a, 0x80, - 0x7c, 0xde, 0x1d, 0xbb, 0xfe, 0x1d, 0x5a, 0x37, 0x3b, 0x24, 0x56, 0x89, - 0xd1, 0xd2, 0xdc, 0x31, 0x6a, 0x15, 0xc0, 0x64, 0x2f, 0x52, 0x17, 0xdd, - 0x84, 0x13, 0x90, 0x7a, 0x33, 0x4b, 0xff, 0x0a, 0x7d, 0xdf, 0x36, 0xef, - 0x1f, 0x4e, 0xbf, 0xfc, 0x99, 0xc0, 0xc3, 0x79, 0xd8, 0xdf, 0x47, 0x5f, - 0x7d, 0x8e, 0x00, 0xeb, 0xff, 0x46, 0xfd, 0xec, 0x4f, 0x1f, 0xac, 0xeb, - 0x9f, 0x87, 0x5f, 0xde, 0x49, 0xd7, 0x0c, 0x3a, 0x82, 0x78, 0x5d, 0x15, - 0xbf, 0xfc, 0x09, 0xa4, 0x9c, 0x94, 0xd2, 0x4e, 0x48, 0xeb, 0xde, 0x49, - 0xce, 0xad, 0xcf, 0xa3, 0x89, 0x97, 0x66, 0xc1, 0xd7, 0xc0, 0xfa, 0x32, - 0x3a, 0xce, 0x26, 0xef, 0xc3, 0x17, 0xed, 0x6b, 0x04, 0x07, 0x50, 0x0f, - 0x2c, 0x49, 0x6a, 0x13, 0x54, 0x48, 0x45, 0x7f, 0x0a, 0x9b, 0xb7, 0x98, - 0xeb, 0xf7, 0xdf, 0x01, 0x78, 0x75, 0x2c, 0xf0, 0x40, 0x31, 0x79, 0x91, - 0xa3, 0xaf, 0xfa, 0x4f, 0xcf, 0x0c, 0x2f, 0x47, 0x5f, 0xe8, 0x0c, 0x73, - 0xf8, 0x01, 0xd7, 0x2f, 0x53, 0x1f, 0x4a, 0xcd, 0xef, 0xff, 0xe7, 0x6c, - 0x2e, 0xfc, 0x9f, 0xaf, 0xee, 0xa7, 0x24, 0x75, 0xff, 0xa1, 0xc7, 0x3d, - 0xe4, 0x6f, 0xc7, 0x54, 0x26, 0xd9, 0x84, 0x49, 0x08, 0x41, 0x2f, 0xfd, - 0x6e, 0x9a, 0x4c, 0x96, 0x98, 0x45, 0x94, 0xe0, 0x06, 0x35, 0x31, 0x12, - 0x64, 0x9e, 0x91, 0xea, 0x3d, 0x6f, 0x47, 0xcf, 0x7f, 0x47, 0xfb, 0xa6, - 0xfb, 0x07, 0x5f, 0xb1, 0xbc, 0xdf, 0xc7, 0x57, 0xc3, 0xda, 0x43, 0x2b, - 0xfd, 0xbc, 0xb0, 0x3d, 0xc9, 0xce, 0xae, 0x1e, 0xb8, 0x91, 0xdf, 0x2b, - 0xcc, 0xd1, 0xd7, 0xff, 0x60, 0xfe, 0xce, 0xe2, 0xe6, 0x76, 0x1d, 0x48, - 0x7c, 0xda, 0x22, 0xbf, 0xc2, 0xaf, 0x61, 0x6b, 0x13, 0xaf, 0xe6, 0xb4, - 0x8d, 0x8f, 0xfc, 0x75, 0xfa, 0x26, 0xcc, 0x61, 0xd5, 0x88, 0x8b, 0x43, - 0x2e, 0x99, 0xdf, 0xfb, 0xb9, 0x32, 0x4d, 0xfe, 0xc7, 0xfa, 0x3a, 0xf2, - 0x71, 0x53, 0xa9, 0x0f, 0x84, 0x51, 0x6f, 0xd1, 0xb1, 0xd8, 0x98, 0xea, - 0x91, 0xe5, 0x68, 0x82, 0xff, 0xef, 0xe6, 0x4e, 0xc6, 0xf2, 0x89, 0xa0, - 0xeb, 0xf0, 0x5c, 0x63, 0xa7, 0x5f, 0xd2, 0x8d, 0xfd, 0x9d, 0x3a, 0xff, - 0xf7, 0xb4, 0x80, 0x89, 0x6b, 0x33, 0x7f, 0x1d, 0x53, 0x1f, 0xb6, 0x8b, - 0x6b, 0xa8, 0xbe, 0x6e, 0x13, 0x77, 0xfb, 0xaf, 0x36, 0x26, 0xc0, 0x4e, - 0xa4, 0x3d, 0xed, 0x14, 0xdf, 0xff, 0xb9, 0xff, 0x39, 0x03, 0x8a, 0xa7, - 0x7b, 0x9f, 0x4e, 0xbf, 0x3a, 0x06, 0x04, 0xeb, 0xa3, 0xf3, 0xa8, 0x4d, - 0xd6, 0x89, 0x2f, 0xa7, 0x8d, 0x88, 0x3a, 0xfb, 0xa0, 0x7f, 0x1d, 0x6e, - 0x9d, 0x6d, 0xae, 0x6c, 0x7f, 0x21, 0xbf, 0xf9, 0x16, 0x9a, 0xec, 0x27, - 0x3f, 0x6b, 0x3a, 0xa1, 0x18, 0x88, 0xaa, 0xe5, 0x37, 0xf0, 0xe9, 0x36, - 0xc0, 0x4e, 0xbc, 0x28, 0xa9, 0xd7, 0xf7, 0x93, 0x89, 0xef, 0xce, 0xb4, - 0x2c, 0xf2, 0x3e, 0x8d, 0xdf, 0xdf, 0xfd, 0xee, 0x6f, 0xa3, 0xaf, 0xff, - 0xff, 0xdc, 0x8f, 0x0b, 0xb1, 0x35, 0x32, 0x71, 0x91, 0xaf, 0x46, 0xf1, - 0xf7, 0x34, 0x75, 0xfe, 0xee, 0x6f, 0x1c, 0x45, 0x9d, 0x7f, 0xff, 0xff, - 0xed, 0x6b, 0x3d, 0xd7, 0x5e, 0xb9, 0xc4, 0xdf, 0xce, 0xea, 0xe6, 0x4d, - 0xff, 0xa1, 0xbd, 0xe0, 0xeb, 0xdd, 0xce, 0x1d, 0x7f, 0x78, 0x5c, 0x18, - 0x27, 0x5f, 0x85, 0xc1, 0x82, 0x75, 0x7c, 0x3c, 0xef, 0x15, 0x54, 0x27, - 0xbe, 0x18, 0x41, 0xb9, 0x97, 0xa1, 0x3b, 0xfb, 0x4d, 0xf0, 0x1f, 0x7d, - 0x1d, 0x73, 0x6d, 0x9d, 0x5a, 0x37, 0x4d, 0x91, 0x5f, 0x93, 0xaf, 0x9d, - 0x29, 0x43, 0x45, 0x7f, 0xdf, 0xfa, 0x05, 0x8d, 0x58, 0x16, 0x75, 0xee, - 0xc0, 0x0e, 0xbf, 0xf7, 0xe1, 0xea, 0x71, 0x37, 0x9a, 0x0e, 0xa4, 0x44, - 0xcb, 0x9f, 0x08, 0xdd, 0xee, 0xfc, 0x6b, 0x3a, 0xfd, 0xd8, 0x1c, 0x9c, - 0xea, 0x83, 0xc7, 0x72, 0x1b, 0xfd, 0xd8, 0xf7, 0xeb, 0xff, 0xc7, 0x54, - 0x32, 0x92, 0x65, 0x08, 0x70, 0xc2, 0xb3, 0x78, 0x6c, 0xb5, 0x91, 0x4d, - 0x1b, 0x17, 0x08, 0x57, 0x09, 0x1e, 0xc3, 0x91, 0xcb, 0x40, 0xea, 0xd3, - 0x29, 0x19, 0x42, 0x1a, 0x85, 0x87, 0xa1, 0x9f, 0xb5, 0xd3, 0x60, 0x82, - 0xf9, 0x39, 0xf6, 0x63, 0xae, 0xcc, 0x3a, 0xf9, 0x9d, 0x4f, 0xa7, 0x57, - 0x4f, 0x6d, 0xa6, 0x49, 0xf4, 0x52, 0xfd, 0x34, 0x4d, 0xd8, 0x3a, 0xef, - 0xb0, 0x75, 0xe6, 0xdb, 0x6c, 0xab, 0xe9, 0x7b, 0x18, 0x52, 0x85, 0xfd, - 0xfb, 0x02, 0x80, 0xd1, 0xee, 0xfe, 0xae, 0x1f, 0x20, 0x98, 0xd4, 0x23, - 0x8f, 0x85, 0x0f, 0x09, 0xab, 0xbd, 0xa3, 0xaf, 0xfb, 0xe7, 0xbb, 0x1e, - 0xd7, 0x50, 0xeb, 0x68, 0xeb, 0xfd, 0xed, 0xe5, 0xd8, 0x19, 0xca, 0xbf, - 0xf6, 0x6f, 0x24, 0xc1, 0x1c, 0x09, 0xd7, 0xe9, 0xd7, 0xfe, 0xfe, 0x3a, - 0xa1, 0x1f, 0x5b, 0x8b, 0x70, 0xe8, 0x44, 0x34, 0x69, 0xe3, 0xbb, 0xfd, - 0xbc, 0xbf, 0x7f, 0xae, 0x13, 0xaf, 0xf8, 0x61, 0xbd, 0x20, 0xef, 0x23, - 0xae, 0x86, 0x1d, 0x42, 0x79, 0xbb, 0x4e, 0x2f, 0xa7, 0xfb, 0x0d, 0x67, - 0x5f, 0x86, 0x1b, 0xc1, 0x3a, 0xff, 0xbb, 0xbc, 0x2b, 0x34, 0xa1, 0xac, - 0xeb, 0x68, 0x27, 0xc7, 0x84, 0xb5, 0xc4, 0x58, 0xfa, 0x11, 0x55, 0x09, - 0xea, 0xe2, 0xb2, 0x42, 0x0d, 0xe1, 0xa9, 0x7f, 0x0e, 0xfa, 0x9b, 0x3c, - 0x75, 0xfc, 0x9e, 0x17, 0x06, 0x8e, 0xbf, 0xfd, 0xe9, 0xb3, 0x98, 0xeb, - 0x8e, 0xa0, 0x4e, 0xbf, 0xbf, 0x5e, 0x77, 0x77, 0x3a, 0x95, 0x45, 0x08, - 0x95, 0xe9, 0x22, 0xff, 0xf2, 0x04, 0x5f, 0x71, 0xcf, 0x62, 0x00, 0xeb, - 0xfa, 0x3d, 0xd9, 0x6b, 0xf3, 0xaf, 0xdd, 0x7e, 0x67, 0x0e, 0xbb, 0xf7, - 0x3a, 0x98, 0x6f, 0x04, 0x9a, 0xfe, 0xe4, 0x24, 0x9f, 0x47, 0x5f, 0xfb, - 0x7d, 0x22, 0xb9, 0xe4, 0xe6, 0x1d, 0x68, 0x9d, 0x11, 0x22, 0x41, 0xe2, - 0xbb, 0xf4, 0xed, 0x69, 0x9b, 0x9d, 0x7e, 0x4d, 0x44, 0xeb, 0x3d, 0x9f, - 0xb7, 0xe8, 0x7e, 0x03, 0xf3, 0xd9, 0xfb, 0x73, 0xc8, 0xf6, 0x7e, 0xdf, - 0x7f, 0x2c, 0xd1, 0xec, 0xfd, 0xa0, 0x9e, 0x88, 0x91, 0x5f, 0xa3, 0x35, - 0x82, 0x7b, 0x3f, 0x68, 0xf6, 0x7e, 0xdc, 0xfe, 0x3d, 0x9f, 0xab, 0x2d, - 0xed, 0x21, 0x3f, 0x9f, 0xd2, 0x2f, 0xb3, 0x65, 0x00, 0x7b, 0x3f, 0x68, - 0xf6, 0x7e, 0xdc, 0x08, 0x3d, 0x9f, 0xb7, 0xfd, 0x80, 0x7e, 0x66, 0xdc, - 0x09, 0xec, 0xfd, 0xbf, 0xb3, 0xa9, 0xaf, 0xe7, 0x3d, 0x9f, 0xb4, 0x04, - 0x51, 0x09, 0x16, 0x91, 0x6f, 0xb9, 0x3c, 0x78, 0xf6, 0x7e, 0xd1, 0xec, - 0xfd, 0xc3, 0x5f, 0x73, 0x6d, 0x9e, 0xcf, 0xda, 0x92, 0xb0, 0xd0, 0x9a, - 0x64, 0x21, 0x77, 0x84, 0xd7, 0x0a, 0x16, 0x61, 0xa8, 0x5c, 0xf9, 0x79, - 0xb2, 0x6b, 0xd2, 0x85, 0x4b, 0x67, 0xe9, 0x44, 0x48, 0x5f, 0xed, 0x64, - 0xa5, 0x1e, 0xdc, 0xea, 0xc3, 0xf0, 0xd1, 0xed, 0xff, 0xb1, 0x81, 0xce, - 0x36, 0xfd, 0x98, 0xeb, 0xff, 0xb4, 0x39, 0x34, 0x4e, 0x07, 0xdf, 0x47, - 0x5d, 0x29, 0xca, 0xbe, 0x99, 0xdf, 0x87, 0x54, 0xe8, 0xdd, 0xdc, 0x87, - 0xa7, 0xe2, 0x8b, 0xb0, 0x2f, 0x5c, 0x5d, 0x63, 0x79, 0xd1, 0x5b, 0xfc, - 0xbd, 0x0e, 0x7b, 0x00, 0x75, 0xff, 0x32, 0x00, 0x1f, 0xdf, 0x92, 0x3a, - 0xff, 0xce, 0xf3, 0xe2, 0xdc, 0x77, 0x91, 0xd7, 0xe6, 0xc5, 0xd5, 0xd6, - 0x1f, 0xb4, 0xc7, 0x35, 0x08, 0xe7, 0x78, 0x53, 0xdf, 0x87, 0xdd, 0xc9, - 0xce, 0xb8, 0x2d, 0x9d, 0x50, 0x6f, 0xb0, 0x9e, 0xff, 0xfd, 0x2e, 0x46, - 0xd7, 0x9a, 0x03, 0xd8, 0x5b, 0xcc, 0x75, 0xfe, 0xd8, 0x7d, 0x26, 0xa6, - 0xc3, 0xab, 0x74, 0x46, 0x71, 0x5e, 0xa1, 0x9a, 0xbb, 0x29, 0x60, 0x58, - 0x88, 0x90, 0xcf, 0x6b, 0x30, 0xe2, 0x37, 0x61, 0xe6, 0xf3, 0xb3, 0x03, - 0x18, 0xa6, 0x99, 0x3f, 0x85, 0x5d, 0xff, 0xff, 0x27, 0x5f, 0xb1, 0x25, - 0x30, 0x11, 0x2d, 0x07, 0xb1, 0xc3, 0xaf, 0xfc, 0xac, 0x6e, 0x31, 0xde, - 0xfe, 0xc3, 0xaf, 0xfe, 0xe4, 0x60, 0xe4, 0x93, 0xb9, 0xb4, 0xeb, 0xff, - 0xe1, 0x75, 0x75, 0x9b, 0x63, 0x7f, 0x6b, 0xf5, 0x9d, 0x41, 0x44, 0xa8, - 0xa1, 0x5f, 0xc2, 0xea, 0xf5, 0xe4, 0x75, 0xf9, 0x98, 0xb8, 0xd1, 0xd7, - 0x9b, 0x6d, 0xb2, 0xaf, 0x7d, 0x80, 0x14, 0xa1, 0x7f, 0x7f, 0xcf, 0x2f, - 0xbc, 0xcd, 0xaf, 0xc3, 0xaf, 0xff, 0xdd, 0xc9, 0x7d, 0x11, 0xc9, 0xe6, - 0x94, 0x72, 0x73, 0xa8, 0x51, 0x27, 0xe3, 0xbb, 0xfe, 0xf3, 0x8e, 0x6b, - 0x91, 0xa3, 0xaf, 0xa5, 0x00, 0xdc, 0xeb, 0xf8, 0x10, 0x39, 0xbf, 0x8e, - 0xb9, 0xc1, 0xf0, 0xf3, 0xbe, 0x91, 0x53, 0xa2, 0xd4, 0x61, 0x09, 0x7b, - 0x6c, 0x70, 0xea, 0x92, 0xba, 0x70, 0xb2, 0xe4, 0x35, 0x56, 0x44, 0xe5, - 0x80, 0x45, 0x18, 0x60, 0x7a, 0x1a, 0xfb, 0x49, 0xae, 0x49, 0xce, 0xbf, - 0xc2, 0xc0, 0xa6, 0xd8, 0x09, 0xd4, 0x13, 0xc9, 0xfc, 0x5a, 0xc0, 0x3a, - 0xff, 0xb2, 0x1a, 0xfe, 0x75, 0xf3, 0x87, 0x5e, 0x5a, 0x4c, 0x75, 0xfe, - 0x06, 0xca, 0x2c, 0x21, 0xc3, 0xaf, 0xfb, 0xdd, 0xcd, 0x7c, 0xf2, 0x4e, - 0x75, 0x41, 0xf8, 0x21, 0xad, 0xff, 0x0a, 0x7e, 0xd3, 0xd6, 0xcc, 0x78, - 0xea, 0x92, 0x66, 0xd3, 0x08, 0x2c, 0xef, 0xb0, 0x8c, 0x12, 0x0b, 0xec, - 0xf7, 0xd9, 0xce, 0xbc, 0xdb, 0x6d, 0x96, 0x21, 0x05, 0xf3, 0x1d, 0xd8, - 0x58, 0x84, 0x0a, 0x1a, 0xdb, 0xe7, 0xe6, 0x36, 0x75, 0x70, 0xf8, 0x36, - 0x9f, 0xde, 0x6d, 0xb6, 0xcb, 0x10, 0x7a, 0x8b, 0x10, 0x79, 0x43, 0x5b, - 0x7f, 0x67, 0xbb, 0xfb, 0xc8, 0xeb, 0xcd, 0xb6, 0xd9, 0xd7, 0xb5, 0x0a, - 0x94, 0xa1, 0x7f, 0x58, 0x8f, 0x26, 0x28, 0x89, 0x4f, 0x93, 0x29, 0xad, - 0x3d, 0xe5, 0xc7, 0x47, 0x7f, 0xf7, 0x62, 0x49, 0xec, 0xeb, 0x21, 0x67, - 0x54, 0x1f, 0x7e, 0xd2, 0xdb, 0xff, 0xd9, 0xd4, 0xe7, 0x5f, 0x34, 0x8f, - 0x39, 0xd7, 0xd1, 0xe8, 0x59, 0xd4, 0xb3, 0xe7, 0xf2, 0x3d, 0xfc, 0xdb, - 0x87, 0xf7, 0xfa, 0x75, 0xf0, 0xa4, 0x2a, 0x75, 0xef, 0xb0, 0x03, 0xaa, - 0x73, 0x7a, 0xb2, 0x0b, 0xf3, 0x23, 0xb0, 0xb2, 0xaf, 0xc2, 0xe2, 0x38, - 0x55, 0xd8, 0xc2, 0xae, 0x6d, 0xb2, 0xab, 0x0f, 0xdb, 0x44, 0xde, 0x23, - 0x6c, 0x56, 0xff, 0x0f, 0xd8, 0x07, 0x73, 0x60, 0xa5, 0x0d, 0xe5, 0xff, - 0xe9, 0xc3, 0xc7, 0x60, 0xe6, 0xde, 0x26, 0x8e, 0xa8, 0x4f, 0xd7, 0x08, - 0x91, 0xb5, 0xe1, 0xa9, 0xfa, 0x3d, 0xff, 0xd0, 0x0d, 0x66, 0x05, 0xc5, - 0xd5, 0x3a, 0xff, 0xfd, 0xd4, 0xda, 0x82, 0x1d, 0x47, 0x13, 0x37, 0xd1, - 0xd7, 0xf0, 0xc6, 0x71, 0xc0, 0x75, 0xff, 0xa3, 0x9d, 0x84, 0xec, 0x0a, - 0x1d, 0x74, 0xb4, 0xc4, 0x5c, 0xf9, 0x55, 0xb2, 0xab, 0xfd, 0x03, 0x8b, - 0x4d, 0xe4, 0x75, 0xff, 0xf6, 0x87, 0x37, 0x03, 0xe9, 0xf8, 0x9b, 0x80, - 0xea, 0xdd, 0x17, 0xbe, 0x3d, 0x6c, 0xc6, 0xba, 0x9f, 0x4b, 0xc7, 0x6f, - 0x7f, 0x6b, 0xe8, 0x7f, 0x19, 0x1d, 0x7f, 0x23, 0x03, 0x8e, 0x03, 0xaf, - 0xff, 0xde, 0xd6, 0xff, 0x03, 0x81, 0x87, 0xe6, 0x08, 0x0e, 0xbf, 0xfd, - 0xac, 0xf7, 0xc6, 0x75, 0x3b, 0xd4, 0x01, 0xa1, 0x0b, 0xbd, 0x13, 0xa9, - 0xa4, 0x57, 0x79, 0x5a, 0xfc, 0xbd, 0x36, 0xfb, 0x9d, 0x6d, 0x04, 0xf7, - 0xfe, 0x9b, 0x5f, 0xd9, 0x34, 0x93, 0x9a, 0x3a, 0xfe, 0x8d, 0xfe, 0xea, - 0x30, 0xea, 0x86, 0x5c, 0xc0, 0x61, 0xaf, 0x91, 0xac, 0xa4, 0xa9, 0xde, - 0x4a, 0x7f, 0x79, 0x46, 0xcd, 0x32, 0x91, 0x30, 0xd4, 0x67, 0x1e, 0x2a, - 0xfc, 0xb6, 0xf3, 0x6d, 0xb6, 0x55, 0xe7, 0x10, 0x94, 0xa1, 0x7f, 0x7d, - 0x9c, 0xcf, 0x1d, 0x40, 0x3c, 0xad, 0x15, 0x5f, 0x75, 0x1e, 0x47, 0x5f, - 0xef, 0x69, 0x39, 0xc4, 0x59, 0xd7, 0x97, 0x38, 0x4e, 0xa1, 0x3c, 0xff, - 0x19, 0x5e, 0xf8, 0xae, 0xc9, 0xd7, 0xbc, 0xe1, 0x3a, 0xb8, 0x6f, 0x74, - 0x45, 0x7f, 0x32, 0x00, 0x9c, 0x54, 0xeb, 0xfb, 0xee, 0x73, 0x32, 0x63, - 0xaf, 0xcf, 0xdf, 0x81, 0x83, 0xaa, 0x49, 0xc9, 0x84, 0x8b, 0x1b, 0xd1, - 0x78, 0x48, 0x74, 0x5b, 0xe2, 0xeb, 0xf3, 0xf3, 0x99, 0xb9, 0xd7, 0xff, - 0xbd, 0xd4, 0x70, 0x67, 0x03, 0x03, 0x23, 0xaf, 0xff, 0x6f, 0xf3, 0x70, - 0x40, 0xb1, 0xe7, 0x17, 0x3a, 0xa1, 0x17, 0x58, 0x4e, 0x28, 0xf7, 0xe8, - 0xd7, 0xd1, 0x91, 0xd7, 0xdf, 0x18, 0x92, 0x3a, 0xff, 0xff, 0xe7, 0x4f, - 0x27, 0x58, 0x9f, 0x24, 0x9d, 0x71, 0xf4, 0xb3, 0x98, 0x75, 0xee, 0xe6, - 0xc1, 0xd5, 0xd4, 0x46, 0xbb, 0x7d, 0xff, 0x0c, 0x6f, 0xa8, 0xf4, 0x04, - 0xeb, 0xda, 0xfb, 0xaf, 0x87, 0xb3, 0x84, 0x54, 0x14, 0xd0, 0x3d, 0x18, - 0x4d, 0xff, 0xff, 0xff, 0x46, 0xa3, 0xd3, 0xe3, 0x7c, 0xce, 0xbf, 0xdd, - 0x62, 0xae, 0x20, 0x81, 0x89, 0xbb, 0x07, 0x5f, 0xb5, 0xd7, 0x64, 0x1d, - 0x42, 0x8b, 0xa6, 0xe1, 0x29, 0x7f, 0xff, 0xf2, 0x2b, 0xbc, 0xbd, 0x83, - 0xed, 0x7c, 0xd6, 0xb3, 0x98, 0x2f, 0x23, 0xaf, 0xfe, 0x50, 0x23, 0x1f, - 0xb3, 0x15, 0x4e, 0x1d, 0x76, 0x36, 0x75, 0xb2, 0x0f, 0x6f, 0x48, 0xb7, - 0xf8, 0x3d, 0x89, 0x9d, 0xf7, 0x3a, 0xf7, 0x41, 0xb4, 0xea, 0xe1, 0xe8, - 0xec, 0x19, 0xd4, 0x91, 0x38, 0xee, 0xf7, 0xff, 0x67, 0x00, 0xb4, 0xd7, - 0xdd, 0x46, 0x1d, 0x7e, 0x0f, 0x23, 0x76, 0xb3, 0xaf, 0xff, 0xfd, 0xe8, - 0xe0, 0x19, 0xd4, 0x92, 0x71, 0xc1, 0xe1, 0x85, 0xe8, 0xeb, 0x9a, 0xf4, - 0x75, 0x2a, 0x88, 0x37, 0x6a, 0xa9, 0x26, 0x2b, 0x88, 0x8f, 0x0a, 0xeb, - 0xcd, 0x40, 0x80, 0xeb, 0xc1, 0xc5, 0x9d, 0x7c, 0x0f, 0x60, 0x0e, 0xbf, - 0x46, 0xb4, 0x9b, 0x4e, 0xa4, 0x3e, 0x4e, 0x0d, 0xf4, 0x86, 0xff, 0x99, - 0xd1, 0x8d, 0xd2, 0x3a, 0x75, 0x42, 0xfb, 0xdc, 0xa3, 0x1c, 0x09, 0x6e, - 0x46, 0xd0, 0x90, 0xe4, 0xe1, 0x43, 0xc6, 0xd4, 0x31, 0x9b, 0xe8, 0xd3, - 0xf8, 0x42, 0x7d, 0x2e, 0xbf, 0xf3, 0xa0, 0x7f, 0xf6, 0xa7, 0xc6, 0xce, - 0xbf, 0x6b, 0x15, 0x8d, 0x1d, 0x7f, 0x35, 0xe9, 0x07, 0x79, 0x1d, 0x7f, - 0xe7, 0xe6, 0xca, 0x77, 0x1f, 0x70, 0x1d, 0x7f, 0xfe, 0x4f, 0x42, 0xf3, - 0x7f, 0x42, 0xfe, 0xf1, 0xc0, 0x75, 0xf2, 0x0b, 0x84, 0xeb, 0xfe, 0xd4, - 0x73, 0xd0, 0xa0, 0x50, 0xea, 0x92, 0x2b, 0x42, 0xad, 0xa1, 0xfb, 0xff, - 0xda, 0x4e, 0x44, 0xbb, 0x13, 0x0f, 0xea, 0x9d, 0x73, 0x36, 0x4e, 0xbf, - 0x95, 0xf4, 0x76, 0x34, 0x75, 0xfd, 0xd4, 0xdf, 0x4f, 0xb9, 0xd5, 0x23, - 0xf4, 0x41, 0x90, 0x16, 0xdf, 0xf3, 0xcd, 0xd7, 0xe7, 0x10, 0x27, 0x5f, - 0x27, 0x5d, 0x67, 0x50, 0x9e, 0xc7, 0x8e, 0x2f, 0x43, 0x53, 0x73, 0xaf, - 0xef, 0xb1, 0xfb, 0x3f, 0x59, 0xd7, 0x20, 0x9d, 0x7d, 0x28, 0x16, 0x1d, - 0x41, 0x36, 0x98, 0x29, 0x7f, 0x47, 0x9a, 0x0f, 0x1b, 0x9d, 0x5f, 0x0f, - 0x41, 0x08, 0x2f, 0xa0, 0x18, 0x27, 0x54, 0x95, 0xf8, 0xe1, 0x3b, 0x0c, - 0x12, 0x1d, 0xb3, 0x18, 0x72, 0x17, 0xeb, 0x84, 0x36, 0x88, 0x7f, 0x20, - 0x6e, 0x16, 0xbb, 0x24, 0x77, 0xe4, 0x5b, 0x44, 0xd4, 0xda, 0xb3, 0xaf, - 0xbe, 0xc3, 0x7a, 0x3a, 0xe0, 0x78, 0xeb, 0x81, 0xd3, 0xaf, 0xb9, 0xcc, - 0xd1, 0xd7, 0x64, 0xc7, 0x5a, 0x5f, 0x11, 0x0f, 0x39, 0x22, 0xc5, 0x9c, - 0x5b, 0xe9, 0x0d, 0xf9, 0x3c, 0xe3, 0x87, 0x5f, 0xb8, 0x1c, 0xc1, 0x3a, - 0xff, 0xe6, 0xb4, 0xce, 0xc6, 0xdd, 0x76, 0x37, 0x3a, 0xfe, 0xdf, 0x9f, - 0xef, 0xe9, 0x1d, 0x4e, 0x89, 0xed, 0x12, 0xfe, 0x91, 0x7f, 0xd8, 0x3c, - 0xcd, 0x62, 0x74, 0xeb, 0xff, 0xe9, 0x78, 0x71, 0xfc, 0x39, 0xef, 0x63, - 0x67, 0x5d, 0x9b, 0x4e, 0xbf, 0xe6, 0x77, 0x02, 0xb4, 0xe6, 0x1d, 0x53, - 0x9e, 0x76, 0x0b, 0xdf, 0xd1, 0x1c, 0xec, 0x6d, 0x3a, 0xff, 0xf7, 0xb5, - 0x93, 0x76, 0x36, 0xe7, 0x7b, 0x07, 0x5f, 0xdd, 0x0a, 0x6d, 0x80, 0x9d, - 0x58, 0x7f, 0x2e, 0x97, 0x7d, 0xa4, 0xc0, 0x1d, 0x7d, 0x9e, 0x4d, 0x1d, - 0x7f, 0x35, 0x13, 0x0b, 0x57, 0x3f, 0xe7, 0x56, 0x8f, 0x6b, 0xc4, 0x15, - 0x25, 0x68, 0xc1, 0x86, 0x13, 0x0c, 0x37, 0x35, 0xe4, 0x26, 0xfa, 0x44, - 0x30, 0xa6, 0xd1, 0x07, 0x9e, 0xaf, 0xff, 0xde, 0x4d, 0x4f, 0x8d, 0xe9, - 0x27, 0x17, 0xdf, 0xc7, 0x5e, 0x6f, 0x3a, 0x75, 0xfe, 0xd2, 0x2b, 0xd7, - 0x14, 0x3a, 0xfd, 0x38, 0x45, 0xd5, 0x3a, 0xf9, 0x35, 0x81, 0xc4, 0x66, - 0x3a, 0xbf, 0x87, 0x3e, 0x98, 0xdf, 0xf9, 0xda, 0xc1, 0xfe, 0x90, 0x77, - 0x91, 0xd7, 0xf8, 0x38, 0x28, 0xdf, 0x7f, 0x3a, 0xff, 0xfb, 0xa9, 0x1e, - 0x40, 0x44, 0x94, 0x6d, 0xb6, 0xca, 0xbf, 0xf9, 0x23, 0xc0, 0x89, 0x28, - 0xdb, 0x6d, 0x95, 0x58, 0x89, 0x9e, 0xa9, 0x54, 0xe8, 0xee, 0xf4, 0x33, - 0x2f, 0xf7, 0x7f, 0x75, 0x85, 0xd6, 0x75, 0x09, 0xee, 0x78, 0xa6, 0xf8, - 0x39, 0x8a, 0x95, 0x7c, 0xe0, 0x7f, 0x1d, 0x7f, 0xdc, 0x76, 0x7c, 0xec, - 0x7d, 0x13, 0xaf, 0x7f, 0x1c, 0x3a, 0xef, 0x68, 0x27, 0xaf, 0x31, 0xdd, - 0xe9, 0x0f, 0xe6, 0x88, 0x66, 0xf7, 0x62, 0x73, 0xaf, 0xde, 0x89, 0x2a, - 0xb3, 0xaf, 0x36, 0xdb, 0x65, 0x5e, 0xc1, 0x61, 0x4a, 0x17, 0xf7, 0xfe, - 0xc9, 0xf0, 0x2f, 0x21, 0x89, 0xce, 0xa8, 0x45, 0x70, 0x11, 0xc4, 0xaa, - 0xf9, 0xc5, 0xa9, 0x34, 0x8e, 0xb9, 0xa9, 0x35, 0x23, 0xaf, 0xd9, 0xef, - 0x7f, 0x39, 0xd6, 0x93, 0x52, 0x3c, 0xb1, 0x22, 0xbc, 0xed, 0x70, 0x75, - 0xfb, 0x03, 0xd7, 0x6b, 0x3a, 0xfc, 0x38, 0x18, 0x59, 0xd5, 0x0a, 0xc5, - 0xa7, 0x21, 0x09, 0x0e, 0x3b, 0xee, 0x5f, 0x31, 0x4f, 0x21, 0x95, 0xd2, - 0xe7, 0x75, 0xfc, 0xb7, 0x68, 0xeb, 0x65, 0x37, 0xfa, 0x17, 0x89, 0xc9, - 0xa4, 0x75, 0xef, 0x24, 0x1d, 0x76, 0x09, 0xd4, 0x86, 0xbb, 0xf1, 0xab, - 0xf0, 0xc6, 0xf1, 0xa3, 0xaf, 0xfd, 0x88, 0x2f, 0xed, 0x37, 0x02, 0x75, - 0xee, 0xbf, 0x20, 0xf8, 0x74, 0x4d, 0x7c, 0x9c, 0x8f, 0x1d, 0x7d, 0xac, - 0x89, 0x1d, 0x41, 0x3c, 0x01, 0x20, 0xbf, 0x44, 0xbb, 0x9b, 0x9d, 0x76, - 0xe0, 0x3a, 0xfe, 0x5c, 0x68, 0x08, 0xc3, 0xaf, 0x6a, 0x15, 0x01, 0xe1, - 0xe8, 0x5e, 0xff, 0x7f, 0x9c, 0x00, 0x10, 0x4e, 0xbf, 0xf6, 0x2d, 0x03, - 0xcc, 0x0b, 0xac, 0xeb, 0xec, 0x5f, 0xd0, 0x9d, 0x5d, 0x3d, 0xf1, 0x3c, - 0xbf, 0xfc, 0x81, 0xef, 0xdd, 0x67, 0x18, 0xee, 0xc3, 0x44, 0x19, 0x7f, - 0xed, 0x01, 0xf7, 0xd7, 0xde, 0x75, 0xce, 0xbe, 0xff, 0xb8, 0xc3, 0xaa, - 0x48, 0xba, 0xf2, 0xbe, 0xca, 0x0d, 0xff, 0x6b, 0x51, 0xc9, 0x31, 0x27, - 0x3a, 0xfe, 0xfd, 0x51, 0xc9, 0xff, 0x3a, 0xa0, 0xfa, 0x7a, 0x73, 0x7b, - 0xbf, 0xb5, 0x9d, 0x7f, 0xfb, 0x8f, 0xb7, 0x05, 0x9d, 0x40, 0x7d, 0xf1, - 0xd5, 0x09, 0x94, 0xca, 0x13, 0x8d, 0x32, 0x1f, 0xc8, 0x2b, 0x75, 0x62, - 0x1d, 0x34, 0xd4, 0x24, 0x7d, 0x28, 0x12, 0xf3, 0xed, 0xc3, 0xaf, 0xfc, - 0x06, 0x75, 0x38, 0x29, 0xed, 0x1d, 0x7f, 0x80, 0x9d, 0xee, 0x01, 0xce, - 0xbf, 0xff, 0xe5, 0xe7, 0xbc, 0xfc, 0x18, 0xde, 0x5f, 0x78, 0x05, 0xa6, - 0x8e, 0xbf, 0xe5, 0xa3, 0x78, 0x21, 0xec, 0x1d, 0x77, 0x7f, 0x3a, 0xff, - 0xfd, 0x24, 0x10, 0xf7, 0x37, 0xfa, 0xe3, 0xe1, 0x09, 0xd7, 0x91, 0xb6, - 0xb3, 0xaf, 0xf6, 0x6d, 0xd7, 0xbd, 0x0b, 0x3a, 0xb8, 0x7a, 0x7d, 0x1f, - 0xa8, 0x4e, 0x03, 0x1a, 0x10, 0xde, 0x61, 0x7d, 0x42, 0xa2, 0xfe, 0x45, - 0xb3, 0x05, 0x87, 0x5f, 0xd9, 0xad, 0x9c, 0xe4, 0x1d, 0x5c, 0x3d, 0x9d, - 0x92, 0xba, 0x92, 0xfd, 0x88, 0x61, 0x05, 0x8e, 0x4c, 0x21, 0x49, 0x6f, - 0x4b, 0x4c, 0x71, 0xc0, 0x1e, 0xea, 0x3b, 0x1f, 0x42, 0x9e, 0xff, 0x6b, - 0x58, 0x20, 0xd9, 0xc3, 0xaf, 0x85, 0x36, 0x20, 0xeb, 0x4c, 0x75, 0xfd, - 0xac, 0x10, 0x6c, 0xe1, 0xd6, 0xdb, 0xf1, 0x12, 0xb8, 0x68, 0x02, 0x2d, - 0x08, 0xdf, 0xf7, 0xfe, 0x07, 0xeb, 0x8c, 0xf1, 0xd7, 0xff, 0x86, 0x7f, - 0x93, 0x20, 0xe0, 0x70, 0x55, 0x3a, 0xfe, 0x4d, 0xf6, 0x3b, 0x1e, 0x3a, - 0xf7, 0xdc, 0x83, 0xaa, 0x11, 0x2e, 0xd6, 0x96, 0xe6, 0x17, 0xff, 0xfb, - 0x05, 0xfd, 0xac, 0xe0, 0x01, 0x19, 0xbf, 0xb4, 0x87, 0x5d, 0x9b, 0x27, - 0x59, 0xc2, 0x7e, 0xde, 0x5e, 0xbd, 0x1c, 0x98, 0xea, 0xf8, 0xdd, 0xc2, - 0x44, 0xe1, 0x8c, 0xf0, 0xb2, 0x0c, 0x2f, 0xb2, 0x5c, 0xd3, 0x23, 0x5b, - 0xdd, 0x4d, 0x27, 0x28, 0xbb, 0x0b, 0x07, 0xa4, 0x08, 0x82, 0x33, 0x71, - 0x46, 0xfe, 0x1a, 0x2d, 0xc2, 0x9f, 0x64, 0x9e, 0xf6, 0xf3, 0xed, 0x3a, - 0xfe, 0xf8, 0xce, 0xc6, 0xfb, 0x07, 0x5e, 0xf8, 0x06, 0xce, 0xad, 0xcf, - 0x4b, 0xc6, 0x77, 0xf6, 0x37, 0x98, 0x2a, 0x9d, 0x7c, 0xb7, 0xcd, 0x1d, - 0x48, 0x79, 0x8e, 0x59, 0x7f, 0xfc, 0xc8, 0xd6, 0xa1, 0x79, 0xe4, 0xd7, - 0x5c, 0xeb, 0xfc, 0x23, 0x12, 0x5c, 0x21, 0xd7, 0xfb, 0xc9, 0xb5, 0x3d, - 0x28, 0x2a, 0xcb, 0x3a, 0xfe, 0xc1, 0x57, 0x90, 0xa2, 0x1e, 0x1f, 0xd3, - 0x3a, 0xc4, 0xc1, 0x51, 0x37, 0x4e, 0x57, 0xdc, 0xff, 0x79, 0x1d, 0x7f, - 0x86, 0x43, 0x8b, 0x86, 0x1d, 0x79, 0x61, 0xc3, 0xaa, 0x0f, 0xbf, 0x09, - 0x1c, 0xc2, 0xf6, 0xcf, 0xfe, 0x3a, 0xf9, 0xf8, 0xff, 0x4e, 0xbf, 0xfd, - 0xe8, 0x5a, 0x07, 0x05, 0x5e, 0xc2, 0xce, 0xa6, 0x22, 0x2b, 0x44, 0x1e, - 0x22, 0xbf, 0xfe, 0x4f, 0x76, 0x35, 0x1d, 0x84, 0x9e, 0x15, 0x3a, 0xff, - 0x76, 0x26, 0x92, 0x72, 0x47, 0x5f, 0xef, 0x23, 0x73, 0x0b, 0xb6, 0x75, - 0xfb, 0xde, 0xd3, 0x80, 0xeb, 0xf4, 0x2f, 0xd8, 0xc3, 0xae, 0x49, 0xce, - 0xa8, 0x4c, 0x60, 0x29, 0xdb, 0x99, 0xa1, 0xa7, 0x49, 0xfc, 0x4d, 0x7e, - 0x6d, 0x03, 0xb0, 0x87, 0x5f, 0xf7, 0x62, 0x48, 0x38, 0xb8, 0x3a, 0xff, - 0xb3, 0xdd, 0xc5, 0x8b, 0xf8, 0xeb, 0xfb, 0x6a, 0x73, 0x78, 0x6b, 0x3a, - 0xc2, 0x13, 0xe8, 0xc3, 0x6b, 0xf2, 0xe1, 0x93, 0x84, 0xeb, 0xe9, 0x42, - 0xdc, 0xeb, 0xf7, 0x00, 0xb4, 0xd1, 0xd7, 0x7b, 0x58, 0x7d, 0xee, 0x51, - 0xf4, 0x82, 0xa1, 0x1a, 0x1f, 0xc2, 0x56, 0xda, 0x3a, 0xfe, 0x89, 0xf0, - 0x51, 0x53, 0xab, 0x86, 0xf3, 0x42, 0x17, 0xff, 0x40, 0xbf, 0x60, 0x0a, - 0x73, 0x5a, 0x2a, 0xa7, 0x54, 0x6a, 0x18, 0xdb, 0x71, 0x91, 0x64, 0x37, - 0xf9, 0xc3, 0xad, 0x47, 0x24, 0x75, 0xdf, 0xce, 0x75, 0xfe, 0xde, 0x5b, - 0xe9, 0x3d, 0x07, 0x5e, 0x4d, 0xf4, 0x75, 0x61, 0xe8, 0x21, 0xa5, 0x22, - 0x22, 0x3a, 0xd1, 0x76, 0x30, 0xeb, 0xdc, 0xcd, 0x1d, 0xe2, 0xd6, 0xff, - 0xf8, 0x3f, 0x1d, 0x33, 0x51, 0x3e, 0x0a, 0x2a, 0x75, 0xfe, 0xe2, 0xe3, - 0x7f, 0x3b, 0x0e, 0xbf, 0xff, 0x87, 0x3d, 0xdc, 0x96, 0x32, 0x19, 0xe1, - 0x75, 0x9d, 0x58, 0x8d, 0x94, 0x4f, 0xd1, 0x9d, 0xf2, 0x2e, 0x26, 0x3a, - 0xff, 0xed, 0x26, 0xe3, 0x93, 0x72, 0x3d, 0xa3, 0xaf, 0xb2, 0x7f, 0xe4, - 0x75, 0x4c, 0x88, 0x80, 0x10, 0xb6, 0x89, 0x7d, 0xf8, 0x43, 0x07, 0x54, - 0x1e, 0xa3, 0x99, 0x5d, 0x8d, 0x9d, 0x45, 0xc4, 0x31, 0x7f, 0x6b, 0xec, - 0x72, 0x16, 0x5c, 0x43, 0x14, 0x5c, 0x43, 0x14, 0x5c, 0x43, 0x14, 0x5c, - 0x43, 0x14, 0x5c, 0x43, 0x15, 0x24, 0x5a, 0x20, 0xc0, 0x0f, 0x3f, 0x18, - 0xd9, 0x18, 0xd8, 0x18, 0xbb, 0xb8, 0x5c, 0x43, 0x17, 0xf3, 0xbf, 0xa6, - 0x85, 0x97, 0x10, 0xc7, 0xc3, 0x47, 0x66, 0x99, 0x71, 0x0c, 0x51, 0x71, - 0x0c, 0x51, 0x71, 0x0c, 0x54, 0x8d, 0x82, 0x0c, 0x51, 0x71, 0x0c, 0x51, - 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x51, - 0x71, 0x0c, 0x54, 0xe8, 0x90, 0x08, 0xc2, 0x0c, 0x00, 0x63, 0x43, 0x1b, - 0x46, 0x28, 0xb8, 0x86, 0x28, 0xb8, 0x86, 0x2a, 0x46, 0xc3, 0x43, 0x14, + 0x4a, 0x6f, 0xfe, 0xeb, 0x71, 0xcd, 0x63, 0x6f, 0xc5, 0x4e, 0xbe, 0x08, + 0x71, 0x67, 0x5c, 0x08, 0x2a, 0xe6, 0xdb, 0x2a, 0x90, 0xd6, 0xb6, 0x2b, + 0x7e, 0x0f, 0xef, 0xc9, 0x14, 0xa1, 0xa1, 0xac, 0x45, 0x42, 0xad, 0xf7, + 0xff, 0xbd, 0xbb, 0x13, 0xbb, 0x31, 0xee, 0xfd, 0xd1, 0xd7, 0xfa, 0x24, + 0x9e, 0x94, 0x78, 0xeb, 0x9a, 0x7a, 0x3b, 0x86, 0xc6, 0xff, 0xba, 0xfe, + 0xd3, 0x07, 0x27, 0x3a, 0xe6, 0x21, 0xd7, 0xc2, 0x9b, 0xc8, 0xeb, 0xfe, + 0x4d, 0xfb, 0x81, 0xe3, 0xb0, 0xea, 0x83, 0xd9, 0xe1, 0x0d, 0xff, 0x76, + 0x39, 0x0c, 0x41, 0x61, 0xd7, 0x95, 0x7d, 0x31, 0x18, 0xbc, 0x6e, 0xd8, + 0x21, 0xac, 0x4d, 0x0b, 0xd0, 0xfd, 0xa9, 0x2b, 0x26, 0xe4, 0x3b, 0x96, + 0x47, 0xfc, 0x20, 0x5b, 0x8d, 0xb2, 0xfe, 0x6d, 0x57, 0xf0, 0xc1, 0xd7, + 0xdf, 0xaf, 0x02, 0x75, 0x6e, 0x79, 0xfb, 0x05, 0xb7, 0xfe, 0xee, 0x6c, + 0x38, 0xab, 0x9b, 0xf8, 0xeb, 0xfe, 0xc6, 0x75, 0x03, 0xdf, 0xd5, 0x3a, + 0xf7, 0xb1, 0x87, 0x52, 0xcf, 0x57, 0x47, 0x57, 0xa4, 0xb0, 0x1d, 0x4a, + 0xa3, 0x50, 0x10, 0x96, 0xf1, 0x15, 0xff, 0x2a, 0xff, 0x21, 0x62, 0x8a, + 0x9d, 0x7f, 0xe7, 0xd2, 0xe1, 0x39, 0xc4, 0x6c, 0xeb, 0x69, 0x53, 0xf7, + 0xe9, 0xd5, 0xf3, 0xc9, 0xf8, 0x75, 0xff, 0x67, 0xbc, 0x8a, 0xfb, 0x18, + 0x75, 0xfd, 0x1b, 0xeb, 0x37, 0xf1, 0xd7, 0x72, 0x0e, 0xa0, 0x9e, 0x1f, + 0x8b, 0xaf, 0xf7, 0x91, 0x88, 0x18, 0xf1, 0xd7, 0xed, 0x43, 0x31, 0x67, + 0x54, 0x1e, 0xbe, 0x8c, 0x6d, 0xa0, 0xa6, 0x2b, 0x8f, 0x7c, 0x79, 0xad, + 0xd3, 0x94, 0x59, 0x4f, 0xa3, 0x35, 0xbf, 0xef, 0x24, 0xf1, 0xb8, 0x39, + 0x07, 0x5e, 0xd7, 0xb0, 0xeb, 0xb3, 0x5f, 0x0f, 0x53, 0xe9, 0xcd, 0xff, + 0xd9, 0xe4, 0xde, 0x43, 0x0d, 0x26, 0xa7, 0xb2, 0x75, 0xff, 0xef, 0xe5, + 0xd7, 0x4f, 0x20, 0xfb, 0xfe, 0x9d, 0x7e, 0xcf, 0x01, 0xfc, 0x75, 0x49, + 0x18, 0x1c, 0x50, 0xd9, 0x4a, 0xbf, 0xff, 0x47, 0x5f, 0x06, 0x38, 0xa8, + 0x7f, 0x7e, 0x48, 0xea, 0x92, 0x6f, 0x1e, 0x87, 0x8e, 0xc1, 0x9d, 0x42, + 0xf1, 0x2e, 0x42, 0xb5, 0x21, 0xf4, 0xf2, 0x90, 0x7f, 0x94, 0x09, 0x7d, + 0xd4, 0x79, 0x1d, 0x7f, 0xb0, 0x65, 0x9a, 0xfa, 0xb3, 0xaf, 0xcb, 0xd0, + 0x1d, 0xce, 0xaf, 0x1e, 0xcf, 0xd3, 0x3b, 0xfe, 0xe6, 0x0f, 0xce, 0xe6, + 0xed, 0x9d, 0x7f, 0xd2, 0x1f, 0xc1, 0xf1, 0x8b, 0x01, 0xd5, 0x3a, 0x62, + 0x92, 0x79, 0xc2, 0x4d, 0xce, 0xef, 0xfe, 0x7e, 0xe9, 0x24, 0x9e, 0x8f, + 0x68, 0xeb, 0xfe, 0x18, 0xcd, 0xfd, 0x9c, 0x83, 0xaf, 0xfd, 0x1d, 0xfb, + 0xa1, 0xcf, 0x77, 0x0e, 0xa8, 0x47, 0xaa, 0x1f, 0xba, 0x10, 0x0d, 0xaf, + 0xcf, 0xb4, 0x21, 0x83, 0xae, 0xd6, 0x8e, 0xbc, 0xdb, 0x6d, 0x9d, 0x70, + 0x1c, 0xa5, 0x0b, 0xfa, 0xe1, 0xed, 0x68, 0xd6, 0xff, 0xd9, 0xa1, 0x75, + 0x66, 0x14, 0x98, 0xeb, 0xf8, 0x11, 0x2e, 0xfd, 0xd1, 0xd7, 0xf2, 0x08, + 0x18, 0xc4, 0x3a, 0xf3, 0x83, 0x0a, 0xa9, 0x26, 0xac, 0xb8, 0x41, 0x74, + 0x88, 0x07, 0xdb, 0x4b, 0xf6, 0x4a, 0xef, 0xa0, 0x28, 0x13, 0xaf, 0xc1, + 0xe2, 0x7f, 0x39, 0xd7, 0xf9, 0xbc, 0x1c, 0xda, 0x9c, 0x3a, 0xfe, 0x1c, + 0xdc, 0x1f, 0x64, 0x75, 0x4c, 0x88, 0xb1, 0x29, 0xf1, 0x9d, 0xfb, 0x33, + 0xdd, 0xc3, 0xae, 0x75, 0x9d, 0x7f, 0xb3, 0x6e, 0x28, 0xdb, 0x6d, 0x95, + 0x7e, 0x9a, 0x33, 0xba, 0x3a, 0x84, 0xf7, 0xfe, 0x9c, 0x5f, 0xe6, 0x9c, + 0x7e, 0xce, 0xa7, 0x0e, 0xbc, 0xb7, 0xf1, 0xd5, 0x32, 0x3a, 0x7a, 0xe9, + 0xf9, 0x1e, 0xd3, 0x7b, 0xf8, 0x76, 0xba, 0xd1, 0x67, 0x5f, 0xb2, 0x69, + 0x44, 0x8e, 0xbf, 0xa7, 0x0c, 0x60, 0x84, 0xea, 0x85, 0x61, 0x92, 0x62, + 0x48, 0x55, 0xf4, 0xc1, 0xe3, 0x0e, 0xd2, 0x0f, 0x8b, 0x7e, 0x93, 0xde, + 0x70, 0x21, 0xd7, 0xfc, 0x11, 0xff, 0x59, 0x3e, 0x4e, 0x75, 0xe8, 0xe0, + 0x9d, 0x7f, 0xb0, 0x22, 0xfa, 0x40, 0x9d, 0x6e, 0x9d, 0x7b, 0xf7, 0x9c, + 0x4f, 0x03, 0x46, 0x16, 0x4e, 0x22, 0x3b, 0xcb, 0x54, 0xb4, 0xc2, 0x9c, + 0x69, 0xa7, 0x0c, 0x8b, 0xf0, 0xc4, 0xf1, 0x23, 0xaf, 0xff, 0x60, 0x5d, + 0x79, 0xbc, 0xb0, 0x18, 0x13, 0xae, 0xeb, 0x9d, 0x74, 0xda, 0x3a, 0xfd, + 0x9b, 0x50, 0x43, 0x86, 0xb3, 0xe8, 0xad, 0xfd, 0xf3, 0xd9, 0xad, 0x41, + 0xd7, 0xee, 0xe6, 0xfe, 0x83, 0xaf, 0xdb, 0x0f, 0x3f, 0xd9, 0x1d, 0x5f, + 0x13, 0x35, 0x51, 0xd2, 0x0f, 0xf0, 0xbb, 0xf2, 0x7b, 0xe0, 0xe7, 0x5c, + 0xeb, 0xff, 0x60, 0xcb, 0xb8, 0x23, 0x0d, 0x9d, 0x7f, 0xec, 0xe7, 0x1e, + 0x5f, 0x36, 0xc3, 0x59, 0xd5, 0x07, 0xff, 0x23, 0xba, 0xe2, 0x61, 0xa2, + 0x9b, 0xe8, 0x4f, 0xdf, 0xee, 0x6b, 0xb8, 0x29, 0xa3, 0xaa, 0x15, 0x67, + 0x24, 0xa6, 0x87, 0x35, 0xbf, 0xec, 0x0e, 0x0c, 0x0f, 0xf0, 0x75, 0xd0, + 0xd9, 0xd5, 0x0e, 0xfb, 0x02, 0x78, 0x51, 0xca, 0x72, 0x78, 0x33, 0x8e, + 0xb9, 0x08, 0x95, 0x61, 0x00, 0xc9, 0x7a, 0xfb, 0xba, 0x24, 0x61, 0x93, + 0x42, 0x43, 0x94, 0xfb, 0x55, 0xca, 0x83, 0xec, 0xe7, 0xcb, 0xaa, 0x82, + 0x1d, 0x23, 0x49, 0x95, 0xd4, 0xa6, 0xbf, 0x4e, 0x4e, 0x7f, 0x1c, 0x3e, + 0xd9, 0x60, 0xff, 0x4d, 0xb6, 0x0d, 0x6f, 0xfb, 0x38, 0x31, 0xe9, 0x67, + 0x4e, 0xbf, 0x84, 0x18, 0x17, 0x91, 0xd7, 0xfd, 0xed, 0x75, 0x21, 0x6e, + 0x13, 0xaf, 0xfd, 0xd4, 0x18, 0xdf, 0x48, 0xb8, 0x3a, 0xf6, 0xa3, 0x87, + 0x5d, 0xed, 0x30, 0xf5, 0xf7, 0x3c, 0xa8, 0x45, 0xef, 0xf0, 0x8e, 0xbf, + 0xcc, 0x1c, 0x94, 0x9f, 0x47, 0x5f, 0xce, 0xde, 0x03, 0xef, 0x8e, 0xbf, + 0x3c, 0xbe, 0x05, 0x0e, 0xbf, 0xb5, 0x81, 0x4d, 0x4e, 0x75, 0xe9, 0x40, + 0x0e, 0xbf, 0x7d, 0x9a, 0x50, 0xd6, 0x55, 0x42, 0xa4, 0x3c, 0x36, 0x56, + 0x1d, 0x08, 0x51, 0xc3, 0x1e, 0x97, 0xe8, 0xa3, 0xc5, 0xbf, 0x46, 0xec, + 0xc3, 0xaf, 0xfe, 0x54, 0x7f, 0x7f, 0xb9, 0xa4, 0x81, 0x3a, 0xf6, 0xca, + 0x04, 0xea, 0xe1, 0xf1, 0x2d, 0x12, 0xff, 0xed, 0xfd, 0xfa, 0xfb, 0x08, + 0x2e, 0x13, 0xaf, 0x95, 0xe3, 0xb6, 0x75, 0xbe, 0x9a, 0x20, 0x5b, 0x78, + 0xd4, 0x0a, 0x57, 0x8d, 0xe3, 0x63, 0xf5, 0x88, 0x81, 0x45, 0xfb, 0xf9, + 0x1a, 0x6c, 0xec, 0x36, 0x75, 0xfe, 0xea, 0x7d, 0x50, 0x00, 0x82, 0xab, + 0x87, 0xcd, 0xb2, 0x63, 0x7c, 0x3b, 0x0d, 0x3d, 0x1d, 0x48, 0x79, 0xbf, + 0x49, 0x6f, 0xee, 0xe7, 0xed, 0x3c, 0xd1, 0xd7, 0xfc, 0x3e, 0xd7, 0xfb, + 0xf9, 0x1b, 0x3a, 0xff, 0x7e, 0xfa, 0xcc, 0x15, 0x4e, 0xa8, 0x3e, 0xde, + 0x9d, 0xdf, 0xf4, 0x7b, 0x5f, 0x31, 0x68, 0x13, 0xaf, 0xfd, 0xf0, 0x5d, + 0x5f, 0x9a, 0x00, 0x20, 0xeb, 0xff, 0xd3, 0xfe, 0x0d, 0x49, 0x35, 0xa8, + 0xe4, 0x8e, 0xb2, 0x2a, 0x88, 0xee, 0x21, 0x5f, 0xe7, 0xee, 0xfa, 0x81, + 0xf1, 0xd5, 0xa3, 0xdb, 0xf1, 0x4d, 0xfe, 0xea, 0x4d, 0x28, 0x19, 0x1d, + 0x7f, 0xe8, 0x6f, 0x4d, 0x07, 0x66, 0x6f, 0xe3, 0xa9, 0x87, 0xeb, 0xe3, + 0x2b, 0xe9, 0x77, 0x27, 0x3a, 0xff, 0xa3, 0x75, 0xbf, 0xb3, 0x7f, 0x1d, + 0x5b, 0x9e, 0xd8, 0x91, 0x5f, 0xf4, 0x33, 0xdf, 0xf7, 0x90, 0xd9, 0xd7, + 0x71, 0xce, 0xbf, 0xfb, 0x6a, 0x6b, 0x58, 0x2c, 0x71, 0x01, 0xd7, 0xfb, + 0xa8, 0x10, 0xe3, 0x73, 0x1d, 0x7a, 0x38, 0x0c, 0x3f, 0x76, 0x21, 0xd7, + 0x11, 0x7d, 0xd8, 0x46, 0x5f, 0xf9, 0xf7, 0xd6, 0x79, 0x16, 0xf2, 0x3a, + 0xde, 0x3a, 0x80, 0x79, 0xbf, 0x4f, 0x6f, 0xff, 0xf4, 0xc3, 0x0b, 0xe4, + 0x33, 0x39, 0x9d, 0x4e, 0x75, 0xce, 0xbf, 0xff, 0xfb, 0xfd, 0x75, 0xe5, + 0xa9, 0x27, 0xbe, 0xf2, 0x3b, 0x1e, 0xd3, 0xee, 0x75, 0xfa, 0x30, 0x7d, + 0xb2, 0x75, 0xfc, 0x9b, 0x83, 0x8e, 0x13, 0xac, 0xb3, 0xa9, 0x67, 0xcb, + 0xd2, 0x81, 0x2d, 0xbb, 0x8d, 0x67, 0x5e, 0x97, 0xe1, 0x3a, 0xe7, 0xdf, + 0xe1, 0xf2, 0x4c, 0x5c, 0xe3, 0x35, 0x89, 0xec, 0xf1, 0x7b, 0x51, 0x9f, + 0x5f, 0xff, 0xd8, 0x33, 0xeb, 0x50, 0x0c, 0xea, 0x71, 0xdb, 0xf1, 0xd7, + 0xf0, 0x70, 0x55, 0xe4, 0x1d, 0x52, 0x5f, 0x3d, 0x0c, 0x27, 0x98, 0x43, + 0xbc, 0x64, 0x53, 0x42, 0x5f, 0x8f, 0xab, 0x22, 0xec, 0x3e, 0x00, 0xeb, + 0xe8, 0xff, 0x5b, 0x36, 0xd9, 0x5a, 0xbf, 0xff, 0xc3, 0x81, 0xec, 0x36, + 0x38, 0x93, 0xec, 0xff, 0xd4, 0xe1, 0xd5, 0x0c, 0x88, 0xc4, 0x9f, 0x60, + 0xfe, 0x19, 0x37, 0xff, 0xe4, 0x99, 0xde, 0x5a, 0x85, 0x87, 0xb0, 0x2c, + 0x3a, 0xff, 0xb2, 0x69, 0x46, 0xf9, 0xbf, 0x8e, 0xbb, 0x93, 0xe2, 0x23, + 0x45, 0x4e, 0xf8, 0x3d, 0xfe, 0x73, 0xaf, 0xf0, 0x5e, 0x59, 0x3f, 0xe2, + 0x75, 0xff, 0xb9, 0x8d, 0x73, 0x75, 0xd6, 0x9a, 0x3a, 0xd3, 0xc2, 0x26, + 0x30, 0x93, 0x86, 0x77, 0x34, 0xf0, 0xea, 0xc3, 0xce, 0x73, 0x5b, 0xfb, + 0xdb, 0x3f, 0xf7, 0x18, 0x75, 0xfe, 0xe4, 0x79, 0x01, 0x12, 0x3a, 0xfe, + 0xde, 0x77, 0x94, 0x35, 0x9d, 0x70, 0xc8, 0xea, 0x83, 0xc6, 0x9c, 0xc6, + 0x9a, 0x0c, 0xd8, 0x48, 0x72, 0x42, 0x25, 0xc3, 0x17, 0xb4, 0x96, 0x07, + 0x86, 0x68, 0xc6, 0x29, 0xa2, 0x0f, 0x18, 0xfe, 0xef, 0x7f, 0xe6, 0x87, + 0xd8, 0x5b, 0x3a, 0xfb, 0x80, 0xeb, 0xfd, 0x29, 0xb0, 0x5f, 0xb8, 0x75, + 0xf6, 0xf2, 0x85, 0x9d, 0x7f, 0x3c, 0xc1, 0x81, 0x9c, 0xea, 0x9c, 0xf3, + 0xf6, 0x91, 0x5f, 0x9e, 0x26, 0x4e, 0x9d, 0x7d, 0x1f, 0xb4, 0xd0, 0xeb, + 0xde, 0xf4, 0x1d, 0x7f, 0x93, 0x91, 0x3b, 0xf1, 0x87, 0x5b, 0xdf, 0x11, + 0x31, 0xc2, 0x67, 0x25, 0xf0, 0xdd, 0xff, 0xee, 0x30, 0x73, 0x68, 0xe4, + 0x72, 0x34, 0x75, 0xfe, 0x79, 0xbb, 0x8b, 0xcd, 0x1d, 0x58, 0x7f, 0x5b, + 0x52, 0x2f, 0xf0, 0xab, 0xf2, 0x36, 0xa6, 0xd3, 0xaf, 0xca, 0xfb, 0x31, + 0x67, 0x56, 0x1e, 0xfa, 0x1c, 0x5f, 0xfe, 0x98, 0x71, 0x55, 0x5f, 0xda, + 0x41, 0x98, 0xeb, 0xf6, 0x05, 0x39, 0xa3, 0xaf, 0x7b, 0xdb, 0x9d, 0x7f, + 0xf6, 0xec, 0x4e, 0xfc, 0xd8, 0xce, 0xa2, 0xce, 0xa0, 0x1f, 0x37, 0x87, + 0x6e, 0xff, 0x87, 0x56, 0x8d, 0xce, 0xc9, 0x15, 0xa2, 0x74, 0x74, 0xb7, + 0x0c, 0x5a, 0x85, 0x70, 0x19, 0x0b, 0xd4, 0x85, 0xf7, 0x61, 0x04, 0xe4, + 0x1e, 0x8c, 0xd2, 0xff, 0xc2, 0x9f, 0x77, 0xcd, 0xbb, 0xc7, 0xd3, 0xaf, + 0xff, 0x26, 0x70, 0x30, 0xde, 0x76, 0x37, 0xd1, 0xd7, 0xdf, 0x63, 0x80, + 0x3a, 0xff, 0xd1, 0xbf, 0x7b, 0x13, 0xc7, 0xeb, 0x3a, 0xe7, 0xe1, 0xd7, + 0xf7, 0x92, 0x75, 0xc3, 0x0e, 0xa0, 0x9e, 0x17, 0x45, 0x6f, 0xff, 0x02, + 0x69, 0x27, 0x25, 0x34, 0x93, 0x92, 0x3a, 0xf7, 0x92, 0x73, 0xab, 0x73, + 0xe8, 0xe2, 0x65, 0xd9, 0xb0, 0x75, 0xf0, 0x3e, 0x8c, 0x8e, 0xb3, 0x89, + 0xbb, 0xf0, 0xc5, 0xfb, 0x5a, 0xc1, 0x01, 0xd4, 0x03, 0xcb, 0x12, 0x5a, + 0x84, 0xd5, 0x12, 0x11, 0x5f, 0xc2, 0xa6, 0xed, 0xe6, 0x3a, 0xfd, 0xf7, + 0xc0, 0x5e, 0x1d, 0x4b, 0x3c, 0x10, 0x0c, 0x5e, 0x64, 0x68, 0xeb, 0xfe, + 0x93, 0xf3, 0xc3, 0x0b, 0xd1, 0xd7, 0xfa, 0x03, 0x1c, 0xfe, 0x00, 0x75, + 0xcb, 0xd4, 0xc7, 0xd2, 0xb3, 0x7b, 0xff, 0xf9, 0xdb, 0x0b, 0xbf, 0x27, + 0xeb, 0xfb, 0xa9, 0xc9, 0x1d, 0x7f, 0xe8, 0x71, 0xcf, 0x79, 0x1b, 0xf1, + 0xd5, 0x09, 0xb6, 0x61, 0x12, 0x42, 0x10, 0x4b, 0xff, 0x5b, 0xa6, 0x93, + 0x25, 0xa6, 0x11, 0x65, 0x38, 0x01, 0x8d, 0x4c, 0x44, 0x99, 0x27, 0xa4, + 0x7a, 0x8f, 0x5b, 0xd1, 0xf3, 0xdf, 0xd1, 0xfe, 0xe9, 0xbe, 0xc1, 0xd7, + 0xec, 0x6f, 0x37, 0xf1, 0xd5, 0xf0, 0xf6, 0x90, 0xca, 0xff, 0x6f, 0x2c, + 0x0f, 0x72, 0x73, 0xab, 0x87, 0xae, 0x24, 0x77, 0xca, 0xf3, 0x34, 0x75, + 0xff, 0xd8, 0x3f, 0xb3, 0xb8, 0xb9, 0x9d, 0x87, 0x52, 0x1f, 0x36, 0x88, + 0xaf, 0xf0, 0xab, 0xd8, 0x5a, 0xc4, 0xeb, 0xf9, 0xad, 0x23, 0x63, 0xff, + 0x1d, 0x7e, 0x89, 0xb3, 0x18, 0x75, 0x62, 0x22, 0xd0, 0xcb, 0xa6, 0x77, + 0xfe, 0xee, 0x4c, 0x93, 0x7f, 0xb1, 0xfe, 0x8e, 0xbc, 0x9c, 0x54, 0xea, + 0x43, 0xe1, 0x14, 0x5b, 0xf4, 0x6c, 0x76, 0x26, 0x3a, 0xa4, 0x79, 0x5a, + 0x20, 0xbf, 0xfb, 0xf9, 0x93, 0xb1, 0xbc, 0xa2, 0x68, 0x3a, 0xfc, 0x17, + 0x18, 0xe9, 0xd7, 0xf4, 0xa3, 0x7f, 0x67, 0x4e, 0xbf, 0xfd, 0xed, 0x20, + 0x22, 0x5a, 0xcc, 0xdf, 0xc7, 0x54, 0xc7, 0xed, 0xa2, 0xda, 0xea, 0x2f, + 0x9b, 0x84, 0xdd, 0xfe, 0xeb, 0xcd, 0x89, 0xb0, 0x13, 0xa9, 0x0f, 0x7b, + 0x45, 0x37, 0xff, 0xee, 0x7f, 0xce, 0x40, 0xe2, 0xa9, 0xde, 0xe7, 0xd3, + 0xaf, 0xce, 0x81, 0x81, 0x3a, 0xe8, 0xfc, 0xea, 0x13, 0x75, 0xa2, 0x4b, + 0xe9, 0xe3, 0x62, 0x0e, 0xbe, 0xe8, 0x1f, 0xc7, 0x5b, 0xa7, 0x5b, 0x6b, + 0x9b, 0x1f, 0xc8, 0x6f, 0xfe, 0x45, 0xa6, 0xbb, 0x09, 0xcf, 0xda, 0xce, + 0xa8, 0x46, 0x22, 0x2a, 0xb9, 0x4d, 0xfc, 0x3a, 0x4d, 0xb0, 0x13, 0xaf, + 0x0a, 0x2a, 0x75, 0xfd, 0xe4, 0xe2, 0x7b, 0xf3, 0xad, 0x0b, 0x3c, 0x8f, + 0xa3, 0x77, 0xf7, 0xff, 0x7b, 0x9b, 0xe8, 0xeb, 0xff, 0xff, 0xf7, 0x23, + 0xc2, 0xec, 0x4d, 0x4c, 0x9c, 0x64, 0x6b, 0xd1, 0xbc, 0x7d, 0xcd, 0x1d, + 0x7f, 0xbb, 0x9b, 0xc7, 0x11, 0x67, 0x5f, 0xff, 0xff, 0xfb, 0x5a, 0xcf, + 0x75, 0xd7, 0xae, 0x71, 0x37, 0xf3, 0xba, 0xb9, 0x93, 0x7f, 0xe8, 0x6f, + 0x78, 0x3a, 0xf7, 0x73, 0x87, 0x5f, 0xde, 0x17, 0x06, 0x09, 0xd7, 0xe1, + 0x70, 0x60, 0x9d, 0x5f, 0x0f, 0x3b, 0xc5, 0x55, 0x09, 0xef, 0x86, 0x10, + 0x6e, 0x65, 0xe8, 0x4e, 0xfe, 0xd3, 0x7c, 0x07, 0xdf, 0x47, 0x5c, 0xdb, + 0x67, 0x56, 0x8d, 0xd3, 0x64, 0x57, 0xe4, 0xeb, 0xe7, 0x4a, 0x50, 0xd1, + 0x5f, 0xf7, 0xfe, 0x81, 0x63, 0x56, 0x05, 0x9d, 0x7b, 0xb0, 0x03, 0xaf, + 0xfd, 0xf8, 0x7a, 0x9c, 0x4d, 0xe6, 0x83, 0xa9, 0x11, 0x32, 0xe7, 0xc2, + 0x37, 0x7b, 0xbf, 0x1a, 0xce, 0xbf, 0x76, 0x07, 0x27, 0x3a, 0xa0, 0xf1, + 0xdc, 0x86, 0xff, 0x76, 0x3d, 0xfa, 0xff, 0xf1, 0xd5, 0x0c, 0xa4, 0x99, + 0x42, 0x1c, 0x30, 0xac, 0xde, 0x1b, 0x2d, 0x64, 0x53, 0x46, 0xc5, 0xc2, + 0x15, 0xc2, 0x47, 0xb0, 0xe4, 0x72, 0xd0, 0x3a, 0xb4, 0xca, 0x46, 0x50, + 0x86, 0xa1, 0x61, 0xe8, 0x67, 0xed, 0x74, 0xd8, 0x20, 0xbe, 0x4e, 0x7d, + 0x98, 0xeb, 0xb3, 0x0e, 0xbe, 0x67, 0x53, 0xe9, 0xd5, 0xd3, 0xdb, 0x69, + 0x92, 0x7d, 0x14, 0xbf, 0x4d, 0x13, 0x76, 0x0e, 0xbb, 0xec, 0x1d, 0x79, + 0xb6, 0xdb, 0x2a, 0xfa, 0x5e, 0xc6, 0x14, 0xa1, 0x7f, 0x7e, 0xc0, 0xa0, + 0x34, 0x7b, 0xbf, 0xab, 0x87, 0xc8, 0x26, 0x35, 0x08, 0xe3, 0xe1, 0x43, + 0xc2, 0x6a, 0xef, 0x68, 0xeb, 0xfe, 0xf9, 0xee, 0xc7, 0xb5, 0xd4, 0x3a, + 0xda, 0x3a, 0xff, 0x7b, 0x79, 0x76, 0x06, 0x72, 0xaf, 0xfd, 0x9b, 0xc9, + 0x30, 0x47, 0x02, 0x75, 0xfa, 0x75, 0xff, 0xbf, 0x8e, 0xa8, 0x47, 0xd6, + 0xe2, 0xdc, 0x3a, 0x11, 0x0d, 0x1a, 0x78, 0xee, 0xff, 0x6f, 0x2f, 0xdf, + 0xeb, 0x84, 0xeb, 0xfe, 0x18, 0x6f, 0x48, 0x3b, 0xc8, 0xeb, 0xa1, 0x87, + 0x50, 0x9e, 0x6e, 0xd3, 0x8b, 0xe9, 0xfe, 0xc3, 0x59, 0xd7, 0xe1, 0x86, + 0xf0, 0x4e, 0xbf, 0xee, 0xef, 0x0a, 0xcd, 0x28, 0x6b, 0x3a, 0xda, 0x09, + 0xf1, 0xe1, 0x2d, 0x71, 0x16, 0x3e, 0x84, 0x55, 0x42, 0x7a, 0xb8, 0xac, + 0x90, 0x83, 0x78, 0x6a, 0x5f, 0xc3, 0xbe, 0xa6, 0xcf, 0x1d, 0x7f, 0x27, + 0x85, 0xc1, 0xa3, 0xaf, 0xff, 0x7a, 0x6c, 0xe6, 0x3a, 0xe3, 0xa8, 0x13, + 0xaf, 0xef, 0xd7, 0x9d, 0xdd, 0xce, 0xa5, 0x51, 0x42, 0x25, 0x7a, 0x48, + 0xbf, 0xfc, 0x81, 0x17, 0xdc, 0x73, 0xd8, 0x80, 0x3a, 0xfe, 0x8f, 0x76, + 0x5a, 0xfc, 0xeb, 0xf7, 0x5f, 0x99, 0xc3, 0xae, 0xfd, 0xce, 0xa6, 0x1b, + 0xc1, 0x26, 0xbf, 0xb9, 0x09, 0x27, 0xd1, 0xd7, 0xfe, 0xdf, 0x48, 0xae, + 0x79, 0x39, 0x87, 0x5a, 0x27, 0x44, 0x48, 0x90, 0x78, 0xae, 0xfd, 0x3b, + 0x5a, 0x66, 0xe7, 0x5f, 0x93, 0x51, 0x3a, 0xcf, 0x67, 0xed, 0xfa, 0x1f, + 0x80, 0xfc, 0xf6, 0x7e, 0xdc, 0xf2, 0x3d, 0x9f, 0xb7, 0xdf, 0xcb, 0x34, + 0x7b, 0x3f, 0x68, 0x27, 0xa2, 0x24, 0x57, 0xe8, 0xcd, 0x60, 0x9e, 0xcf, + 0xda, 0x3d, 0x9f, 0xb7, 0x3f, 0x8f, 0x67, 0xea, 0xcb, 0x7b, 0x48, 0x4f, + 0xe7, 0xf4, 0x8b, 0xec, 0xd9, 0x40, 0x1e, 0xcf, 0xda, 0x3d, 0x9f, 0xb7, + 0x02, 0x0f, 0x67, 0xed, 0xff, 0x60, 0x1f, 0x99, 0xb7, 0x02, 0x7b, 0x3f, + 0x6f, 0xec, 0xea, 0x6b, 0xf9, 0xcf, 0x67, 0xed, 0x01, 0x14, 0x42, 0x45, + 0xa4, 0x5b, 0xee, 0x4f, 0x1e, 0x3d, 0x9f, 0xb4, 0x7b, 0x3f, 0x70, 0xd7, + 0xdc, 0xdb, 0x67, 0xb3, 0xf6, 0xa4, 0xac, 0x34, 0x26, 0x99, 0x08, 0x5d, + 0xe1, 0x35, 0xc2, 0x85, 0x98, 0x6a, 0x17, 0x3e, 0x5e, 0x6c, 0x9a, 0xf4, + 0xa1, 0x52, 0xd9, 0xfa, 0x51, 0x12, 0x17, 0xfb, 0x59, 0x29, 0x47, 0xb7, + 0x3a, 0xb0, 0xfc, 0x34, 0x7b, 0x7f, 0xec, 0x60, 0x73, 0x8d, 0xbf, 0x66, + 0x3a, 0xff, 0xed, 0x0e, 0x4d, 0x13, 0x81, 0xf7, 0xd1, 0xd7, 0x4a, 0x72, + 0xaf, 0xa6, 0x77, 0xe1, 0xd5, 0x3a, 0x37, 0x77, 0x21, 0xe9, 0xf8, 0xa2, + 0xec, 0x0b, 0xd7, 0x17, 0x58, 0xde, 0x74, 0x56, 0xff, 0x2f, 0x43, 0x9e, + 0xc0, 0x1d, 0x7f, 0xcc, 0x80, 0x07, 0xf7, 0xe4, 0x8e, 0xbf, 0xf3, 0xbc, + 0xf8, 0xb7, 0x1d, 0xe4, 0x75, 0xf9, 0xb1, 0x75, 0x75, 0x87, 0xed, 0x31, + 0xcd, 0x42, 0x39, 0xde, 0x14, 0xf7, 0xe1, 0xf7, 0x72, 0x73, 0xae, 0x0b, + 0x67, 0x54, 0x1b, 0xec, 0x27, 0xbf, 0xff, 0x4b, 0x91, 0xb5, 0xe6, 0x80, + 0xf6, 0x16, 0xf3, 0x1d, 0x7f, 0xb6, 0x1f, 0x49, 0xa9, 0xb0, 0xea, 0xdd, + 0x11, 0x9c, 0x57, 0xa8, 0x66, 0xae, 0xca, 0x58, 0x16, 0x22, 0x24, 0x33, + 0xda, 0xcc, 0x38, 0x8d, 0xd8, 0x79, 0xbc, 0xec, 0xc0, 0xc6, 0x29, 0xa6, + 0x4f, 0xe1, 0x57, 0x7f, 0xff, 0xc9, 0xd7, 0xec, 0x49, 0x4c, 0x04, 0x4b, + 0x41, 0xec, 0x70, 0xeb, 0xff, 0x2b, 0x1b, 0x8c, 0x77, 0xbf, 0xb0, 0xeb, + 0xff, 0xb9, 0x18, 0x39, 0x24, 0xee, 0x6d, 0x3a, 0xff, 0xf8, 0x5d, 0x5d, + 0x66, 0xd8, 0xdf, 0xda, 0xfd, 0x67, 0x50, 0x51, 0x2a, 0x28, 0x57, 0xf0, + 0xba, 0xbd, 0x79, 0x1d, 0x7e, 0x66, 0x2e, 0x34, 0x75, 0xe6, 0xdb, 0x6c, + 0xab, 0xdf, 0x60, 0x05, 0x28, 0x5f, 0xdf, 0xf3, 0xcb, 0xef, 0x33, 0x6b, + 0xf0, 0xeb, 0xff, 0xf7, 0x72, 0x5f, 0x44, 0x72, 0x79, 0xa5, 0x1c, 0x9c, + 0xea, 0x14, 0x49, 0xf8, 0xee, 0xff, 0xbc, 0xe3, 0x9a, 0xe4, 0x68, 0xeb, + 0xe9, 0x40, 0x37, 0x3a, 0xfe, 0x04, 0x0e, 0x6f, 0xe3, 0xae, 0x70, 0x7c, + 0x3c, 0xef, 0xa4, 0x54, 0xe8, 0xb5, 0x18, 0x42, 0x5e, 0xdb, 0x1c, 0x3a, + 0xa4, 0xae, 0x9c, 0x2c, 0xb9, 0x0d, 0x55, 0x91, 0x39, 0x60, 0x11, 0x46, + 0x18, 0x1e, 0x86, 0xbe, 0xd2, 0x6b, 0x92, 0x73, 0xaf, 0xf0, 0xb0, 0x29, + 0xb6, 0x02, 0x75, 0x04, 0xf2, 0x7f, 0x16, 0xb0, 0x0e, 0xbf, 0xec, 0x86, + 0xbf, 0x9d, 0x7c, 0xe1, 0xd7, 0x96, 0x93, 0x1d, 0x7f, 0x81, 0xb2, 0x8b, + 0x08, 0x70, 0xeb, 0xfe, 0xf7, 0x73, 0x5f, 0x3c, 0x93, 0x9d, 0x50, 0x7e, + 0x08, 0x6b, 0x7f, 0xc2, 0x9f, 0xb4, 0xf5, 0xb3, 0x1e, 0x3a, 0xa4, 0x99, + 0xb4, 0xc2, 0x0b, 0x3b, 0xec, 0x23, 0x04, 0x82, 0xfb, 0x3d, 0xf6, 0x73, + 0xaf, 0x36, 0xdb, 0x65, 0x88, 0x41, 0x7c, 0xc7, 0x76, 0x16, 0x21, 0x02, + 0x86, 0xb6, 0xf9, 0xf9, 0x8d, 0x9d, 0x5c, 0x3e, 0x0d, 0xa7, 0xf7, 0x9b, + 0x6d, 0xb2, 0xc4, 0x1e, 0xa2, 0xc4, 0x1e, 0x50, 0xd6, 0xdf, 0xd9, 0xee, + 0xfe, 0xf2, 0x3a, 0xf3, 0x6d, 0xb6, 0x75, 0xed, 0x42, 0xa5, 0x28, 0x5f, + 0xd6, 0x23, 0xc9, 0x8a, 0x22, 0x53, 0xe4, 0xca, 0x6b, 0x4f, 0x79, 0x71, + 0xd1, 0xdf, 0xfd, 0xd8, 0x92, 0x7b, 0x3a, 0xc8, 0x59, 0xd5, 0x07, 0xdf, + 0xb4, 0xb6, 0xff, 0xf6, 0x75, 0x39, 0xd7, 0xcd, 0x23, 0xce, 0x75, 0xf4, + 0x7a, 0x16, 0x75, 0x2c, 0xf9, 0xfc, 0x8f, 0x7f, 0x36, 0xe1, 0xfd, 0xfe, + 0x9d, 0x7c, 0x29, 0x0a, 0x9d, 0x7b, 0xec, 0x00, 0xea, 0x9c, 0xde, 0xac, + 0x82, 0xfc, 0xc8, 0xec, 0x2c, 0xab, 0xf0, 0xb8, 0x8e, 0x15, 0x76, 0x30, + 0xab, 0x9b, 0x6c, 0xaa, 0xc3, 0xf6, 0xd1, 0x37, 0x88, 0xdb, 0x15, 0xbf, + 0xc3, 0xf6, 0x01, 0xdc, 0xd8, 0x29, 0x43, 0x79, 0x7f, 0xfa, 0x70, 0xf1, + 0xd8, 0x39, 0xb7, 0x89, 0xa3, 0xaa, 0x13, 0xf5, 0xc2, 0x24, 0x6d, 0x78, + 0x6a, 0x7e, 0x8f, 0x7f, 0xf4, 0x03, 0x59, 0x81, 0x71, 0x75, 0x4e, 0xbf, + 0xff, 0x75, 0x36, 0xa0, 0x87, 0x51, 0xc4, 0xcd, 0xf4, 0x75, 0xfc, 0x31, + 0x9c, 0x70, 0x1d, 0x7f, 0xe8, 0xe7, 0x61, 0x3b, 0x02, 0x87, 0x5d, 0x2d, + 0x31, 0x17, 0x3e, 0x55, 0x6c, 0xaa, 0xff, 0x40, 0xe2, 0xd3, 0x79, 0x1d, + 0x7f, 0xfd, 0xa1, 0xcd, 0xc0, 0xfa, 0x7e, 0x26, 0xe0, 0x3a, 0xb7, 0x45, + 0xef, 0x8f, 0x5b, 0x31, 0xae, 0xa7, 0xd2, 0xf1, 0xdb, 0xdf, 0xda, 0xfa, + 0x1f, 0xc6, 0x47, 0x5f, 0xc8, 0xc0, 0xe3, 0x80, 0xeb, 0xff, 0xf7, 0xb5, + 0xbf, 0xc0, 0xe0, 0x61, 0xf9, 0x82, 0x03, 0xaf, 0xff, 0x6b, 0x3d, 0xf1, + 0x9d, 0x4e, 0xf5, 0x00, 0x68, 0x42, 0xef, 0x44, 0xea, 0x69, 0x15, 0xde, + 0x56, 0xbf, 0x2f, 0x4d, 0xbe, 0xe7, 0x5b, 0x41, 0x3d, 0xff, 0xa6, 0xd7, + 0xf6, 0x4d, 0x24, 0xe6, 0x8e, 0xbf, 0xa3, 0x7f, 0xba, 0x8c, 0x3a, 0xa1, + 0x97, 0x30, 0x18, 0x6b, 0xe4, 0x6b, 0x29, 0x2a, 0x77, 0x92, 0x9f, 0xde, + 0x51, 0xb3, 0x4c, 0xa4, 0x4c, 0x35, 0x19, 0xc7, 0x8a, 0xbf, 0x2d, 0xbc, + 0xdb, 0x6d, 0x95, 0x79, 0xc4, 0x25, 0x28, 0x5f, 0xdf, 0x67, 0x33, 0xc7, + 0x50, 0x0f, 0x2b, 0x45, 0x57, 0xdd, 0x47, 0x91, 0xd7, 0xfb, 0xda, 0x4e, + 0x71, 0x16, 0x75, 0xe5, 0xce, 0x13, 0xa8, 0x4f, 0x3f, 0xc6, 0x57, 0xbe, + 0x2b, 0xb2, 0x75, 0xef, 0x38, 0x4e, 0xae, 0x1b, 0xdd, 0x11, 0x5f, 0xcc, + 0x80, 0x27, 0x15, 0x2a, 0xfe, 0xfb, 0x9c, 0xcc, 0x98, 0xeb, 0xf3, 0xf7, + 0xe0, 0x60, 0xea, 0x92, 0x72, 0x61, 0x22, 0xc6, 0xf4, 0x5e, 0x12, 0x1d, + 0x16, 0xf8, 0xba, 0xfc, 0xfc, 0xe6, 0x6e, 0x75, 0xff, 0xef, 0x75, 0x1c, + 0x19, 0xc0, 0xc0, 0xc8, 0xeb, 0xff, 0xdb, 0xfc, 0xdc, 0x10, 0x2c, 0x79, + 0xc5, 0xce, 0xa8, 0x45, 0xd6, 0x13, 0x8a, 0x3d, 0xfa, 0x35, 0xf4, 0x64, + 0x75, 0xf7, 0xc6, 0x24, 0x8e, 0xbf, 0xff, 0xf9, 0xd3, 0xc9, 0xd6, 0x27, + 0xc9, 0x27, 0x5c, 0x7d, 0x2c, 0xe6, 0x1d, 0x7b, 0xb9, 0xb0, 0x75, 0x75, + 0x11, 0xae, 0xdf, 0x7f, 0xc3, 0x1b, 0xea, 0x3d, 0x01, 0x3a, 0xf6, 0xbe, + 0xeb, 0xe1, 0xec, 0xe1, 0x15, 0x05, 0x34, 0x0f, 0x46, 0x13, 0x7f, 0xff, + 0xff, 0xd1, 0xa8, 0xf4, 0xf8, 0xdf, 0x33, 0xaf, 0xf7, 0x58, 0xab, 0x88, + 0x20, 0x62, 0x6e, 0xc1, 0xd7, 0xed, 0x75, 0xd9, 0x07, 0x50, 0xa2, 0xe9, + 0xb8, 0x4a, 0x5f, 0xff, 0xfc, 0x8a, 0xef, 0x2f, 0x60, 0xfb, 0x5f, 0x35, + 0xac, 0xe6, 0x0b, 0xc8, 0xeb, 0xff, 0x94, 0x08, 0xc7, 0xec, 0xc5, 0x53, + 0x87, 0x5d, 0x8d, 0x9d, 0x6c, 0x83, 0xdb, 0xd2, 0x2d, 0xfe, 0x0f, 0x62, + 0x67, 0x7d, 0xce, 0xbd, 0xd0, 0x6d, 0x3a, 0xb8, 0x7a, 0x3b, 0x06, 0x75, + 0x24, 0x4e, 0x3b, 0xbd, 0xff, 0xd9, 0xc0, 0x2d, 0x35, 0xf7, 0x51, 0x87, + 0x5f, 0x83, 0xc8, 0xdd, 0xac, 0xeb, 0xff, 0xff, 0x7a, 0x38, 0x06, 0x75, + 0x24, 0x9c, 0x70, 0x78, 0x61, 0x7a, 0x3a, 0xe6, 0xbd, 0x1d, 0x4a, 0xa2, + 0x0d, 0xda, 0xaa, 0x49, 0x8a, 0xe2, 0x23, 0xc2, 0xba, 0xf3, 0x50, 0x20, + 0x3a, 0xf0, 0x71, 0x67, 0x5f, 0x03, 0xd8, 0x03, 0xaf, 0xd1, 0xad, 0x26, + 0xd3, 0xa9, 0x0f, 0x93, 0x83, 0x7d, 0x21, 0xbf, 0xe6, 0x74, 0x63, 0x74, + 0x8e, 0x9d, 0x50, 0xbe, 0xf7, 0x28, 0xc7, 0x02, 0x5b, 0x91, 0xb4, 0x24, + 0x39, 0x38, 0x50, 0xf1, 0xb5, 0x0c, 0x66, 0xfa, 0x34, 0xfe, 0x10, 0x9f, + 0x4b, 0xaf, 0xfc, 0xe8, 0x1f, 0xfd, 0xa9, 0xf1, 0xb3, 0xaf, 0xda, 0xc5, + 0x63, 0x47, 0x5f, 0xcd, 0x7a, 0x41, 0xde, 0x47, 0x5f, 0xf9, 0xf9, 0xb2, + 0x9d, 0xc7, 0xdc, 0x07, 0x5f, 0xff, 0x93, 0xd0, 0xbc, 0xdf, 0xd0, 0xbf, + 0xbc, 0x70, 0x1d, 0x7c, 0x82, 0xe1, 0x3a, 0xff, 0xb5, 0x1c, 0xf4, 0x28, + 0x14, 0x3a, 0xa4, 0x8a, 0xd0, 0xab, 0x68, 0x7e, 0xff, 0xf6, 0x93, 0x91, + 0x2e, 0xc4, 0xc3, 0xfa, 0xa7, 0x5c, 0xcd, 0x93, 0xaf, 0xe5, 0x7d, 0x1d, + 0x8d, 0x1d, 0x7f, 0x75, 0x37, 0xd3, 0xee, 0x75, 0x48, 0xfd, 0x10, 0x64, + 0x05, 0xb7, 0xfc, 0xf3, 0x75, 0xf9, 0xc4, 0x09, 0xd7, 0xc9, 0xd7, 0x59, + 0xd4, 0x27, 0xb1, 0xe3, 0x8b, 0xd0, 0xd4, 0xdc, 0xeb, 0xfb, 0xec, 0x7e, + 0xcf, 0xd6, 0x75, 0xc8, 0x27, 0x5f, 0x4a, 0x05, 0x87, 0x50, 0x4d, 0xa6, + 0x0a, 0x5f, 0xd1, 0xe6, 0x83, 0xc6, 0xe7, 0x57, 0xc3, 0xd0, 0x42, 0x0b, + 0xe8, 0x06, 0x09, 0xd5, 0x25, 0x7e, 0x38, 0x4e, 0xc3, 0x04, 0x87, 0x6c, + 0xc6, 0x1c, 0x85, 0xfa, 0xe1, 0x0d, 0xa2, 0x1f, 0xc8, 0x1b, 0x85, 0xae, + 0xc9, 0x1d, 0xf9, 0x16, 0xd1, 0x35, 0x36, 0xac, 0xeb, 0xef, 0xb0, 0xde, + 0x8e, 0xb8, 0x1e, 0x3a, 0xe0, 0x74, 0xeb, 0xee, 0x73, 0x34, 0x75, 0xd9, + 0x31, 0xd6, 0x97, 0xc4, 0x43, 0xce, 0x48, 0xb1, 0x67, 0x16, 0xfa, 0x43, + 0x7e, 0x4f, 0x38, 0xe1, 0xd7, 0xee, 0x07, 0x30, 0x4e, 0xbf, 0xf9, 0xad, + 0x33, 0xb1, 0xb7, 0x5d, 0x8d, 0xce, 0xbf, 0xb7, 0xe7, 0xfb, 0xfa, 0x47, + 0x53, 0xa2, 0x7b, 0x44, 0xbf, 0xa4, 0x5f, 0xf6, 0x0f, 0x33, 0x58, 0x9d, + 0x3a, 0xff, 0xfa, 0x5e, 0x1c, 0x7f, 0x0e, 0x7b, 0xd8, 0xd9, 0xd7, 0x66, + 0xd3, 0xaf, 0xf9, 0x9d, 0xc0, 0xad, 0x39, 0x87, 0x54, 0xe7, 0x9d, 0x82, + 0xf7, 0xf4, 0x47, 0x3b, 0x1b, 0x4e, 0xbf, 0xfd, 0xed, 0x64, 0xdd, 0x8d, + 0xb9, 0xde, 0xc1, 0xd7, 0xf7, 0x42, 0x9b, 0x60, 0x27, 0x56, 0x1f, 0xcb, + 0xa5, 0xdf, 0x69, 0x30, 0x07, 0x5f, 0x67, 0x93, 0x47, 0x5f, 0xcd, 0x44, + 0xc2, 0xd5, 0xcf, 0xf9, 0xd5, 0xa3, 0xda, 0xf1, 0x05, 0x49, 0x5a, 0x30, + 0x61, 0x84, 0xc3, 0x0d, 0xcd, 0x79, 0x09, 0xbe, 0x91, 0x0c, 0x29, 0xb4, + 0x41, 0xe7, 0xab, 0xff, 0xf7, 0x93, 0x53, 0xe3, 0x7a, 0x49, 0xc5, 0xf7, + 0xf1, 0xd7, 0x9b, 0xce, 0x9d, 0x7f, 0xb4, 0x8a, 0xf5, 0xc5, 0x0e, 0xbf, + 0x4e, 0x11, 0x75, 0x4e, 0xbe, 0x4d, 0x60, 0x71, 0x19, 0x8e, 0xaf, 0xe1, + 0xcf, 0xa6, 0x37, 0xfe, 0x76, 0xb0, 0x7f, 0xa4, 0x1d, 0xe4, 0x75, 0xfe, + 0x0e, 0x0a, 0x37, 0xdf, 0xce, 0xbf, 0xfe, 0xea, 0x47, 0x90, 0x11, 0x25, + 0x1b, 0x6d, 0xb2, 0xaf, 0xfe, 0x48, 0xf0, 0x22, 0x4a, 0x36, 0xdb, 0x65, + 0x56, 0x22, 0x67, 0xaa, 0x55, 0x3a, 0x3b, 0xbd, 0x0c, 0xcb, 0xfd, 0xdf, + 0xdd, 0x61, 0x75, 0x9d, 0x42, 0x7b, 0x9e, 0x29, 0xbe, 0x0e, 0x62, 0xa5, + 0x5f, 0x38, 0x1f, 0xc7, 0x5f, 0xf7, 0x1d, 0x9f, 0x3b, 0x1f, 0x44, 0xeb, + 0xdf, 0xc7, 0x0e, 0xbb, 0xda, 0x09, 0xeb, 0xcc, 0x77, 0x7a, 0x43, 0xf9, + 0xa2, 0x19, 0xbd, 0xd8, 0x9c, 0xeb, 0xf7, 0xa2, 0x4a, 0xac, 0xeb, 0xcd, + 0xb6, 0xd9, 0x57, 0xb0, 0x58, 0x52, 0x85, 0xfd, 0xff, 0xb2, 0x7c, 0x0b, + 0xc8, 0x62, 0x73, 0xaa, 0x11, 0x5c, 0x04, 0x71, 0x2a, 0xbe, 0x71, 0x6a, + 0x4d, 0x23, 0xae, 0x6a, 0x4d, 0x48, 0xeb, 0xf6, 0x7b, 0xdf, 0xce, 0x75, + 0xa4, 0xd4, 0x8f, 0x2c, 0x48, 0xaf, 0x3b, 0x5c, 0x1d, 0x7e, 0xc0, 0xf5, + 0xda, 0xce, 0xbf, 0x0e, 0x06, 0x16, 0x75, 0x42, 0xb1, 0x69, 0xc8, 0x42, + 0x43, 0x8e, 0xfb, 0x97, 0xcc, 0x53, 0xc8, 0x65, 0x74, 0xb9, 0xdd, 0x7f, + 0x2d, 0xda, 0x3a, 0xd9, 0x4d, 0xfe, 0x85, 0xe2, 0x72, 0x69, 0x1d, 0x7b, + 0xc9, 0x07, 0x5d, 0x82, 0x75, 0x21, 0xae, 0xfc, 0x6a, 0xfc, 0x31, 0xbc, + 0x68, 0xeb, 0xff, 0x62, 0x0b, 0xfb, 0x4d, 0xc0, 0x9d, 0x7b, 0xaf, 0xc8, + 0x3e, 0x1d, 0x13, 0x5f, 0x27, 0x23, 0xc7, 0x5f, 0x6b, 0x22, 0x47, 0x50, + 0x4f, 0x00, 0x48, 0x2f, 0xd1, 0x2e, 0xe6, 0xe7, 0x5d, 0xb8, 0x0e, 0xbf, + 0x97, 0x1a, 0x02, 0x30, 0xeb, 0xda, 0x85, 0x40, 0x78, 0x7a, 0x17, 0xbf, + 0xdf, 0xe7, 0x00, 0x04, 0x13, 0xaf, 0xfd, 0x8b, 0x40, 0xf3, 0x02, 0xeb, + 0x3a, 0xfb, 0x17, 0xf4, 0x27, 0x57, 0x4f, 0x7c, 0x4f, 0x2f, 0xff, 0x20, + 0x7b, 0xf7, 0x59, 0xc6, 0x3b, 0xb0, 0xd1, 0x06, 0x5f, 0xfb, 0x40, 0x7d, + 0xf5, 0xf7, 0x9d, 0x73, 0xaf, 0xbf, 0xee, 0x30, 0xea, 0x92, 0x2e, 0xbc, + 0xaf, 0xb2, 0x83, 0x7f, 0xda, 0xd4, 0x72, 0x4c, 0x49, 0xce, 0xbf, 0xbf, + 0x54, 0x72, 0x7f, 0xce, 0xa8, 0x3e, 0x9e, 0x9c, 0xde, 0xef, 0xed, 0x67, + 0x5f, 0xfe, 0xe3, 0xed, 0xc1, 0x67, 0x50, 0x1f, 0x7c, 0x75, 0x42, 0x65, + 0x32, 0x84, 0xe3, 0x4c, 0x87, 0xf2, 0x0a, 0xdd, 0x58, 0x87, 0x4d, 0x35, + 0x09, 0x1f, 0x4a, 0x04, 0xbc, 0xfb, 0x70, 0xeb, 0xff, 0x01, 0x9d, 0x4e, + 0x0a, 0x7b, 0x47, 0x5f, 0xe0, 0x27, 0x7b, 0x80, 0x73, 0xaf, 0xff, 0xf9, + 0x79, 0xef, 0x3f, 0x06, 0x37, 0x97, 0xde, 0x01, 0x69, 0xa3, 0xaf, 0xf9, + 0x68, 0xde, 0x08, 0x7b, 0x07, 0x5d, 0xdf, 0xce, 0xbf, 0xff, 0x49, 0x04, + 0x3d, 0xcd, 0xfe, 0xb8, 0xf8, 0x42, 0x75, 0xe4, 0x6d, 0xac, 0xeb, 0xfd, + 0x9b, 0x75, 0xef, 0x42, 0xce, 0xae, 0x1e, 0x9f, 0x47, 0xea, 0x13, 0x80, + 0xc6, 0x84, 0x37, 0x98, 0x5f, 0x50, 0xa8, 0xbf, 0x91, 0x6c, 0xc1, 0x61, + 0xd7, 0xf6, 0x6b, 0x67, 0x39, 0x07, 0x57, 0x0f, 0x67, 0x64, 0xae, 0xa4, + 0xbf, 0x62, 0x18, 0x41, 0x63, 0x93, 0x08, 0x52, 0x5b, 0xd2, 0xd3, 0x1c, + 0x70, 0x07, 0xba, 0x8e, 0xc7, 0xd0, 0xa7, 0xbf, 0xda, 0xd6, 0x08, 0x36, + 0x70, 0xeb, 0xe1, 0x4d, 0x88, 0x3a, 0xd3, 0x1d, 0x7f, 0x6b, 0x04, 0x1b, + 0x38, 0x75, 0xb6, 0xfc, 0x44, 0xae, 0x1a, 0x00, 0x8b, 0x42, 0x37, 0xfd, + 0xff, 0x81, 0xfa, 0xe3, 0x3c, 0x75, 0xff, 0xe1, 0x9f, 0xe4, 0xc8, 0x38, + 0x1c, 0x15, 0x4e, 0xbf, 0x93, 0x7d, 0x8e, 0xc7, 0x8e, 0xbd, 0xf7, 0x20, + 0xea, 0x84, 0x4b, 0xb5, 0xa5, 0xb9, 0x85, 0xff, 0xfe, 0xc1, 0x7f, 0x6b, + 0x38, 0x00, 0x46, 0x6f, 0xed, 0x21, 0xd7, 0x66, 0xc9, 0xd6, 0x70, 0x9f, + 0xb7, 0x97, 0xaf, 0x47, 0x26, 0x3a, 0xbe, 0x37, 0x70, 0x91, 0x38, 0x63, + 0x3c, 0x2c, 0x83, 0x0b, 0xec, 0x97, 0x34, 0xc8, 0xd6, 0xf7, 0x53, 0x49, + 0xca, 0x2e, 0xc2, 0xc1, 0xe9, 0x02, 0x20, 0x8c, 0xdc, 0x51, 0xbf, 0x86, + 0x8b, 0x70, 0xa7, 0xd9, 0x27, 0xbd, 0xbc, 0xfb, 0x4e, 0xbf, 0xbe, 0x33, + 0xb1, 0xbe, 0xc1, 0xd7, 0xbe, 0x01, 0xb3, 0xab, 0x73, 0xd2, 0xf1, 0x9d, + 0xfd, 0x8d, 0xe6, 0x0a, 0xa7, 0x5f, 0x2d, 0xf3, 0x47, 0x52, 0x1e, 0x63, + 0x96, 0x5f, 0xff, 0x32, 0x35, 0xa8, 0x5e, 0x79, 0x35, 0xd7, 0x3a, 0xff, + 0x08, 0xc4, 0x97, 0x08, 0x75, 0xfe, 0xf2, 0x6d, 0x4f, 0x4a, 0x0a, 0xb2, + 0xce, 0xbf, 0xb0, 0x55, 0xe4, 0x28, 0x87, 0x87, 0xf4, 0xce, 0xb1, 0x30, + 0x54, 0x4d, 0xd3, 0x95, 0xf7, 0x3f, 0xde, 0x47, 0x5f, 0xe1, 0x90, 0xe2, + 0xe1, 0x87, 0x5e, 0x58, 0x70, 0xea, 0x83, 0xef, 0xc2, 0x47, 0x30, 0xbd, + 0xb3, 0xff, 0x8e, 0xbe, 0x7e, 0x3f, 0xd3, 0xaf, 0xff, 0x7a, 0x16, 0x81, + 0xc1, 0x57, 0xb0, 0xb3, 0xa9, 0x88, 0x8a, 0xd1, 0x07, 0x88, 0xaf, 0xff, + 0x93, 0xdd, 0x8d, 0x47, 0x61, 0x27, 0x85, 0x4e, 0xbf, 0xdd, 0x89, 0xa4, + 0x9c, 0x91, 0xd7, 0xfb, 0xc8, 0xdc, 0xc2, 0xed, 0x9d, 0x7e, 0xf7, 0xb4, + 0xe0, 0x3a, 0xfd, 0x0b, 0xf6, 0x30, 0xeb, 0x92, 0x73, 0xaa, 0x13, 0x18, + 0x0a, 0x76, 0xe6, 0x68, 0x69, 0xd2, 0x7f, 0x13, 0x5f, 0x9b, 0x40, 0xec, + 0x21, 0xd7, 0xfd, 0xd8, 0x92, 0x0e, 0x2e, 0x0e, 0xbf, 0xec, 0xf7, 0x71, + 0x62, 0xfe, 0x3a, 0xfe, 0xda, 0x9c, 0xde, 0x1a, 0xce, 0xb0, 0x84, 0xfa, + 0x30, 0xda, 0xfc, 0xb8, 0x64, 0xe1, 0x3a, 0xfa, 0x50, 0xb7, 0x3a, 0xfd, + 0xc0, 0x2d, 0x34, 0x75, 0xde, 0xd6, 0x1f, 0x7b, 0x94, 0x7d, 0x20, 0xa8, + 0x46, 0x87, 0xf0, 0x95, 0xb6, 0x8e, 0xbf, 0xa2, 0x7c, 0x14, 0x54, 0xea, + 0xe1, 0xbc, 0xd0, 0x85, 0xff, 0xd0, 0x2f, 0xd8, 0x02, 0x9c, 0xd6, 0x8a, + 0xa9, 0xd5, 0x1a, 0x86, 0x36, 0xdc, 0x64, 0x59, 0x0d, 0xfe, 0x70, 0xeb, + 0x51, 0xc9, 0x1d, 0x77, 0xf3, 0x9d, 0x7f, 0xb7, 0x96, 0xfa, 0x4f, 0x41, + 0xd7, 0x93, 0x7d, 0x1d, 0x58, 0x7a, 0x08, 0x69, 0x48, 0x88, 0x8e, 0xb4, + 0x5d, 0x8c, 0x3a, 0xf7, 0x33, 0x47, 0x78, 0xb5, 0xbf, 0xfe, 0x0f, 0xc7, + 0x4c, 0xd4, 0x4f, 0x82, 0x8a, 0x9d, 0x7f, 0xb8, 0xb8, 0xdf, 0xce, 0xc3, + 0xaf, 0xff, 0xe1, 0xcf, 0x77, 0x25, 0x8c, 0x86, 0x78, 0x5d, 0x67, 0x56, + 0x23, 0x65, 0x13, 0xf4, 0x67, 0x7c, 0x8b, 0x89, 0x8e, 0xbf, 0xfb, 0x49, + 0xb8, 0xe4, 0xdc, 0x8f, 0x68, 0xeb, 0xec, 0x9f, 0xf9, 0x1d, 0x53, 0x22, + 0x20, 0x04, 0x2d, 0xa2, 0x5f, 0x7e, 0x10, 0xc1, 0xd5, 0x07, 0xa8, 0xe6, + 0x57, 0x63, 0x67, 0x51, 0x71, 0x0c, 0x5f, 0xda, 0xfb, 0x1c, 0x85, 0x97, + 0x10, 0xc5, 0x17, 0x10, 0xc5, 0x17, 0x10, 0xc5, 0x17, 0x10, 0xc5, 0x17, + 0x10, 0xc5, 0x49, 0x16, 0x88, 0x30, 0x03, 0xcf, 0xc6, 0x36, 0x46, 0x36, + 0x06, 0x2e, 0xee, 0x17, 0x10, 0xc5, 0xfc, 0xef, 0xe9, 0xa1, 0x65, 0xc4, + 0x31, 0xf0, 0xd1, 0xd9, 0xa6, 0x5c, 0x43, 0x14, 0x5c, 0x43, 0x14, 0x5c, + 0x43, 0x15, 0x23, 0x60, 0x83, 0x14, 0x5c, 0x43, 0x14, 0x5c, 0x43, 0x14, 0x5c, 0x43, 0x14, 0x5c, 0x43, 0x14, 0x5c, 0x43, 0x14, 0x5c, 0x43, 0x15, - 0x23, 0xe0, 0x00, 0xc7, 0x86, 0x36, 0x06, 0x28, 0xb8, 0x86, 0x28, 0xb8, - 0x86, 0x28, 0xb8, 0x86, 0x28, 0xb8, 0x86, 0x2a, 0x73, 0xe0, 0x54, 0x63, - 0x83, 0x1d, 0x18, 0xb2, 0xa5, 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x45, 0xc4, - 0x31, 0x45, 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x41, 0x3e, 0x0d, 0xc6, 0x00, - 0x31, 0xf8, 0xc5, 0x17, 0x10, 0xc5, 0x17, 0x10, 0xc5, 0x17, 0x10, 0xc5, - 0xfb, 0xb0, 0x0d, 0x61, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x54, 0x91, 0x28, - 0xc1, 0x8e, 0x8c, 0x38, 0xc0, 0x0d, 0x2c, 0xc2, 0xe2, 0x18, 0xa2, 0xe2, - 0x18, 0xa2, 0xe2, 0x18, 0xa2, 0xe2, 0x18, 0xa2, 0xe2, 0x18, 0xa9, 0x1f, - 0x06, 0xe3, 0x08, 0x31, 0xb4, 0x62, 0x8b, 0x88, 0x62, 0x8b, 0x88, 0x62, - 0x8b, 0x88, 0x62, 0x8b, 0x88, 0x62, 0xa4, 0x7c, 0x01, 0x18, 0xe8, 0xc0, - 0x8c, 0x5b, 0xa5, 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x69, - 0x17, 0x10, 0xc5, 0x17, 0x10, 0xc6, 0xe5, 0xf5, 0x17, 0x10, 0xc5, 0x17, - 0x10, 0xc5, 0x17, 0x10, 0xc5, 0x17, 0x10, 0xc5, 0x4e, 0x8d, 0x69, 0x0c, - 0x2a, 0x6c, 0xc2, 0x89, 0x86, 0x00, 0x31, 0xe1, 0x8b, 0x61, 0x71, 0x0c, - 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x5a, 0x45, 0xc4, 0x31, 0x45, 0xc4, - 0x31, 0xb9, 0x7d, 0x45, 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x50, 0x8a, 0x69, - 0x0c, 0x21, 0xb7, 0x0a, 0x16, 0x31, 0x45, 0xc4, 0x31, 0x45, 0xc4, 0x31, - 0x45, 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x50, 0x7f, 0x1b, - 0x8c, 0x70, 0x61, 0x63, 0x02, 0x31, 0x45, 0xc4, 0x31, 0x45, 0xc4, 0x31, - 0x45, 0xc4, 0x31, 0x5c, 0x3c, 0x8d, 0x0c, 0x78, 0x62, 0x8b, 0x88, 0x62, - 0x8b, 0x88, 0x62, 0x8b, 0x88, 0x62, 0x96, 0x79, 0x02, 0x31, 0xe1, 0x8b, - 0x2c, 0xb8, 0x86, 0x28, 0xb8, 0x86, 0x28, 0xb8, 0x86, 0x28, 0x06, 0xc3, - 0xf1, 0x8a, 0x2e, 0x21, 0x8a, 0x2e, 0x21, 0x8a, 0x2e, 0x21, 0x8a, 0x2e, - 0x21, 0x8a, 0x83, 0xe0, 0x98, 0x63, 0xa3, 0x1f, 0x8c, 0x54, 0x32, 0xf1, - 0xa7, 0x84, 0x04, 0x93, 0x02, 0xa5, 0x90, 0xb0, 0x64, 0x22, 0x77, 0x84, - 0x0a, 0x42, 0x7d, 0xac, 0xfa, 0x67, 0xfe, 0x43, 0x49, 0x69, 0x3d, 0x7e, - 0x78, 0x4f, 0x00, 0xec, 0x61, 0xe9, 0xa6, 0x7f, 0x43, 0x0f, 0xf8, 0x60, - 0x6d, 0x84, 0x83, 0x6e, 0xfb, 0x25, 0xdf, 0x53, 0xb6, 0x21, 0x05, 0x7e, - 0x90, 0xc6, 0x68, 0xb8, 0x86, 0x14, 0x4e, 0x3a, 0xf2, 0x42, 0xcb, 0x88, - 0x62, 0xf9, 0x18, 0xfc, 0x3e, 0x21, 0x97, 0x90, 0x38, 0x7c, 0x43, 0x2c, - 0xa6, 0xe8, 0xc3, 0xe2, 0x3f, 0x4a, 0x3c, 0x5b, 0x68, 0xda, 0xcf, 0x26, - 0xfb, 0x4e, 0xe1, 0xbf, 0xdd, 0x46, 0xc3, 0xc8, 0x9c, 0xeb, 0xc9, 0xb5, - 0xa6, 0x75, 0x6e, 0x88, 0xe9, 0x8e, 0x7c, 0x69, 0x7e, 0xcc, 0x99, 0xfe, - 0x9d, 0x70, 0x20, 0xeb, 0xfb, 0x8e, 0x3f, 0x60, 0x07, 0x5c, 0xfc, 0x3a, - 0xc8, 0x73, 0x0b, 0x5b, 0x30, 0xeb, 0x2c, 0xeb, 0xb6, 0x54, 0x44, 0x4a, - 0xf0, 0x57, 0xa8, 0x4e, 0x3d, 0xf4, 0x42, 0xff, 0xbb, 0x0b, 0xc9, 0xa0, - 0x67, 0x3a, 0xff, 0xef, 0x8e, 0xc0, 0xf6, 0x01, 0x82, 0x03, 0xae, 0x04, - 0x1d, 0x58, 0x7b, 0x20, 0x44, 0xac, 0x4c, 0x30, 0x0b, 0x5f, 0xc2, 0x46, - 0xff, 0xe1, 0x18, 0x9c, 0x71, 0x36, 0xc6, 0xc9, 0xd7, 0xa3, 0x7d, 0x1d, - 0x4e, 0x7c, 0x3a, 0x45, 0xbc, 0xfc, 0x83, 0xaf, 0xc9, 0xb2, 0xe2, 0x03, - 0xaa, 0x47, 0x84, 0xb1, 0xab, 0xfe, 0xfa, 0xe1, 0xd6, 0x2e, 0x1a, 0xce, - 0xbd, 0x9b, 0xb6, 0x75, 0xed, 0xc1, 0x9c, 0x3d, 0x91, 0x3c, 0xbe, 0xdb, - 0x9c, 0x91, 0xd7, 0x82, 0xe2, 0x75, 0x21, 0xbd, 0x72, 0x3b, 0xff, 0xe8, - 0xf8, 0xfc, 0xe3, 0x82, 0x14, 0x6d, 0xb6, 0xce, 0xa8, 0x4d, 0x79, 0xde, - 0xf4, 0xe1, 0xf8, 0xfd, 0xff, 0xdf, 0xfd, 0x9b, 0xe4, 0x7d, 0x76, 0x47, - 0x4e, 0xa6, 0x83, 0x7e, 0x95, 0x0e, 0x53, 0xb7, 0xca, 0x32, 0x50, 0xc2, - 0x7b, 0x21, 0x6c, 0xc8, 0xd2, 0x37, 0x57, 0x49, 0x4b, 0xed, 0x68, 0xb3, - 0x42, 0xeb, 0x86, 0xeb, 0x8c, 0x0f, 0xb1, 0x85, 0x3d, 0x3f, 0x50, 0x06, - 0x43, 0x1e, 0x4e, 0xa1, 0x2f, 0xe8, 0xf0, 0x7e, 0x9e, 0xde, 0x5e, 0x98, - 0x75, 0xe1, 0x64, 0x1d, 0x5f, 0x0d, 0xb2, 0x0e, 0x5f, 0xcd, 0xbf, 0x38, - 0xfb, 0x9d, 0x7f, 0xfe, 0xd7, 0x38, 0x93, 0x6b, 0x91, 0xe4, 0x62, 0x04, - 0xea, 0x5a, 0x29, 0x44, 0x89, 0xb2, 0xeb, 0xe5, 0xfa, 0x34, 0x75, 0xf7, - 0x10, 0x55, 0x3a, 0xff, 0x7a, 0x3f, 0x67, 0x53, 0x87, 0x5f, 0xd8, 0xce, - 0xc6, 0xf2, 0x3a, 0xfe, 0x5e, 0x91, 0x5f, 0x36, 0x75, 0xfa, 0x37, 0xec, - 0x48, 0xea, 0xe2, 0x35, 0xc4, 0x87, 0xc6, 0x7f, 0x4b, 0x76, 0x0b, 0xef, - 0xfb, 0x37, 0x1c, 0xf7, 0xb2, 0x73, 0xae, 0xdf, 0xc7, 0x5f, 0xb0, 0x67, - 0x4e, 0x1d, 0x7e, 0xf3, 0x8f, 0xf8, 0x75, 0xfe, 0xd6, 0x2d, 0x3d, 0xd7, - 0x3a, 0xd1, 0x88, 0x94, 0xe0, 0xb8, 0x93, 0x78, 0x9a, 0xf7, 0xc5, 0xa1, - 0xd7, 0x0a, 0xce, 0xa9, 0x1b, 0x2d, 0x0e, 0xde, 0xd8, 0xe4, 0x1d, 0x7f, - 0xb8, 0x93, 0x0e, 0x6d, 0x73, 0xae, 0xdf, 0x5f, 0x0f, 0xca, 0x08, 0x78, - 0x3d, 0x7f, 0xc3, 0x0f, 0x3f, 0x63, 0x80, 0x3a, 0xff, 0x27, 0x07, 0xde, - 0xc9, 0xce, 0xb9, 0xf6, 0x9d, 0x7f, 0x48, 0x52, 0x5d, 0xc3, 0xaf, 0xd3, - 0xa7, 0x22, 0x47, 0x52, 0xa8, 0x9b, 0x98, 0xcb, 0x82, 0xe2, 0x57, 0x7e, - 0xff, 0xdb, 0x39, 0xe3, 0xaf, 0x05, 0x15, 0x3a, 0xa0, 0xf1, 0xf0, 0xae, - 0xf7, 0x01, 0xf4, 0xeb, 0xff, 0x93, 0xd1, 0xed, 0x75, 0xd3, 0xbf, 0x9d, - 0x50, 0x7c, 0x2e, 0x3d, 0x7c, 0x23, 0xfc, 0x8e, 0xbf, 0xf7, 0x63, 0x80, - 0x1c, 0x6d, 0xc0, 0x75, 0xec, 0xc9, 0x8e, 0xb6, 0x74, 0xf6, 0x00, 0x7b, - 0x7a, 0x37, 0x6c, 0xeb, 0xf7, 0x3f, 0x5b, 0x89, 0xd5, 0xe3, 0xc4, 0xfc, - 0x76, 0xf9, 0x71, 0x93, 0x9d, 0x7e, 0xcd, 0xa3, 0x1b, 0x9d, 0x48, 0x79, - 0x3a, 0x21, 0xbe, 0x81, 0xf3, 0x0e, 0xa0, 0xab, 0x89, 0xc8, 0x69, 0x72, - 0x10, 0xbd, 0x84, 0x0b, 0x90, 0x0b, 0xce, 0x9a, 0xfc, 0xd9, 0xb2, 0x43, - 0x7f, 0x81, 0xf7, 0x04, 0x3d, 0x83, 0xaa, 0x11, 0x84, 0xf0, 0x8f, 0xbf, - 0xb5, 0x8b, 0x4e, 0xc1, 0xd7, 0xb7, 0x96, 0x8e, 0xad, 0xcf, 0x23, 0x85, - 0x77, 0xb4, 0x06, 0xce, 0xa8, 0x3c, 0x0c, 0x23, 0xbe, 0xfd, 0xf9, 0x23, - 0xaf, 0xa3, 0xf6, 0x9e, 0x8a, 0xbf, 0x49, 0x46, 0xdb, 0x6c, 0xea, 0x13, - 0xd2, 0xfc, 0x9a, 0xf9, 0xfc, 0xbf, 0x1d, 0x41, 0x45, 0xbe, 0x3a, 0x00, - 0x8a, 0xff, 0x7d, 0x11, 0x76, 0xdf, 0xa7, 0x54, 0x32, 0x65, 0x70, 0xc1, - 0x21, 0xf1, 0xc4, 0xe5, 0xc3, 0x31, 0xe1, 0xc8, 0x09, 0xc8, 0x81, 0x85, - 0x77, 0xf0, 0xd7, 0x6c, 0xbe, 0xf3, 0x54, 0xd4, 0xda, 0x07, 0x5e, 0x90, - 0xb9, 0xd6, 0xdd, 0xaa, 0x3c, 0x58, 0x2b, 0xbf, 0x6c, 0x44, 0xb9, 0x07, - 0x5e, 0xf3, 0x80, 0xeb, 0xfa, 0x39, 0x3c, 0x72, 0x73, 0xaf, 0xfd, 0x03, - 0xee, 0xfe, 0xf2, 0x94, 0x1d, 0x7e, 0xfc, 0x18, 0x2c, 0x3a, 0xf7, 0x22, - 0x63, 0xaf, 0x90, 0x5e, 0x63, 0xaf, 0xfc, 0x30, 0xaf, 0x5f, 0xdf, 0x70, - 0x07, 0x5f, 0x26, 0xb9, 0x87, 0x59, 0xac, 0xeb, 0xfb, 0x3e, 0xc4, 0xc9, - 0xa3, 0xa8, 0x4f, 0x07, 0xc2, 0x75, 0x09, 0xe9, 0xce, 0x53, 0x21, 0xb0, - 0x97, 0x70, 0xf5, 0x64, 0xfd, 0x1c, 0x12, 0x0f, 0x1f, 0xed, 0x61, 0xbf, - 0xe8, 0x4e, 0xc2, 0xe7, 0xc6, 0xce, 0xbf, 0x75, 0x27, 0x71, 0x3a, 0xfd, - 0xfa, 0xae, 0x20, 0x3a, 0xa0, 0xf3, 0xba, 0x4d, 0x7f, 0xd3, 0x8e, 0x4b, - 0xb8, 0x0d, 0x1d, 0x7f, 0xec, 0x1d, 0xe5, 0xae, 0x7f, 0x00, 0x3a, 0xfd, - 0x9e, 0xd6, 0x2a, 0x75, 0x21, 0xf3, 0x2c, 0xfe, 0xfe, 0x1f, 0x7c, 0xee, - 0x6c, 0x1d, 0x78, 0x31, 0xb4, 0xeb, 0xff, 0xc2, 0x30, 0xd8, 0x46, 0x37, - 0x92, 0x09, 0xd7, 0xe5, 0xe7, 0x5f, 0x60, 0xea, 0xc3, 0xf0, 0x44, 0x7b, - 0xff, 0xcf, 0xf2, 0x69, 0x47, 0x27, 0xf8, 0xde, 0x74, 0xea, 0x84, 0xcb, - 0x82, 0x63, 0xd8, 0x46, 0x89, 0x05, 0xff, 0x2f, 0xb9, 0xec, 0xff, 0x93, - 0x9d, 0x7f, 0xfc, 0xab, 0xfb, 0x48, 0x33, 0x43, 0x39, 0x9b, 0x9d, 0x7f, - 0xd1, 0xec, 0xe3, 0x1d, 0xd8, 0x68, 0xbe, 0x2f, 0xd9, 0xc8, 0xde, 0x47, - 0x5e, 0xec, 0x2d, 0x87, 0xd5, 0xe4, 0x3b, 0xff, 0xf0, 0xb3, 0xe7, 0x61, - 0x38, 0x8b, 0x4d, 0x98, 0x59, 0xd7, 0x9f, 0x93, 0x9a, 0x2f, 0xfa, 0x84, - 0x59, 0xe1, 0x9b, 0x15, 0xef, 0xfc, 0x07, 0xf6, 0x90, 0x77, 0x92, 0xce, - 0xbf, 0xff, 0xdd, 0x7d, 0x24, 0x6b, 0xe7, 0xbb, 0x8b, 0xc6, 0x3f, 0x0e, - 0xba, 0x36, 0x0e, 0xbe, 0xd6, 0x9d, 0x67, 0x57, 0x51, 0x32, 0x06, 0x0f, - 0x0c, 0x5f, 0x6f, 0x2f, 0x39, 0xd7, 0xff, 0xc1, 0x67, 0x50, 0x73, 0x6b, - 0xcb, 0x48, 0x13, 0xad, 0x2c, 0x3f, 0x17, 0x22, 0xbf, 0xe8, 0x5f, 0xc0, - 0xe6, 0x03, 0x47, 0x5f, 0xf2, 0x60, 0x85, 0x54, 0xce, 0x1d, 0x48, 0x7d, - 0xfb, 0x07, 0x37, 0xbd, 0x9b, 0x9d, 0x7f, 0x3f, 0x37, 0x96, 0x78, 0xeb, - 0xff, 0x7b, 0x49, 0xcf, 0x0f, 0xef, 0x23, 0xaf, 0xff, 0x2e, 0x36, 0x73, - 0xf1, 0xcc, 0xdb, 0x1b, 0x9d, 0x7f, 0xe8, 0xce, 0x67, 0x00, 0xb4, 0xd1, - 0xd7, 0x9f, 0x7d, 0x83, 0xaf, 0xe7, 0xf6, 0xa3, 0x27, 0x3a, 0xa1, 0x33, - 0xfc, 0x2d, 0x43, 0xe1, 0x4d, 0xda, 0x78, 0xd8, 0xfd, 0xff, 0x7f, 0x0b, - 0xd6, 0x2e, 0x1a, 0xce, 0xbf, 0xf7, 0x27, 0xc0, 0xe7, 0x7b, 0x8d, 0x67, - 0x5f, 0xfb, 0x07, 0xda, 0xfb, 0xb6, 0x33, 0x73, 0xab, 0x11, 0x05, 0xa4, - 0x1b, 0xff, 0xe9, 0x47, 0x27, 0xf2, 0x2b, 0xad, 0x38, 0xc8, 0xeb, 0xfa, - 0x7d, 0x62, 0xe1, 0xac, 0xeb, 0x37, 0x32, 0x20, 0x3e, 0xa8, 0x5e, 0x4e, - 0xa1, 0xd7, 0xd2, 0xe0, 0x64, 0x75, 0xf2, 0xfc, 0x93, 0x9d, 0x58, 0x78, - 0x88, 0x45, 0x7f, 0xf6, 0xdf, 0x2b, 0x03, 0x2c, 0xea, 0x2c, 0xeb, 0xa7, - 0xf1, 0xd7, 0xfb, 0x6f, 0x5e, 0x51, 0x82, 0x75, 0x41, 0xe4, 0xe0, 0xbd, - 0xff, 0xfa, 0x5d, 0x8e, 0x3f, 0xbf, 0xf2, 0x7b, 0x5d, 0x43, 0xaf, 0xec, - 0x6f, 0xef, 0x5f, 0xc7, 0x5f, 0xd2, 0x5f, 0x87, 0xf9, 0x8e, 0xbf, 0xfe, - 0xfb, 0x28, 0xda, 0x82, 0x0e, 0x24, 0x2f, 0x0a, 0xae, 0x1f, 0xff, 0x8b, - 0xef, 0xbb, 0xf7, 0x7f, 0x1d, 0x7e, 0xc5, 0xe2, 0x6d, 0x3a, 0xf4, 0xf3, - 0x35, 0x9d, 0x50, 0x9c, 0x94, 0xea, 0xb9, 0x0a, 0xe6, 0x11, 0x21, 0x2f, - 0xe4, 0xf7, 0x7b, 0x0e, 0xbf, 0x71, 0x27, 0x75, 0x9a, 0x61, 0x3b, 0xef, - 0x7f, 0x0e, 0x69, 0x84, 0xee, 0x04, 0x1a, 0x81, 0x3b, 0xfc, 0x2e, 0xaf, - 0xa3, 0x80, 0x35, 0x02, 0x77, 0xfb, 0x59, 0xd4, 0xd7, 0xf3, 0x9a, 0x61, - 0x3b, 0xb0, 0x26, 0x98, 0x4e, 0xe6, 0xdb, 0x3c, 0xc2, 0x75, 0x89, 0xa5, - 0xee, 0x68, 0x85, 0xcb, 0x22, 0xd1, 0xfe, 0xd4, 0x16, 0xc8, 0xad, 0xe2, - 0xcc, 0x26, 0x50, 0xf9, 0xec, 0x9b, 0xa7, 0xee, 0xdc, 0x78, 0xf5, 0x0b, - 0xad, 0xe8, 0x5b, 0xd5, 0xe7, 0x20, 0x18, 0x47, 0x6a, 0x3b, 0x2f, 0x4a, - 0x53, 0xbf, 0xff, 0x75, 0xe5, 0xd8, 0x84, 0xf6, 0x90, 0x77, 0x91, 0xd7, - 0x84, 0x0b, 0x3a, 0xff, 0xa3, 0xff, 0x0a, 0x6d, 0xfa, 0xb3, 0xae, 0xcd, - 0x61, 0xeb, 0xf0, 0x6e, 0x9d, 0x1a, 0xc3, 0x0a, 0xab, 0xec, 0x4e, 0x2a, - 0x75, 0xe0, 0x82, 0x63, 0xaa, 0x1b, 0x06, 0x39, 0xe1, 0x3c, 0x18, 0xd3, - 0xf1, 0x05, 0x53, 0xa6, 0x46, 0xdb, 0xb9, 0x72, 0x43, 0x5e, 0x68, 0x50, - 0xf2, 0x12, 0xab, 0x24, 0xec, 0x6b, 0x62, 0xaf, 0xa8, 0x5e, 0xfa, 0x78, - 0x47, 0x6c, 0x69, 0x7b, 0x24, 0xdf, 0x48, 0x6f, 0xc1, 0xce, 0x22, 0xa7, - 0x5f, 0xdd, 0x8f, 0xa3, 0xb8, 0x0e, 0xbc, 0xd5, 0xe6, 0xc1, 0xd7, 0xb3, - 0x1b, 0x3a, 0xe4, 0x54, 0xea, 0x9c, 0xd8, 0xa0, 0xdd, 0xfb, 0xd9, 0x32, - 0x2c, 0xeb, 0xf4, 0x6e, 0x00, 0x41, 0xd5, 0x07, 0x9c, 0x24, 0xf7, 0xe8, - 0xdb, 0x03, 0xe3, 0xaf, 0xc9, 0xb7, 0xc9, 0x39, 0xd7, 0xe7, 0x97, 0xb1, - 0x87, 0x5f, 0x87, 0x3e, 0xe4, 0xc7, 0x5f, 0xff, 0x0b, 0x11, 0x61, 0xfd, - 0xf9, 0x2c, 0xdf, 0xc7, 0x5f, 0xf9, 0xc4, 0x1b, 0xfb, 0x91, 0x8d, 0x9d, - 0x7f, 0xed, 0x75, 0x3e, 0x6f, 0x28, 0xc9, 0xce, 0xb6, 0x35, 0x9f, 0xf8, - 0x0f, 0xaf, 0xfb, 0xae, 0xbe, 0xa4, 0x6f, 0x23, 0xaf, 0xef, 0xa3, 0x2d, - 0x97, 0x9c, 0xea, 0x84, 0xd8, 0xe5, 0x0c, 0xf4, 0x2a, 0x01, 0xc5, 0x4e, - 0xa9, 0x88, 0x24, 0x0c, 0x27, 0xe1, 0x48, 0x93, 0x7a, 0x38, 0xbb, 0xff, - 0x63, 0xf6, 0x64, 0x1e, 0xe6, 0xe7, 0x5f, 0xc0, 0x9a, 0x51, 0xed, 0x1d, - 0x7f, 0xff, 0xfe, 0xce, 0xe0, 0x83, 0x07, 0xdd, 0xce, 0xc6, 0x4c, 0x9c, - 0x9b, 0xa9, 0xbf, 0x8e, 0xbe, 0x18, 0xc6, 0xce, 0xbe, 0x8d, 0xf4, 0xe7, - 0x54, 0x36, 0xfa, 0xd3, 0xc2, 0x34, 0x30, 0x86, 0xca, 0xc2, 0x11, 0x23, - 0x38, 0x6b, 0x27, 0x98, 0xbf, 0x8a, 0x8f, 0x2b, 0x44, 0x57, 0xfc, 0x7b, - 0xf9, 0x76, 0xd8, 0x40, 0xfd, 0x20, 0xbf, 0xfe, 0x41, 0xc5, 0xc7, 0xd1, - 0xfe, 0x43, 0x8b, 0x3a, 0xff, 0x82, 0x98, 0x3f, 0xcb, 0x34, 0x75, 0xbf, - 0x3a, 0xfe, 0x67, 0xee, 0x15, 0xc1, 0xd7, 0xfd, 0xd4, 0x97, 0x5e, 0x48, - 0xb3, 0xaf, 0xfd, 0xa4, 0x1d, 0xe5, 0xe4, 0xd2, 0x1d, 0x58, 0x7e, 0x9e, - 0x37, 0xbf, 0x69, 0x70, 0x18, 0x3a, 0xa4, 0x9b, 0xf6, 0x27, 0x4c, 0x6f, - 0xc1, 0x15, 0xc2, 0x87, 0xc4, 0x37, 0xc3, 0x1c, 0x91, 0xd7, 0xfd, 0xd8, - 0x92, 0x08, 0xff, 0xb9, 0xd7, 0xfd, 0x12, 0x4f, 0x4a, 0x04, 0x07, 0x5f, - 0xf4, 0x67, 0xbe, 0x80, 0x11, 0xb9, 0xd6, 0xe4, 0x23, 0x23, 0x08, 0x38, - 0x70, 0xb3, 0x6b, 0xf8, 0x61, 0x9c, 0x89, 0x1d, 0x7f, 0xfd, 0xd7, 0x4f, - 0x4b, 0xf1, 0xf6, 0xba, 0xf2, 0x3b, 0xe9, 0xab, 0xbf, 0xf6, 0xbe, 0xf9, - 0x07, 0xf9, 0x66, 0x8e, 0xb8, 0x3a, 0x3a, 0x9a, 0xd1, 0x6f, 0xd6, 0x11, - 0x40, 0xbf, 0xff, 0xb3, 0x7c, 0xd3, 0x8f, 0x52, 0x3d, 0xdf, 0xdd, 0x67, - 0x54, 0x27, 0x5c, 0xf1, 0x91, 0x89, 0x95, 0xfb, 0xf5, 0xa7, 0x60, 0xeb, - 0xf6, 0x71, 0x91, 0x87, 0x50, 0x9e, 0x67, 0xd2, 0x7b, 0xff, 0xf3, 0x8f, - 0x9d, 0xfa, 0x31, 0xed, 0x37, 0x9d, 0x3a, 0xff, 0xa3, 0xdd, 0xc5, 0xe7, - 0x30, 0xeb, 0xf7, 0xba, 0x91, 0xa3, 0xaf, 0x4e, 0xe3, 0xc3, 0xdc, 0xd1, - 0xb5, 0xff, 0x40, 0x34, 0x1f, 0xdf, 0x92, 0x3a, 0xf7, 0x35, 0xa3, 0xc4, - 0x07, 0x7c, 0xc7, 0x76, 0x1a, 0x20, 0x35, 0x0d, 0x4d, 0xfd, 0xc8, 0xec, - 0x7c, 0xc9, 0x22, 0x83, 0x8c, 0x54, 0xe9, 0x8c, 0xfd, 0x86, 0x9d, 0x01, - 0x3f, 0x1f, 0x47, 0x8f, 0x7b, 0x6c, 0x74, 0xea, 0xc5, 0x4b, 0x69, 0x28, - 0x53, 0xe9, 0x55, 0xee, 0xbb, 0x59, 0xd7, 0xd0, 0x0d, 0x9c, 0x3a, 0x80, - 0x78, 0x3e, 0x1e, 0xbe, 0x1f, 0x03, 0xf3, 0xaf, 0xcb, 0x6a, 0x9a, 0xa6, - 0xa9, 0xa8, 0x3a, 0xff, 0xfe, 0x96, 0x69, 0x39, 0xc4, 0x5f, 0xdf, 0x77, - 0x1b, 0xf1, 0xd5, 0x88, 0xbb, 0x42, 0x27, 0x3c, 0xbf, 0xfc, 0xde, 0x0f, - 0xb0, 0x65, 0x9a, 0xfa, 0xb3, 0xaf, 0xff, 0x4b, 0x37, 0x97, 0xd8, 0x02, - 0x8d, 0xb6, 0xd9, 0x57, 0xe5, 0xb7, 0x89, 0xb4, 0xeb, 0xd2, 0xc1, 0x98, - 0xfe, 0xbe, 0xa8, 0xd4, 0x23, 0xe5, 0xe1, 0x89, 0x50, 0xa8, 0xa7, 0xb0, - 0xdd, 0x18, 0xc9, 0xaf, 0xf9, 0x06, 0x5a, 0x6a, 0x4d, 0x43, 0x54, 0xd4, - 0x1d, 0x7d, 0x36, 0xb2, 0x63, 0xaf, 0xc0, 0x8f, 0x63, 0x59, 0xd7, 0xfa, - 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x09, 0xbf, 0xe8, 0xf6, 0x71, 0x8e, 0xec, - 0x34, 0x5f, 0x37, 0xe7, 0x0f, 0x61, 0x53, 0xaf, 0x0e, 0x68, 0x28, 0xa7, - 0x61, 0xea, 0xd0, 0xe8, 0x53, 0x10, 0xdb, 0x0d, 0x0b, 0xff, 0xa3, 0xa8, - 0xae, 0x72, 0x75, 0xff, 0xb9, 0xd7, 0xfc, 0x1e, 0x62, 0xf2, 0x4e, 0x13, - 0xab, 0x13, 0xdb, 0x48, 0xcc, 0xfa, 0x54, 0xe8, 0xf7, 0xfb, 0xfe, 0xec, - 0xf5, 0x19, 0xd3, 0xaf, 0xfd, 0x3b, 0xef, 0xb3, 0x9e, 0x17, 0xda, 0x75, - 0xff, 0xf6, 0x7a, 0x07, 0xda, 0xcc, 0x55, 0x57, 0x91, 0xd7, 0xfe, 0xc0, - 0xc4, 0xa3, 0xb8, 0x07, 0x3a, 0xfe, 0x79, 0x7f, 0x27, 0x09, 0xd7, 0xf7, - 0x52, 0x7d, 0x69, 0xce, 0xbc, 0xdb, 0x6d, 0x95, 0x7e, 0xee, 0x31, 0xf8, - 0x52, 0x85, 0xfd, 0xff, 0xfe, 0x9b, 0x91, 0xb7, 0xe2, 0xaf, 0xf3, 0xec, - 0xda, 0xf9, 0x9b, 0xf8, 0xea, 0x84, 0x78, 0xf9, 0x33, 0xe9, 0xb5, 0xff, - 0xe4, 0xe2, 0x7b, 0xfc, 0xf3, 0xaf, 0x04, 0xea, 0x9d, 0x53, 0x13, 0x10, - 0xd6, 0x9c, 0x03, 0xb1, 0x8c, 0x7b, 0xc6, 0x37, 0xfe, 0x5c, 0x6f, 0xa1, - 0xc9, 0xfe, 0xc8, 0xeb, 0xff, 0xfc, 0x9d, 0x71, 0xde, 0x5f, 0x65, 0x03, - 0x27, 0x5e, 0x04, 0xeb, 0xff, 0xd9, 0x9d, 0x0f, 0x63, 0x59, 0xd4, 0x01, - 0xd7, 0xf9, 0x5f, 0x93, 0x4a, 0x39, 0xa3, 0xaa, 0x74, 0xc7, 0xe4, 0x82, - 0x16, 0x04, 0x47, 0xbe, 0xf8, 0x9d, 0xfc, 0xeb, 0xf6, 0x4b, 0xb1, 0xc3, - 0xa9, 0x87, 0x94, 0xd6, 0x49, 0x7f, 0xbd, 0x09, 0xd5, 0x63, 0x73, 0xaf, - 0xfe, 0xf6, 0x9e, 0x5a, 0xc6, 0x42, 0xd0, 0xeb, 0xff, 0xdb, 0x8f, 0xc6, - 0x75, 0x00, 0x08, 0xe4, 0x8e, 0xa8, 0x47, 0x32, 0x12, 0xfe, 0x67, 0xf5, - 0x0a, 0xfe, 0x4d, 0x60, 0x7e, 0xe1, 0xd7, 0xed, 0x84, 0x1c, 0xda, 0x75, - 0xfe, 0xe6, 0x05, 0x3f, 0x67, 0x58, 0x7a, 0xee, 0x5b, 0x7f, 0xb4, 0x39, - 0xb7, 0xaf, 0x23, 0xaf, 0x6a, 0x5b, 0x4e, 0xa4, 0x3d, 0x16, 0xb3, 0x3b, - 0xff, 0xd1, 0x3f, 0xde, 0xc6, 0xfe, 0xc9, 0xc4, 0x27, 0x52, 0x26, 0x18, - 0xf0, 0x9b, 0x12, 0x4b, 0xfd, 0x18, 0x3e, 0x68, 0x36, 0xc3, 0xaf, 0xf7, - 0x73, 0x6f, 0xcd, 0x49, 0x87, 0x5b, 0xfd, 0x1f, 0x6f, 0x8d, 0xaf, 0xe1, - 0xf9, 0xf7, 0x9d, 0x73, 0xaf, 0xfd, 0xfb, 0xcb, 0xe4, 0x20, 0x71, 0x67, - 0x53, 0x9f, 0x78, 0x98, 0x5f, 0xb3, 0x8f, 0xbb, 0x67, 0x5f, 0xff, 0xe9, - 0xf1, 0xb1, 0xc0, 0xf1, 0x3f, 0x9c, 0x3d, 0x81, 0x9c, 0xea, 0x9d, 0x11, - 0x7a, 0x28, 0xbc, 0xdb, 0x6d, 0x95, 0x7f, 0xbe, 0x82, 0x07, 0x37, 0xf1, - 0x4a, 0x17, 0xf7, 0xff, 0xf3, 0x4f, 0xe3, 0x3a, 0x81, 0x0e, 0x37, 0xf3, - 0xda, 0xc9, 0xce, 0xae, 0xa2, 0xa7, 0xf4, 0x4a, 0x44, 0xc4, 0x1e, 0x1d, - 0x95, 0x3b, 0x32, 0xa6, 0x52, 0x8a, 0x02, 0x82, 0x92, 0xa6, 0x79, 0x1b, - 0xf2, 0xe3, 0x6e, 0xec, 0x74, 0x23, 0x0a, 0x0d, 0x42, 0x63, 0xd1, 0xdd, - 0xdf, 0xfb, 0x10, 0x67, 0x71, 0xf6, 0x2c, 0xeb, 0xff, 0xdc, 0x57, 0xef, - 0x93, 0x43, 0x9b, 0x50, 0x27, 0x5f, 0xf2, 0x36, 0x1e, 0xe7, 0xb6, 0x70, - 0xea, 0x84, 0x44, 0x75, 0x36, 0xf8, 0x5f, 0x7f, 0x1d, 0x7b, 0x04, 0x07, - 0x5f, 0x67, 0xa6, 0x91, 0xd7, 0xff, 0x6c, 0x0c, 0x6c, 0x69, 0xc7, 0xe8, - 0x34, 0x75, 0x74, 0xfb, 0x1c, 0x8a, 0xff, 0xd9, 0xe8, 0xe6, 0xbb, 0x03, - 0xe3, 0xc4, 0x11, 0x7f, 0x67, 0x18, 0xee, 0xc3, 0x44, 0x10, 0xa1, 0xe4, - 0xde, 0x80, 0xa1, 0xd5, 0x07, 0xc9, 0xa4, 0xab, 0xdb, 0x61, 0x67, 0x5f, - 0xcf, 0xde, 0x71, 0x1b, 0x3a, 0xfe, 0x6b, 0x0b, 0x6e, 0x32, 0x3a, 0xb0, - 0xfe, 0x84, 0x77, 0xf2, 0xdb, 0xff, 0xf4, 0x06, 0x69, 0x20, 0xfa, 0x01, - 0x30, 0xa4, 0xc7, 0x54, 0xea, 0xa4, 0xd5, 0x21, 0xec, 0x21, 0x81, 0x0c, - 0xe1, 0x84, 0xde, 0xd2, 0xeb, 0xfb, 0xb9, 0xef, 0x22, 0xce, 0xbf, 0xbd, - 0xf7, 0x3a, 0xfb, 0x9d, 0x5b, 0x9e, 0xd8, 0x96, 0x5f, 0xd9, 0xbf, 0xb9, - 0xc8, 0x3a, 0xff, 0xed, 0x0b, 0xf9, 0xd7, 0xf6, 0x27, 0xc3, 0xa8, 0x27, - 0xe3, 0xa2, 0xda, 0x84, 0x5a, 0xff, 0x09, 0x3b, 0xfb, 0x19, 0xf7, 0x6f, - 0x70, 0xeb, 0xa1, 0x53, 0xae, 0x41, 0x3a, 0xcd, 0x9d, 0x41, 0x34, 0xbf, - 0x45, 0x2f, 0x0f, 0xf3, 0x9d, 0x7e, 0xeb, 0xcb, 0x04, 0xeb, 0xf9, 0x3c, - 0x39, 0xd4, 0x3a, 0xec, 0xef, 0xc3, 0xcf, 0x82, 0x5b, 0x9d, 0xbf, 0x88, - 0xf8, 0xc3, 0xbe, 0x91, 0xf9, 0xb2, 0xa4, 0x9c, 0xd6, 0x14, 0x0c, 0x65, - 0x17, 0xf6, 0x90, 0x21, 0xc1, 0x3a, 0xff, 0xfe, 0xf7, 0x73, 0x5a, 0xcc, - 0xff, 0x93, 0xe7, 0xe3, 0xe3, 0xaf, 0xfb, 0xb1, 0xcf, 0x0c, 0x66, 0xe7, - 0x5f, 0xff, 0xf2, 0x4f, 0x12, 0xd7, 0x38, 0x9b, 0xcd, 0x27, 0xe2, 0xf3, - 0x73, 0xaf, 0xf4, 0x3c, 0xef, 0xc7, 0xfa, 0x75, 0xee, 0xe0, 0x85, 0x1a, - 0x7d, 0x37, 0xf3, 0x4d, 0x62, 0x73, 0x48, 0x57, 0xe8, 0xcb, 0xef, 0xfc, - 0xce, 0xc6, 0x72, 0x5a, 0xfd, 0x67, 0x5c, 0x9a, 0x3a, 0xff, 0xb2, 0x77, - 0xf0, 0x3e, 0x8c, 0x8e, 0xbf, 0x9f, 0xdf, 0x22, 0x4a, 0x9d, 0x7f, 0x7d, - 0x5e, 0x9b, 0x7d, 0xce, 0xa8, 0x4c, 0x8f, 0x0d, 0x55, 0x3f, 0xe0, 0xab, - 0x9d, 0x78, 0xbe, 0xf7, 0x33, 0xa7, 0x5e, 0xd2, 0x2c, 0xeb, 0x47, 0x0d, - 0xb7, 0x86, 0xef, 0xfe, 0xea, 0x40, 0xfc, 0x71, 0x92, 0x2c, 0xeb, 0xe4, - 0x99, 0x1b, 0x3a, 0xff, 0xe5, 0xbe, 0xff, 0x7c, 0x9c, 0x8f, 0xda, 0x67, - 0x5f, 0xff, 0xbf, 0x9c, 0x63, 0x3a, 0xa4, 0x7b, 0x3b, 0xff, 0x0e, 0xbe, - 0xf6, 0xbe, 0xeb, 0xe2, 0x60, 0xc1, 0x42, 0xc2, 0x2f, 0xa9, 0x77, 0xed, - 0x2f, 0x3d, 0xa3, 0xaf, 0xfe, 0x45, 0x73, 0xc9, 0xdc, 0xf4, 0x70, 0xeb, - 0xf3, 0xc8, 0x52, 0x0e, 0xbf, 0xa1, 0xc7, 0xd8, 0x27, 0x54, 0x95, 0x1e, - 0xe4, 0x65, 0x88, 0xb7, 0xc2, 0x75, 0xa1, 0x09, 0x25, 0xfc, 0xce, 0xa6, - 0xca, 0x2a, 0x75, 0xff, 0xe4, 0x04, 0x69, 0x70, 0x9c, 0xe2, 0x36, 0x75, - 0xf3, 0x5f, 0x72, 0x73, 0xaf, 0xf4, 0x07, 0x3c, 0x9d, 0xfc, 0xeb, 0x2e, - 0x0f, 0x5c, 0x24, 0xb7, 0xfe, 0xf7, 0xd0, 0x47, 0xd8, 0x04, 0x00, 0xeb, - 0xff, 0xff, 0x2d, 0xc4, 0x12, 0x4d, 0x7e, 0xbe, 0xa4, 0x7b, 0xbf, 0xba, - 0xce, 0xbf, 0xfe, 0x1f, 0xfd, 0x24, 0x07, 0x5d, 0x3c, 0xeb, 0x3a, 0xef, - 0x8d, 0x67, 0x5f, 0xff, 0x9d, 0x3c, 0x81, 0xc0, 0xe7, 0x91, 0x69, 0xc3, - 0xaf, 0xff, 0x43, 0x03, 0x9f, 0x7c, 0x9c, 0x8f, 0xda, 0x67, 0x5e, 0xe3, - 0xeb, 0x13, 0x09, 0xe2, 0x77, 0x46, 0xc5, 0x46, 0xde, 0x74, 0xf0, 0xbf, - 0x8d, 0xd6, 0xb7, 0x54, 0x66, 0x92, 0x80, 0xee, 0x94, 0x1d, 0x7f, 0xfa, - 0x70, 0xf6, 0x3b, 0x9b, 0x83, 0x3d, 0xa3, 0xa9, 0xcf, 0x83, 0xf1, 0x5a, - 0x0a, 0xbd, 0x7c, 0x30, 0x48, 0x4f, 0xbc, 0xa5, 0xa1, 0x84, 0x65, 0xfd, - 0xc8, 0x9d, 0x07, 0xc7, 0x5e, 0x0f, 0xd5, 0x9d, 0x7e, 0x18, 0x0e, 0x4c, - 0x75, 0xf6, 0xbf, 0xe2, 0xa7, 0x5f, 0xa3, 0xbe, 0x89, 0x1d, 0x7c, 0x1f, - 0xfd, 0xa8, 0x3f, 0x0d, 0xc9, 0x80, 0x49, 0x7e, 0x06, 0x2e, 0x3a, 0x75, - 0xff, 0xff, 0xec, 0x9f, 0x50, 0xab, 0xeb, 0xd2, 0xc5, 0x55, 0xcd, 0xfd, - 0xc8, 0xcd, 0xce, 0xbf, 0x47, 0xce, 0x0c, 0x8e, 0xad, 0x22, 0x8f, 0xf7, - 0xbb, 0xcd, 0x3e, 0xe1, 0xd4, 0x15, 0x41, 0xd8, 0x58, 0x90, 0x8e, 0x14, - 0x8f, 0x43, 0x27, 0xf2, 0x4b, 0xdc, 0xfb, 0xa3, 0xac, 0xd1, 0xce, 0xbf, - 0x7b, 0xde, 0xc6, 0xce, 0xa8, 0x37, 0xc8, 0x2d, 0x7f, 0xe7, 0x16, 0x67, - 0x18, 0xee, 0xc3, 0x44, 0x23, 0x74, 0xa7, 0x3a, 0xa1, 0x1b, 0x40, 0x5c, - 0xfc, 0x7f, 0x6a, 0x45, 0xfb, 0x27, 0xd0, 0x1c, 0xeb, 0xff, 0xff, 0xdd, - 0xcf, 0xf8, 0xaf, 0x53, 0x78, 0xf7, 0xfd, 0x1c, 0xdf, 0xdf, 0xbe, 0x8e, - 0xbf, 0xfb, 0x37, 0xfb, 0xe4, 0x1f, 0xe5, 0x9a, 0x3a, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfd, 0x83, 0x38, 0xb8, 0x60, 0x67, 0x8e, 0x07, 0x07, 0x3d, - 0xa4, 0x66, 0x0f, 0xd9, 0xf3, 0x91, 0xa1, 0x75, 0x75, 0x88, 0x00, 0x7e, - 0x01, 0x70, 0xc0, 0xcf, 0x1c, 0x3a, 0xa1, 0x34, 0xec, 0x46, 0xbf, 0xfb, - 0xce, 0x33, 0xef, 0x21, 0x8c, 0xd1, 0xd7, 0xff, 0xe8, 0x04, 0xd2, 0x89, - 0xc5, 0xd5, 0xd0, 0xc4, 0x8e, 0xbf, 0xf7, 0xdc, 0xeb, 0xad, 0x46, 0xdb, - 0x6c, 0xeb, 0xff, 0xf6, 0x33, 0xb0, 0x21, 0x14, 0x9f, 0x05, 0x15, 0x3a, - 0xcf, 0x3a, 0x25, 0xa4, 0x89, 0x52, 0x4c, 0x51, 0xe1, 0xd7, 0x7f, 0xff, - 0x4c, 0x30, 0x0d, 0x33, 0xa9, 0xc9, 0x86, 0x01, 0xa3, 0xaf, 0xfe, 0xf7, - 0x53, 0x6f, 0x5e, 0x5c, 0x85, 0x4e, 0xbf, 0xbf, 0xf2, 0x7e, 0x2a, 0x9d, - 0x7f, 0x63, 0x78, 0x3f, 0x80, 0xeb, 0xf4, 0xb3, 0xd0, 0x03, 0xae, 0x85, - 0xce, 0x7a, 0x7b, 0x96, 0xdf, 0xff, 0xfc, 0x05, 0xbc, 0xba, 0xe9, 0xe4, - 0x0e, 0x07, 0x3c, 0x8b, 0x4e, 0x1d, 0x5a, 0x44, 0xef, 0xe5, 0xf7, 0xff, - 0xe1, 0xcd, 0x67, 0x5f, 0x61, 0x9d, 0x45, 0xc3, 0x0e, 0xbf, 0x4e, 0xb8, - 0x0c, 0x1d, 0x52, 0x5d, 0xcb, 0x0c, 0x79, 0x5b, 0x91, 0x4d, 0x1a, 0xbf, - 0x0a, 0x3a, 0xb7, 0xa4, 0x6f, 0x46, 0x3f, 0xb4, 0x93, 0xea, 0xad, 0xfe, - 0x8d, 0x6a, 0x27, 0xc6, 0xce, 0xbf, 0xdd, 0xc5, 0xe7, 0x7f, 0x13, 0xa8, - 0x27, 0xcb, 0xe3, 0x3b, 0xec, 0xe2, 0xa8, 0x75, 0x42, 0xfa, 0x06, 0x4e, - 0xf9, 0x3c, 0x61, 0x7f, 0x91, 0x5e, 0x6d, 0xb6, 0xca, 0xbf, 0xec, 0x03, - 0xf3, 0x36, 0xe0, 0x4a, 0x50, 0xbf, 0xb9, 0xb6, 0xca, 0xbc, 0xdb, 0x6d, - 0x95, 0x7f, 0x3c, 0xe1, 0xec, 0x68, 0xa5, 0x0b, 0xfa, 0x14, 0x5e, 0x36, - 0x91, 0xb2, 0x6f, 0x7e, 0x62, 0x07, 0xea, 0xca, 0x50, 0xd9, 0xde, 0x6d, - 0xb6, 0xca, 0xbd, 0xa8, 0xe1, 0x4a, 0x17, 0xf7, 0xce, 0x3b, 0xf8, 0xeb, - 0x01, 0x11, 0x4b, 0xe5, 0x96, 0xca, 0xef, 0xe0, 0x8c, 0x49, 0xd8, 0x75, - 0xfb, 0x5f, 0xcf, 0xb2, 0x27, 0x5f, 0x82, 0x9b, 0x60, 0x27, 0x5f, 0x60, - 0xe3, 0x59, 0xd5, 0xc3, 0xca, 0x59, 0x45, 0x22, 0x26, 0x3e, 0xbb, 0x5f, - 0xfd, 0xd7, 0x90, 0xba, 0xb3, 0x0a, 0x4c, 0x75, 0xff, 0xd9, 0xc9, 0xe3, - 0x7d, 0x20, 0xe0, 0x0e, 0xbf, 0xbb, 0x9b, 0x73, 0xda, 0x3a, 0x98, 0x8b, - 0x50, 0x22, 0x79, 0x0e, 0xb8, 0x9e, 0x67, 0x61, 0x86, 0x30, 0xd9, 0xba, - 0x7f, 0x1d, 0x50, 0xa9, 0x4f, 0x25, 0x01, 0x09, 0xd5, 0xed, 0xda, 0x93, - 0x50, 0x75, 0xf9, 0x91, 0xd8, 0x59, 0xd7, 0x3f, 0x8e, 0xbf, 0x63, 0x5b, - 0x88, 0x30, 0xdd, 0x89, 0x35, 0xfc, 0x1c, 0xe6, 0xca, 0xc2, 0x75, 0xee, - 0xa4, 0xc5, 0x57, 0x0f, 0x33, 0x46, 0x17, 0xfc, 0xfb, 0xfb, 0x26, 0xff, - 0x8a, 0x9d, 0x66, 0x21, 0xef, 0x7e, 0x45, 0x7f, 0x87, 0x37, 0x96, 0x91, - 0x53, 0xaf, 0x9d, 0xf8, 0xa9, 0xd5, 0xf0, 0xf5, 0x27, 0x33, 0xbf, 0xec, - 0xc6, 0x02, 0x33, 0x79, 0x1d, 0x7d, 0x0e, 0xbd, 0xa5, 0x5f, 0xfd, 0xd4, - 0x70, 0x02, 0x01, 0x1d, 0xd1, 0xd7, 0xf7, 0x71, 0x6b, 0x79, 0x1d, 0x79, - 0xb6, 0xdb, 0x2a, 0xff, 0x0f, 0xba, 0x90, 0x33, 0x94, 0xa1, 0x7f, 0x7a, - 0x01, 0x92, 0x44, 0x66, 0x25, 0xd7, 0x93, 0x00, 0xfb, 0x0c, 0xeb, 0x63, - 0x13, 0x4d, 0x5c, 0x64, 0x57, 0xf0, 0x20, 0x11, 0xdd, 0x1d, 0x7f, 0xa3, - 0xef, 0x38, 0x9e, 0xd1, 0xd5, 0x0a, 0xff, 0xa4, 0xc7, 0xbc, 0x39, 0xd1, - 0xf2, 0x62, 0x5e, 0xc7, 0x08, 0x02, 0xf1, 0x2c, 0xbf, 0x03, 0x13, 0xaa, - 0x9d, 0x7f, 0xfd, 0x8c, 0x81, 0x7f, 0x68, 0x3f, 0xbf, 0x24, 0x75, 0x6e, - 0x7e, 0xab, 0x27, 0xbf, 0xa0, 0x58, 0xd5, 0x35, 0x36, 0xac, 0xeb, 0xff, - 0xff, 0x85, 0xd7, 0x1c, 0x60, 0x7b, 0x1a, 0xfd, 0xd2, 0x5a, 0xeb, 0xc8, - 0xeb, 0xdf, 0xfb, 0x47, 0x5e, 0x64, 0x68, 0xeb, 0xff, 0xbe, 0xcb, 0x3a, - 0xfd, 0x4e, 0x72, 0x0e, 0xac, 0x3d, 0xf0, 0x0d, 0xdf, 0xa3, 0xda, 0xdb, - 0x87, 0x5f, 0xbf, 0xe2, 0xbd, 0x43, 0xaa, 0x13, 0xbd, 0x09, 0x1b, 0x9e, - 0x01, 0xc0, 0x5f, 0x3c, 0x43, 0xb2, 0x51, 0x7f, 0x85, 0xdb, 0xc1, 0x75, - 0x4e, 0xbf, 0xfb, 0x3d, 0xaf, 0xba, 0x58, 0xc7, 0x20, 0xeb, 0xdb, 0x70, - 0x42, 0x7e, 0xab, 0x31, 0xbf, 0xf9, 0xb8, 0xe0, 0xbc, 0xf1, 0xc8, 0x91, - 0xd4, 0x87, 0xef, 0xd3, 0x4b, 0xff, 0xfe, 0x0f, 0x51, 0xbc, 0xd8, 0x45, - 0xbf, 0xb5, 0xfc, 0xb3, 0x7f, 0x1d, 0x58, 0x88, 0xc7, 0x21, 0xbf, 0xe9, - 0x99, 0xd4, 0x5c, 0x71, 0x53, 0xaf, 0xd3, 0xfc, 0xfe, 0x26, 0x3a, 0xd2, - 0x3a, 0xf7, 0xd1, 0x98, 0xea, 0x91, 0xae, 0x00, 0x85, 0x62, 0x2d, 0x5c, - 0xeb, 0x4b, 0x55, 0x0e, 0xfe, 0x96, 0x79, 0x5a, 0x72, 0x95, 0xb6, 0x19, - 0x54, 0x79, 0x4c, 0xe4, 0x56, 0x17, 0xcc, 0x86, 0x1a, 0x4a, 0xb5, 0x9a, - 0x58, 0xaf, 0x25, 0x79, 0x2e, 0x56, 0x4f, 0x67, 0x0c, 0xde, 0x53, 0x38, - 0x23, 0x3b, 0x19, 0xf7, 0xfd, 0x4e, 0x29, 0x7a, 0x70, 0xd3, 0xf9, 0x55, - 0xed, 0xc7, 0xbb, 0xf6, 0x1a, 0xd7, 0xb6, 0xc0, 0x9d, 0x7f, 0xfd, 0x82, - 0xa7, 0x95, 0x4d, 0xf5, 0xdc, 0x03, 0x9d, 0x52, 0x3e, 0xc0, 0x8e, 0x5c, - 0x08, 0x3a, 0xfc, 0xcc, 0xf7, 0x50, 0xeb, 0x3a, 0x1b, 0xb1, 0x15, 0xbf, - 0xff, 0xec, 0xeb, 0xfd, 0xd6, 0x2a, 0xe2, 0x08, 0x18, 0x9b, 0xb0, 0x75, - 0xa0, 0xeb, 0xff, 0xf4, 0x73, 0xb0, 0xbd, 0x8f, 0xe0, 0x62, 0x6e, 0xc1, - 0xd7, 0xe4, 0xe4, 0xd1, 0xde, 0x23, 0x2c, 0x0c, 0xa2, 0x1f, 0x5b, 0xa7, - 0x30, 0xb5, 0xdf, 0xb0, 0xef, 0xb3, 0x47, 0x3a, 0xff, 0xce, 0x20, 0xf8, - 0x1f, 0xdf, 0x92, 0x3a, 0xf9, 0x06, 0x78, 0x3a, 0xf7, 0xb9, 0x07, 0x5f, - 0xf0, 0xc2, 0xd0, 0x71, 0x70, 0x75, 0xc8, 0x1c, 0x3c, 0xf9, 0x86, 0xe9, - 0xad, 0x1b, 0x9c, 0x40, 0x16, 0xfa, 0x6a, 0x69, 0x92, 0x64, 0x3c, 0xaf, - 0x40, 0xce, 0x75, 0xf2, 0x75, 0x16, 0x75, 0xba, 0x86, 0xee, 0x61, 0xbb, - 0xfa, 0x19, 0x1a, 0xf2, 0x1d, 0x7f, 0xd1, 0xee, 0xb8, 0x1f, 0x7d, 0x1d, - 0x41, 0x3e, 0x31, 0x2b, 0xbf, 0xff, 0xc3, 0xfb, 0xb3, 0x5f, 0xba, 0x4a, - 0x05, 0x99, 0xbf, 0x8e, 0xbf, 0xf7, 0x01, 0xf3, 0xa8, 0xcf, 0xf8, 0x03, - 0xaf, 0x4d, 0xff, 0x0e, 0xbf, 0xf3, 0xa7, 0x33, 0x75, 0x1b, 0x6d, 0xb3, - 0xaa, 0x11, 0x44, 0xe8, 0x5a, 0x1e, 0xbf, 0xfe, 0x18, 0x97, 0xcf, 0xbe, - 0x41, 0xfe, 0x59, 0xa3, 0xab, 0x15, 0x16, 0xb2, 0x11, 0x4b, 0x21, 0xec, - 0x60, 0x40, 0x2e, 0xbc, 0x07, 0x59, 0xd7, 0x60, 0x0e, 0xa8, 0x36, 0x18, - 0x37, 0x79, 0xf1, 0x67, 0x5c, 0x32, 0x13, 0x73, 0xb0, 0x3f, 0x7f, 0x9b, - 0xd0, 0xe0, 0x45, 0xce, 0xbe, 0xd3, 0x18, 0x87, 0x54, 0x22, 0x01, 0x0b, - 0x9c, 0xc6, 0xfd, 0xcd, 0x0c, 0x4e, 0x75, 0xff, 0xf3, 0x78, 0xcd, 0x67, - 0xa6, 0xc5, 0x47, 0x00, 0x75, 0x61, 0xfb, 0xa1, 0x3d, 0xfc, 0xfe, 0xeb, - 0x88, 0x0e, 0xbf, 0xf3, 0xfb, 0x26, 0x78, 0x18, 0x98, 0xeb, 0xff, 0x75, - 0x33, 0xee, 0x4c, 0xdc, 0x6e, 0x75, 0x93, 0x88, 0xa8, 0xe9, 0x5e, 0x8f, - 0x2e, 0x63, 0x0d, 0x18, 0x25, 0x49, 0x32, 0x06, 0x43, 0x20, 0x06, 0xb7, - 0x60, 0x9d, 0x7f, 0xfb, 0xd0, 0x2c, 0xcf, 0x75, 0x38, 0x06, 0x1d, 0x7e, - 0x0a, 0x6b, 0xa8, 0x75, 0xfc, 0x83, 0x9e, 0xea, 0x1d, 0x68, 0xc3, 0xd0, - 0xd1, 0x35, 0x05, 0x1a, 0x58, 0x29, 0xfc, 0x26, 0x2f, 0xf4, 0x2f, 0x5a, - 0x71, 0x9c, 0xeb, 0xfe, 0x06, 0xa4, 0x9d, 0x74, 0x9c, 0xeb, 0xed, 0x60, - 0xf8, 0xeb, 0xdb, 0x11, 0xc3, 0xa9, 0x0f, 0xd9, 0xce, 0x3f, 0x20, 0xbd, - 0xe7, 0x6b, 0x3a, 0xff, 0x7b, 0xa8, 0xa0, 0x1d, 0x0e, 0xbb, 0xf1, 0x3a, - 0xef, 0xb8, 0x75, 0x05, 0x38, 0x8e, 0x9a, 0x8c, 0x2a, 0x3c, 0x5d, 0xf8, - 0xf6, 0xc9, 0x97, 0xd1, 0x6b, 0xf2, 0xa0, 0x49, 0xb4, 0x75, 0xf7, 0x51, - 0xe4, 0x75, 0xe0, 0xbc, 0x8e, 0xa8, 0x37, 0x78, 0x41, 0x6f, 0xe1, 0x10, - 0x60, 0x64, 0xbc, 0xfe, 0xd1, 0xd7, 0xff, 0x23, 0x07, 0x17, 0x13, 0x06, - 0x27, 0x3a, 0xff, 0x99, 0x9e, 0x8d, 0xa8, 0x20, 0x3a, 0xff, 0xfe, 0xfe, - 0x3d, 0xac, 0x1f, 0x9c, 0x84, 0x08, 0xbc, 0x8e, 0xbf, 0x33, 0xbb, 0xbb, - 0x59, 0xd7, 0xff, 0x20, 0x47, 0xff, 0x6a, 0x06, 0x34, 0x75, 0x31, 0x34, - 0x24, 0x43, 0x13, 0x8f, 0xd6, 0xb6, 0x95, 0xdf, 0xf9, 0xf9, 0x9b, 0x70, - 0x3c, 0x16, 0xce, 0xbf, 0xff, 0x93, 0xf1, 0x96, 0x0f, 0x93, 0x67, 0x3c, - 0x2f, 0x23, 0xa8, 0x08, 0x99, 0xf1, 0xfd, 0xff, 0xfc, 0x39, 0xaf, 0xfe, - 0x67, 0x5c, 0x72, 0x69, 0x46, 0xe7, 0x5f, 0xb8, 0xc7, 0x76, 0x1a, 0x20, - 0x6b, 0xf9, 0xe7, 0x03, 0x88, 0x49, 0x58, 0x3e, 0xf6, 0x6b, 0xfc, 0x3e, - 0xdd, 0x93, 0x3b, 0xdd, 0x79, 0x7c, 0x47, 0xf8, 0xc3, 0x26, 0xff, 0xba, - 0x98, 0x38, 0xc0, 0xe1, 0xd4, 0xb4, 0xe4, 0x7d, 0x19, 0x16, 0xd3, 0xab, - 0xde, 0xfe, 0x0e, 0xbe, 0x07, 0x35, 0xa3, 0xaf, 0xf0, 0x3c, 0x93, 0xae, - 0x18, 0x75, 0x6e, 0x7e, 0x2e, 0x38, 0x24, 0x57, 0xe0, 0xb5, 0x6e, 0x16, - 0xac, 0xea, 0x85, 0x6f, 0xf9, 0x29, 0xd9, 0x21, 0x54, 0xe5, 0xd7, 0x24, - 0x8e, 0xbf, 0xb7, 0xf0, 0x73, 0x15, 0x3a, 0x82, 0x78, 0x78, 0x2b, 0x7f, - 0x67, 0xa0, 0x50, 0x07, 0x5f, 0xf0, 0x78, 0x2e, 0xdf, 0xdd, 0xdb, 0x3a, - 0xf3, 0xf2, 0x73, 0x46, 0x0b, 0x7f, 0xe7, 0xe6, 0x08, 0x35, 0xed, 0x6e, - 0x75, 0xff, 0xff, 0xfd, 0x9e, 0xeb, 0x8a, 0xbf, 0x35, 0xc7, 0x7f, 0x6d, - 0xc0, 0xfc, 0xc5, 0xb8, 0xef, 0x23, 0xc4, 0x17, 0x7f, 0xe7, 0x75, 0x58, - 0xe1, 0xf8, 0xab, 0x67, 0x88, 0x2e, 0xff, 0xee, 0xa7, 0x52, 0x07, 0xdf, - 0x15, 0x6c, 0xf1, 0x05, 0xdf, 0xe8, 0x41, 0xf7, 0xc5, 0x5b, 0x3c, 0x41, - 0x77, 0xf2, 0xf0, 0x3f, 0x15, 0x6c, 0xf1, 0x05, 0xdf, 0xff, 0xf3, 0x88, - 0xa2, 0xfe, 0x69, 0x9d, 0x4e, 0x22, 0xb3, 0xe3, 0x67, 0x88, 0x2e, 0xed, - 0xfe, 0x05, 0x39, 0x76, 0x27, 0xf1, 0x4d, 0xd0, 0x84, 0xfa, 0xa1, 0x56, - 0x3f, 0x4f, 0x86, 0x51, 0x8d, 0xfe, 0x48, 0x57, 0x5e, 0xd6, 0xe7, 0x5f, - 0x3f, 0x00, 0xe7, 0x5f, 0xfd, 0xd4, 0xea, 0x40, 0xfb, 0xe2, 0xad, 0x9e, - 0x20, 0xbb, 0xfe, 0x9b, 0x4c, 0x49, 0xfe, 0x2a, 0xd9, 0xe2, 0x0b, 0xbf, - 0x7b, 0x50, 0xbf, 0x8c, 0x44, 0xff, 0xd5, 0x3b, 0xff, 0xdf, 0x19, 0xd4, - 0x64, 0x7b, 0x5f, 0x15, 0x6c, 0xf1, 0x05, 0xdf, 0xff, 0xfc, 0x22, 0x8b, - 0xf9, 0xfe, 0x7c, 0xd3, 0x3a, 0x9c, 0x45, 0x67, 0xc6, 0xcf, 0x10, 0x5d, - 0x62, 0x64, 0xbb, 0xa2, 0x3a, 0xed, 0xff, 0x75, 0x38, 0x8a, 0xcf, 0x8d, - 0x9e, 0x20, 0xbb, 0xff, 0xe7, 0x7d, 0xe5, 0xae, 0xa0, 0x43, 0x1c, 0x82, - 0xaf, 0xfd, 0x92, 0x97, 0xfa, 0xe0, 0xcf, 0xb2, 0x78, 0x82, 0xe9, 0x88, - 0xe5, 0xe2, 0x3e, 0x93, 0xaf, 0xfc, 0xc4, 0xe7, 0x9c, 0x1a, 0xf8, 0xd9, - 0xe2, 0x0b, 0xbf, 0xba, 0x9d, 0xea, 0x00, 0xd0, 0x05, 0xdf, 0xb0, 0x1f, - 0x15, 0x6c, 0xf1, 0x05, 0xdd, 0x9e, 0x61, 0xf8, 0xf4, 0xe6, 0xb7, 0x47, - 0x66, 0xa1, 0x7f, 0x7f, 0x2f, 0x03, 0xf1, 0x56, 0xcf, 0x10, 0x5d, 0xff, - 0x99, 0xd4, 0xe2, 0x2b, 0x3e, 0x36, 0x78, 0x82, 0xee, 0xcf, 0x8e, 0x88, - 0xbd, 0x1f, 0x5f, 0xef, 0xd1, 0x6e, 0x3b, 0xc8, 0xf1, 0x05, 0xdf, 0xfb, - 0x13, 0x6e, 0x0e, 0x05, 0xe4, 0x78, 0x82, 0xd6, 0x78, 0x14, 0x15, 0xdf, - 0xde, 0x1b, 0x80, 0xd0, 0x63, 0xe4, 0xd4, 0x62, 0xbe, 0x8c, 0x73, 0xf8, - 0x5a, 0x36, 0xdf, 0x70, 0x20, 0xd1, 0x05, 0xa8, 0x88, 0xcb, 0x9d, 0x87, - 0x5b, 0x4c, 0x64, 0xe1, 0x82, 0x92, 0xf3, 0xe3, 0x5b, 0xa5, 0xb0, 0x75, - 0xe8, 0x96, 0xc1, 0xd5, 0x06, 0xdc, 0x46, 0x6a, 0x76, 0x57, 0x20, 0x48, - 0x77, 0x2a, 0x05, 0x28, 0x00, 0x5e, 0xaf, 0xfe, 0xc9, 0x0e, 0x7b, 0xa9, - 0x9b, 0xf8, 0xeb, 0xfd, 0x1d, 0x46, 0xf7, 0x96, 0x8e, 0xbf, 0x47, 0xb5, - 0xd4, 0x3a, 0xff, 0xb7, 0x1c, 0x45, 0xe0, 0x80, 0xeb, 0xff, 0x6a, 0x69, - 0x7e, 0x19, 0xa5, 0xf8, 0x4e, 0xa9, 0xd1, 0xa9, 0x23, 0x4c, 0x26, 0xf1, - 0xb5, 0xff, 0xd1, 0xbc, 0xbe, 0xaf, 0x5e, 0x8d, 0xdb, 0x3a, 0xfd, 0x2d, - 0x8d, 0x8f, 0xe7, 0x3a, 0xdd, 0x43, 0xf9, 0x74, 0x9b, 0xf7, 0x23, 0x79, - 0x68, 0xea, 0x91, 0xe7, 0x70, 0x9a, 0xff, 0xdf, 0xeb, 0x67, 0x38, 0x05, - 0xa6, 0x8e, 0xbf, 0xfb, 0x6e, 0xd8, 0xd3, 0xf7, 0x79, 0x67, 0x8e, 0xa0, - 0x22, 0x2b, 0xea, 0x15, 0xfe, 0x07, 0xfe, 0x18, 0xf6, 0x8e, 0xa0, 0x1e, - 0xc6, 0x89, 0x6a, 0x15, 0x15, 0x64, 0x60, 0x8f, 0x18, 0x25, 0xfc, 0xf2, - 0x8d, 0xaf, 0xd3, 0xaf, 0xfe, 0xcd, 0xfd, 0xa4, 0x18, 0x03, 0xac, 0xeb, - 0xff, 0x34, 0xf0, 0x47, 0x3e, 0xc0, 0x80, 0xea, 0x9d, 0x10, 0x5f, 0xa1, - 0x5f, 0x6f, 0xa8, 0xdc, 0xeb, 0xff, 0x4b, 0x37, 0x97, 0x23, 0xcf, 0xe3, - 0xaf, 0x2e, 0x24, 0x75, 0xfb, 0x03, 0xdf, 0xdb, 0x3a, 0xbe, 0x22, 0x96, - 0x62, 0x37, 0x3e, 0x11, 0xbb, 0xc1, 0x7f, 0x1d, 0x5c, 0x3d, 0x97, 0x3e, - 0xbc, 0x9b, 0x38, 0x75, 0xe7, 0xe0, 0x0e, 0xb6, 0xf0, 0x6e, 0x3c, 0x3b, - 0x7c, 0xde, 0x75, 0xce, 0xbe, 0x57, 0x88, 0xd9, 0xd7, 0xe9, 0xdf, 0xb0, - 0xd6, 0x75, 0x35, 0x07, 0x9b, 0x84, 0x75, 0x0a, 0xb9, 0xb2, 0x15, 0xe9, - 0x19, 0x1b, 0xac, 0x80, 0x9c, 0x5b, 0xaf, 0xff, 0x08, 0xc4, 0xeb, 0xea, - 0x73, 0x8f, 0x23, 0xaf, 0xf4, 0xf3, 0xc0, 0xef, 0x9e, 0x3a, 0xb0, 0xff, - 0x11, 0x22, 0xff, 0xee, 0x0f, 0xfb, 0xf8, 0x72, 0x77, 0x13, 0xaf, 0x3f, - 0x27, 0x3a, 0xe0, 0x41, 0xd7, 0xc9, 0x0b, 0xc3, 0xa8, 0xeb, 0xf9, 0xd5, - 0xf4, 0x70, 0x07, 0x50, 0x4d, 0xb8, 0x85, 0x5f, 0xff, 0xe8, 0x40, 0x8c, - 0x7e, 0xcf, 0x63, 0x03, 0x0c, 0xfa, 0xb3, 0xae, 0x04, 0x1d, 0x74, 0x2a, - 0x75, 0xff, 0x67, 0xb5, 0x0b, 0xfb, 0x93, 0x1d, 0x7f, 0xb5, 0x9d, 0x4d, - 0x7f, 0x39, 0xd7, 0x36, 0xd9, 0x57, 0xfc, 0x39, 0xb5, 0xe5, 0xa4, 0x09, - 0xd4, 0xc4, 0xfc, 0x50, 0x73, 0x82, 0xab, 0x56, 0xe9, 0x00, 0x18, 0x5a, - 0x62, 0xa2, 0x2d, 0xa3, 0xa6, 0xcd, 0x3e, 0x8c, 0x5e, 0x6d, 0xb6, 0xca, - 0xb2, 0xca, 0x50, 0xbf, 0xbe, 0x99, 0xdf, 0x85, 0x28, 0x8d, 0xdf, 0xb0, - 0xbd, 0xa9, 0xd5, 0xad, 0x3c, 0xb1, 0x2b, 0xfb, 0xd1, 0x9d, 0xc9, 0xce, - 0xbb, 0x16, 0x75, 0x6e, 0x78, 0x3a, 0x2c, 0xa8, 0x74, 0xd1, 0x32, 0x8d, - 0x77, 0x25, 0x4b, 0x2b, 0x19, 0xfe, 0xf1, 0xe2, 0x24, 0xa9, 0x0e, 0x43, - 0xc9, 0x65, 0x3d, 0x9c, 0xdc, 0x7a, 0x5b, 0x70, 0x16, 0x06, 0x5a, 0x06, - 0xa5, 0x90, 0xfa, 0x1b, 0x7f, 0xcb, 0x7a, 0xda, 0xdb, 0x7f, 0x60, 0x00, - 0x9c, 0x91, 0xd7, 0x33, 0x0e, 0xa0, 0x9e, 0x0b, 0x96, 0x5d, 0x8d, 0x9d, - 0x74, 0x78, 0xea, 0x9c, 0xd5, 0xb0, 0x5a, 0xcb, 0x3a, 0xb0, 0xd9, 0x78, - 0x8a, 0xff, 0x49, 0x07, 0x17, 0xff, 0x4e, 0xbf, 0xf6, 0x7b, 0x5d, 0x45, - 0xbe, 0x70, 0xea, 0x83, 0xee, 0x13, 0x2b, 0xf6, 0x7c, 0xc0, 0x78, 0xeb, - 0xef, 0x9e, 0x8d, 0xa7, 0x5f, 0x62, 0xf3, 0xc7, 0x5e, 0xf3, 0xaa, 0x75, - 0xff, 0xff, 0x9e, 0x6f, 0xe5, 0xfb, 0x3e, 0x75, 0x3d, 0xe8, 0xde, 0x27, - 0x8d, 0x1d, 0x7e, 0x17, 0x6b, 0x9e, 0x63, 0xaf, 0xa6, 0xd4, 0x78, 0xea, - 0x62, 0x2f, 0xe6, 0x72, 0xfc, 0xae, 0xff, 0xff, 0x9a, 0xc5, 0xdf, 0x6c, - 0x4b, 0xb1, 0xc9, 0xe3, 0xda, 0x79, 0x1d, 0x79, 0x37, 0x98, 0xeb, 0xf6, - 0x64, 0xff, 0xe8, 0xeb, 0xee, 0x0a, 0x00, 0xeb, 0xe4, 0x63, 0xf0, 0xeb, - 0xa0, 0x07, 0x5f, 0x7f, 0x3f, 0xea, 0x74, 0xda, 0xfd, 0x20, 0xa4, 0x44, - 0xa7, 0x55, 0x6e, 0x6b, 0x01, 0xd7, 0xe7, 0x8d, 0xf1, 0x87, 0x5f, 0xf7, - 0x5f, 0x5d, 0x49, 0xdc, 0x4e, 0xbe, 0x79, 0xfe, 0xc8, 0xea, 0x69, 0x2e, - 0x52, 0x43, 0xf4, 0xa1, 0x1c, 0x12, 0x0c, 0x28, 0xdc, 0x95, 0x08, 0x39, - 0x0d, 0xb7, 0x32, 0x03, 0x4e, 0x87, 0x7d, 0x0b, 0xcf, 0xc8, 0x9b, 0x19, - 0xfa, 0x4d, 0xb0, 0x6f, 0x7f, 0x0f, 0xe1, 0x5b, 0xc8, 0xeb, 0xc9, 0x3f, - 0xe7, 0x5f, 0xa0, 0x09, 0xbe, 0x1d, 0x72, 0xf6, 0x9d, 0x60, 0xc1, 0xbe, - 0x12, 0x6b, 0xff, 0xd2, 0x18, 0xf8, 0xb1, 0x85, 0x7c, 0x93, 0x9d, 0x7e, - 0x75, 0xe7, 0x56, 0x75, 0x6e, 0x7e, 0x3e, 0x4b, 0xbd, 0xee, 0x41, 0xd7, - 0xfb, 0x5e, 0xdb, 0x83, 0x81, 0x3a, 0xfe, 0xcd, 0x64, 0x93, 0x87, 0x5e, - 0xec, 0x6d, 0x3a, 0xf6, 0xa5, 0x39, 0xd5, 0x86, 0xeb, 0xe8, 0xed, 0x42, - 0xa1, 0x69, 0x16, 0xe2, 0xda, 0x42, 0x59, 0x64, 0x6e, 0x36, 0x26, 0x7e, - 0x65, 0xbc, 0xff, 0x3e, 0x9d, 0x7a, 0x64, 0xe9, 0xd7, 0xf4, 0x71, 0xe6, - 0x4e, 0x9d, 0x7e, 0xd0, 0x60, 0x67, 0x73, 0xc8, 0xd0, 0xe5, 0xe5, 0xc2, - 0xce, 0xad, 0xcf, 0x65, 0x67, 0xd7, 0xff, 0xc3, 0x2f, 0x98, 0x14, 0xd6, - 0xfe, 0xfd, 0xf4, 0x75, 0xfb, 0xbf, 0x8c, 0x6d, 0x3a, 0xfe, 0x17, 0xf4, - 0xa1, 0x53, 0xaa, 0x0f, 0x57, 0xe9, 0x4d, 0xf6, 0x66, 0xf2, 0x3a, 0xf6, - 0x92, 0x63, 0xac, 0xa8, 0x9b, 0xdd, 0x10, 0xdf, 0xfc, 0xf3, 0x8c, 0x6e, - 0x81, 0x18, 0x9c, 0xea, 0xe1, 0xf5, 0x09, 0x3d, 0xfb, 0xe7, 0x63, 0x92, - 0x3a, 0xbe, 0x2a, 0x9e, 0x88, 0x60, 0x61, 0x1b, 0x21, 0x4e, 0xf0, 0xca, - 0x6c, 0x86, 0xf2, 0xf5, 0x07, 0x5f, 0xd3, 0xcd, 0x26, 0x97, 0x27, 0x3a, - 0xf9, 0x78, 0xfd, 0x3a, 0xd3, 0x9d, 0x7e, 0xf7, 0x51, 0x7c, 0x3a, 0xa4, - 0x6e, 0x38, 0x23, 0x7b, 0xa1, 0x43, 0xaf, 0xdd, 0xc4, 0x96, 0x8e, 0xbf, - 0xfe, 0xec, 0x7d, 0x53, 0xc2, 0xe0, 0xd6, 0xa0, 0x05, 0x5f, 0xb3, 0xcf, - 0xfb, 0x4c, 0xeb, 0xf7, 0x18, 0xee, 0xc3, 0xc4, 0x09, 0x7b, 0x51, 0xb9, - 0xd6, 0x06, 0x1e, 0x7e, 0xe6, 0x77, 0xbc, 0x93, 0x9d, 0x7a, 0x77, 0x13, - 0xaa, 0x49, 0xa8, 0x04, 0x9b, 0x75, 0x1e, 0x3d, 0x2c, 0xa3, 0xc3, 0x97, - 0xf0, 0xb1, 0xd5, 0xea, 0x1d, 0x76, 0xc4, 0x8e, 0xbe, 0xf4, 0xee, 0x27, - 0x5e, 0x17, 0x54, 0xeb, 0xfc, 0xae, 0x4f, 0xff, 0xb6, 0xf8, 0xeb, 0xfe, - 0x79, 0x72, 0x27, 0x7e, 0x30, 0xeb, 0xca, 0xa7, 0x8e, 0xbd, 0xa7, 0xf1, - 0xd4, 0xa9, 0xb7, 0xdc, 0x72, 0xef, 0x9d, 0x3a, 0xfe, 0x5f, 0x90, 0x3f, - 0xc1, 0xd7, 0x97, 0xe6, 0x1d, 0x6f, 0x41, 0xe4, 0xe1, 0x6d, 0xfd, 0x0b, - 0xc5, 0x63, 0x47, 0x54, 0xe9, 0xe9, 0x60, 0xcb, 0x08, 0x78, 0x36, 0xb3, - 0x8e, 0xb7, 0x80, 0x8c, 0x58, 0x7c, 0x4d, 0x77, 0x3f, 0x3a, 0xff, 0x0b, - 0xb7, 0xad, 0x40, 0x0e, 0xbd, 0xb2, 0xea, 0x9d, 0x7f, 0xd0, 0xb9, 0x64, - 0xf9, 0xfb, 0x4c, 0xeb, 0xe7, 0xf3, 0x4e, 0x73, 0xab, 0x11, 0x04, 0x83, - 0xee, 0x7b, 0x79, 0xb8, 0xfa, 0x75, 0xe6, 0xdb, 0x6c, 0xf5, 0x7d, 0x5e, - 0x71, 0x09, 0x6a, 0xfa, 0xa8, 0x6b, 0x2f, 0xa5, 0xfc, 0x2a, 0x75, 0x80, - 0x75, 0x61, 0xb3, 0x72, 0x3a, 0x84, 0xf3, 0x42, 0x2f, 0xc8, 0x5a, 0x74, - 0xb4, 0x09, 0x5e, 0x6c, 0xbf, 0xde, 0xee, 0x4b, 0xa9, 0xb4, 0xeb, 0xe5, - 0xf3, 0xf9, 0xce, 0xbf, 0xfe, 0x14, 0x55, 0x4d, 0x7b, 0xbf, 0xbc, 0xa5, - 0x07, 0x54, 0x1f, 0xae, 0x12, 0x54, 0xe9, 0x92, 0xc9, 0x71, 0x58, 0x54, - 0xdf, 0x60, 0x5e, 0x47, 0x5f, 0x9c, 0x45, 0x16, 0x75, 0xc9, 0xd3, 0xaf, - 0x05, 0xe4, 0x75, 0xfe, 0x4e, 0x62, 0x2e, 0x1a, 0xce, 0xa0, 0x9f, 0x1e, - 0x0a, 0xf4, 0x6e, 0xfc, 0x8b, 0x71, 0xc3, 0xab, 0xe3, 0x24, 0xb1, 0xaa, - 0x1b, 0x83, 0x59, 0x2c, 0x04, 0x87, 0x23, 0x6b, 0x55, 0x65, 0x23, 0xfe, - 0x79, 0x6e, 0x00, 0x38, 0x12, 0x0f, 0xe1, 0x0f, 0xb2, 0x5d, 0x7f, 0x67, - 0x71, 0x9f, 0xe1, 0xd7, 0xe4, 0xf4, 0x7b, 0x45, 0x5f, 0x32, 0x3d, 0xa2, - 0xae, 0x6d, 0xb2, 0xaa, 0x47, 0xbf, 0x84, 0xcd, 0x90, 0xdd, 0x8d, 0x94, - 0xa1, 0xaf, 0xbe, 0x98, 0x5d, 0xb3, 0xaf, 0xff, 0xbd, 0x0c, 0xcc, 0x1f, - 0x75, 0x20, 0x67, 0x3a, 0x8e, 0xac, 0x3d, 0x6d, 0x26, 0x54, 0xc9, 0xbd, - 0x02, 0x17, 0x42, 0x4e, 0xdb, 0xc5, 0xff, 0xe1, 0x8d, 0xc1, 0x83, 0x12, - 0xe7, 0x20, 0xeb, 0xff, 0x7b, 0x58, 0xce, 0xb8, 0xfb, 0x47, 0x5e, 0x41, - 0x01, 0xdf, 0x0d, 0xed, 0xa1, 0x68, 0xb0, 0xdb, 0x08, 0x4b, 0xf4, 0xbb, - 0xfc, 0x70, 0xeb, 0xff, 0x9d, 0x7c, 0x8d, 0xa9, 0xb4, 0x7f, 0xd1, 0xd5, - 0xb9, 0xf7, 0xf4, 0xa2, 0xfd, 0x9f, 0xae, 0x34, 0x75, 0x1d, 0x76, 0x4d, - 0xc3, 0x63, 0xa2, 0x7b, 0xfe, 0x4f, 0xda, 0x7d, 0x8f, 0xa3, 0x39, 0xd7, - 0xfd, 0x13, 0xc6, 0xfe, 0x1c, 0x9c, 0xea, 0xc4, 0x52, 0xb0, 0xb5, 0x0f, - 0xef, 0xce, 0xb1, 0x8d, 0xce, 0xa9, 0x93, 0x4d, 0xe4, 0x3e, 0x7a, 0x5d, - 0x7d, 0x9d, 0xc9, 0xce, 0xbd, 0x27, 0xe1, 0xd7, 0xe9, 0x67, 0xb0, 0x25, - 0x5f, 0x40, 0x8c, 0x1d, 0x53, 0x1e, 0xff, 0x86, 0xfe, 0x93, 0x5f, 0x03, - 0x4b, 0xe1, 0xd4, 0xaa, 0x35, 0x12, 0x10, 0x1e, 0x32, 0xbf, 0xe1, 0xce, - 0xe7, 0xce, 0xe4, 0xe7, 0x5f, 0xff, 0xfc, 0x08, 0x16, 0x3f, 0x9f, 0x70, - 0x6f, 0xe4, 0x5e, 0xbb, 0x1f, 0x44, 0xeb, 0xfb, 0xf6, 0x9a, 0x73, 0x98, - 0x75, 0xf7, 0x95, 0xce, 0x9d, 0x7f, 0xe1, 0xcf, 0x7b, 0xf9, 0xfd, 0x8c, - 0x3a, 0xfc, 0x1f, 0xdf, 0x92, 0x3a, 0xda, 0x3a, 0xe4, 0x01, 0xd7, 0x75, - 0x0e, 0xbb, 0xfd, 0x7c, 0x35, 0x53, 0x0a, 0xd3, 0x9f, 0x58, 0x0e, 0xae, - 0x04, 0x1d, 0x70, 0x20, 0xeb, 0xf7, 0xf2, 0xc1, 0x51, 0x0d, 0x50, 0x05, - 0x6a, 0x13, 0x7d, 0x54, 0x89, 0x0f, 0xc1, 0x09, 0x31, 0x4b, 0xbf, 0xfe, - 0xc1, 0x7d, 0xf4, 0xaa, 0xaf, 0xf1, 0x8b, 0x01, 0xd7, 0xff, 0x7b, 0xb8, - 0xbf, 0xb0, 0x0c, 0xdf, 0xc7, 0x5f, 0xed, 0xd8, 0x9c, 0xfb, 0x01, 0x3a, - 0xf8, 0x0b, 0x79, 0x7c, 0x46, 0x76, 0x94, 0xfc, 0x8d, 0x77, 0xfe, 0x3a, - 0xfe, 0x02, 0xfe, 0xeb, 0xec, 0xe7, 0x5f, 0xda, 0x41, 0x18, 0xdc, 0xeb, - 0xb3, 0x73, 0xab, 0x73, 0xf4, 0xf1, 0x9e, 0xc9, 0x5d, 0xf0, 0x38, 0x9c, - 0x3a, 0xa1, 0x32, 0x89, 0x24, 0xbc, 0x22, 0xdb, 0x33, 0xbd, 0xfe, 0xfe, - 0x3a, 0xce, 0x75, 0x68, 0xd6, 0xf8, 0x7a, 0xec, 0x6c, 0xeb, 0xfe, 0x8d, - 0xf0, 0x11, 0xb7, 0x27, 0x3a, 0xfe, 0x1c, 0xf6, 0x9c, 0x07, 0x57, 0x0f, - 0xec, 0x02, 0xda, 0x3a, 0xbf, 0xe8, 0x9f, 0x5c, 0xc6, 0x44, 0xe7, 0x5f, - 0xec, 0x19, 0xf0, 0x2f, 0xd3, 0xaa, 0x63, 0xea, 0x6c, 0xe6, 0xfe, 0xc5, - 0xe0, 0x51, 0xb3, 0xae, 0x5c, 0x1d, 0x4b, 0x3c, 0x17, 0x2c, 0xbf, 0x87, - 0x26, 0xea, 0x78, 0xeb, 0xec, 0xce, 0xe8, 0xea, 0xc4, 0x69, 0x3b, 0x2f, - 0x88, 0x76, 0x0b, 0x2f, 0x36, 0xdb, 0x65, 0x5f, 0xb1, 0x51, 0xff, 0x45, - 0x28, 0x5f, 0xdf, 0x28, 0xdb, 0x6d, 0x9d, 0x76, 0x00, 0xea, 0xc3, 0x77, - 0xe2, 0x6a, 0x84, 0x49, 0xf9, 0xce, 0xff, 0xf9, 0x24, 0xfa, 0x5a, 0xde, - 0x4e, 0xaf, 0x50, 0xeb, 0xe4, 0xe0, 0x34, 0x75, 0xff, 0x6b, 0x91, 0xff, - 0x85, 0x36, 0x9d, 0x7f, 0xe1, 0xcd, 0x33, 0xa8, 0xc8, 0x13, 0xaf, 0xff, - 0xf2, 0xad, 0xbf, 0x15, 0x53, 0x59, 0x21, 0xfd, 0xf5, 0x82, 0x75, 0x42, - 0x36, 0x30, 0xe9, 0x0e, 0xef, 0x9b, 0x71, 0x91, 0xd7, 0xfd, 0xe8, 0xdc, - 0x0f, 0xde, 0xa1, 0xd6, 0xe9, 0xd5, 0x87, 0x90, 0xc3, 0x8b, 0xf0, 0xe7, - 0xa3, 0x87, 0x5e, 0x6d, 0xb6, 0xca, 0xbf, 0x3a, 0xbd, 0x4f, 0x14, 0xa1, - 0x7f, 0x50, 0x7f, 0x68, 0x89, 0x7b, 0x6c, 0x2c, 0xeb, 0xde, 0x46, 0xce, - 0xbd, 0xa7, 0xe1, 0xd5, 0xb9, 0xb7, 0xf0, 0xe5, 0xee, 0xc0, 0x4e, 0xac, - 0x44, 0x8a, 0x2a, 0x39, 0x15, 0xfb, 0x01, 0x99, 0x31, 0xd6, 0xd7, 0xc4, - 0xe8, 0x39, 0x09, 0xce, 0xc2, 0xc4, 0x4b, 0x6e, 0xfe, 0x41, 0x54, 0xb1, - 0x92, 0x82, 0x6f, 0xcd, 0x3e, 0xc4, 0xff, 0x9d, 0x7f, 0xf2, 0x7a, 0x39, - 0x83, 0xe7, 0x71, 0x3a, 0xa6, 0x5c, 0x22, 0xec, 0x3e, 0x46, 0x54, 0x2f, - 0xe7, 0x1b, 0x4b, 0x6f, 0x46, 0xd8, 0x3a, 0xb1, 0x73, 0xa1, 0x27, 0x1c, - 0x05, 0x72, 0xf0, 0xc6, 0xd3, 0xaf, 0xfe, 0xe4, 0x33, 0xa2, 0xfe, 0x18, - 0x6c, 0xeb, 0x9a, 0x68, 0x75, 0xc9, 0xd3, 0xaa, 0x73, 0x5d, 0xc1, 0x9a, - 0x84, 0x49, 0x3b, 0x85, 0xf7, 0xb5, 0xfb, 0x59, 0xd7, 0xfa, 0x06, 0x42, - 0x91, 0xb9, 0xd5, 0x0d, 0x94, 0x54, 0xa1, 0xe9, 0x91, 0xf5, 0xab, 0x18, - 0x5b, 0x0d, 0x77, 0x39, 0x47, 0x3e, 0x47, 0x5d, 0xd9, 0x48, 0x8e, 0xde, - 0x08, 0x4e, 0x0c, 0x6d, 0x7a, 0x87, 0x87, 0xa7, 0x42, 0xb6, 0x9c, 0x6c, - 0xc2, 0xbb, 0xe9, 0x0e, 0xc1, 0x35, 0xf9, 0x26, 0x92, 0x09, 0xd7, 0x35, - 0x08, 0x75, 0xff, 0x4d, 0xed, 0x8d, 0x44, 0xdf, 0xf0, 0xeb, 0xfc, 0x18, - 0x15, 0xc0, 0x60, 0xea, 0x83, 0xef, 0x73, 0xfb, 0xff, 0xb1, 0x3b, 0x01, - 0xef, 0xf1, 0xbe, 0x8e, 0xbc, 0x15, 0x40, 0x75, 0xf9, 0x7c, 0xe3, 0xf8, - 0xea, 0xf8, 0x78, 0x90, 0x3b, 0x7f, 0xf4, 0xce, 0xce, 0xc4, 0xbc, 0x38, - 0xb3, 0xaf, 0xee, 0x60, 0x8b, 0xce, 0x75, 0x30, 0xfb, 0x91, 0x0e, 0xff, - 0xf9, 0x17, 0xbc, 0xb5, 0xf3, 0x04, 0x71, 0x00, 0x75, 0xe4, 0xef, 0xe7, - 0x57, 0xc5, 0x4e, 0x8d, 0x51, 0x34, 0xa1, 0x13, 0xc2, 0x0e, 0xc2, 0x21, - 0xe1, 0x23, 0xe2, 0x1d, 0xa9, 0xf6, 0x51, 0xa8, 0x8f, 0x01, 0x49, 0xa1, - 0x0c, 0x96, 0xae, 0x34, 0x26, 0x93, 0x33, 0x47, 0x8c, 0x69, 0xa9, 0xc6, - 0x28, 0xd4, 0x8e, 0x9a, 0x25, 0x68, 0xac, 0x15, 0xa7, 0x9d, 0xbf, 0x95, - 0x2b, 0xa4, 0x34, 0xb3, 0xfc, 0xb7, 0xdb, 0x8a, 0xcb, 0xea, 0x65, 0x38, - 0x27, 0x7a, 0x50, 0x92, 0x52, 0xe4, 0xda, 0xe3, 0x80, 0x9a, 0x9c, 0xeb, - 0xca, 0x7f, 0xf2, 0xe9, 0x47, 0x3d, 0xaf, 0x0f, 0xde, 0xd0, 0x32, 0x02, - 0x97, 0xa2, 0xd3, 0x87, 0x90, 0xd7, 0x3a, 0xda, 0xbc, 0x21, 0x2f, 0x5a, - 0xa2, 0x5f, 0xe7, 0x85, 0x36, 0xcb, 0x09, 0x6e, 0x58, 0x8e, 0xcd, 0x26, - 0x53, 0xed, 0x69, 0xb3, 0xb1, 0x2e, 0xba, 0x94, 0x8f, 0x0f, 0xc6, 0x59, - 0xe0, 0x73, 0x5f, 0x94, 0x02, 0xf3, 0xc7, 0x5f, 0xe5, 0x33, 0x8c, 0x77, - 0x61, 0xa2, 0xe3, 0xbf, 0xca, 0x67, 0x18, 0xee, 0xc3, 0x45, 0xd7, 0x7f, - 0xf2, 0x8f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x51, 0xa8, 0x8f, 0x27, - 0x7e, 0x50, 0xcc, 0x09, 0x4a, 0xb0, 0x8f, 0x61, 0x42, 0x4a, 0x2c, 0x6b, - 0x84, 0x6b, 0xe7, 0x88, 0x90, 0x03, 0xbd, 0x14, 0x78, 0xff, 0x60, 0xfe, - 0xff, 0xf2, 0x8b, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x12, 0xd5, 0xff, - 0x34, 0x6e, 0xa3, 0x5b, 0xc6, 0xfb, 0x07, 0x5f, 0xb8, 0xc7, 0x76, 0x1a, - 0x23, 0x7b, 0xff, 0xbb, 0x09, 0xc4, 0x69, 0xb3, 0xb0, 0xd9, 0xd7, 0xfe, - 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x12, 0xfd, 0xfd, 0x1e, 0xfb, 0xd7, - 0xf1, 0xd7, 0xfb, 0x3e, 0xf1, 0x5e, 0xff, 0xa3, 0xaf, 0xbf, 0xea, 0x70, - 0xeb, 0xd3, 0x6b, 0x87, 0x59, 0x46, 0xa4, 0x9d, 0x66, 0x22, 0x30, 0xcd, - 0x68, 0xfd, 0x4a, 0x12, 0xed, 0x93, 0x7f, 0xa4, 0x57, 0xff, 0xb7, 0x97, - 0x92, 0x65, 0x02, 0x9b, 0x60, 0x27, 0x5f, 0xe5, 0x33, 0x8c, 0x77, 0x61, - 0xa2, 0xab, 0xb9, 0x36, 0x0e, 0xbe, 0x45, 0xbe, 0xd3, 0xa9, 0x53, 0x75, - 0xe1, 0x8b, 0xc3, 0xb0, 0xd9, 0xd7, 0xf7, 0x63, 0x6f, 0xe1, 0xc3, 0xaf, - 0xe7, 0xec, 0xc3, 0x01, 0x3a, 0xff, 0xef, 0x76, 0x34, 0x2f, 0xfb, 0x4d, - 0x38, 0x75, 0xe8, 0x96, 0x1d, 0x52, 0x45, 0xe0, 0x4b, 0xf7, 0x2c, 0x99, - 0x1e, 0xff, 0x95, 0xc1, 0xcd, 0xfc, 0xeb, 0x3a, 0xf6, 0xc4, 0x78, 0xeb, - 0xfd, 0xc8, 0x5f, 0xd8, 0x16, 0x1d, 0x7c, 0xfe, 0x7d, 0xce, 0xb8, 0x28, - 0x75, 0xfd, 0x9c, 0x63, 0xbb, 0x0d, 0x12, 0x05, 0x7c, 0x3c, 0xd5, 0x05, - 0x6f, 0xda, 0x71, 0x7d, 0xce, 0xbb, 0xf8, 0x3a, 0xa4, 0x7c, 0x3b, 0x92, - 0xf0, 0x9a, 0xff, 0x4a, 0x39, 0x3c, 0x72, 0x73, 0xaf, 0xf7, 0x27, 0x5c, - 0x0c, 0xb4, 0x75, 0x41, 0xf3, 0xe1, 0xa5, 0xf6, 0x4e, 0xe1, 0x3a, 0xe6, - 0x87, 0x4e, 0xbf, 0xfd, 0x93, 0x75, 0xd7, 0xee, 0xc7, 0xbf, 0x59, 0xd5, - 0x3a, 0xbd, 0x10, 0x91, 0x64, 0x36, 0xd5, 0x3f, 0x6b, 0x38, 0x98, 0x7b, - 0xa6, 0x6f, 0x0c, 0xf1, 0x84, 0xbf, 0x88, 0x36, 0x48, 0x7e, 0x8d, 0x5f, - 0xa0, 0x47, 0x3c, 0x75, 0xf7, 0x38, 0x8c, 0x3a, 0xf8, 0x72, 0x75, 0x36, - 0x4f, 0x17, 0xe9, 0x25, 0xfe, 0x53, 0xae, 0xbc, 0x80, 0x9d, 0x4a, 0x26, - 0xe9, 0xc8, 0xc0, 0xf6, 0x4f, 0xef, 0xf2, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, - 0x64, 0x5f, 0xe5, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0xd7, 0xbf, 0xfd, 0x9f, - 0x62, 0x75, 0x32, 0x6f, 0x06, 0x04, 0xeb, 0xfc, 0xa6, 0x71, 0x8e, 0xec, - 0x34, 0x5c, 0x97, 0xee, 0x31, 0xdd, 0x86, 0x8b, 0xb2, 0xff, 0xcf, 0x25, - 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x8e, 0xb2, 0x98, 0x7f, 0xab, 0x33, 0xbe, - 0x18, 0x92, 0xce, 0xbf, 0xf3, 0x49, 0xa0, 0xb8, 0xe4, 0xb1, 0x36, 0x9d, - 0x69, 0x1d, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0xa5, 0x6f, 0xf9, 0x9d, 0x49, - 0xbb, 0x13, 0xe1, 0xd7, 0xff, 0xbb, 0x13, 0xc7, 0x53, 0x6b, 0x87, 0xa8, - 0x72, 0x86, 0xe6, 0xe9, 0x29, 0x88, 0xc7, 0x99, 0xb2, 0xb7, 0x4c, 0x1d, - 0xe1, 0xaf, 0x7f, 0xe7, 0x4f, 0x4b, 0xf0, 0xb8, 0x80, 0xeb, 0x28, 0x14, - 0xf5, 0x37, 0x20, 0x5c, 0x69, 0xdd, 0x29, 0xa9, 0xd9, 0x93, 0x52, 0x94, - 0x07, 0x90, 0x82, 0xdd, 0x39, 0x27, 0x6f, 0x96, 0x76, 0x03, 0xf1, 0x3f, - 0xd2, 0x67, 0xa1, 0x79, 0xb6, 0x3f, 0xcb, 0xfe, 0x92, 0x99, 0xc6, 0x3b, - 0xb0, 0xd1, 0x1c, 0x5f, 0xf2, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x15, 0xad, - 0x94, 0x74, 0x44, 0xf9, 0x16, 0xff, 0xf2, 0x8b, 0x79, 0x29, 0x9c, 0x63, - 0xbb, 0x0d, 0x12, 0xdd, 0xef, 0xf8, 0x03, 0xae, 0xcd, 0xce, 0xbf, 0xc1, - 0xc5, 0xae, 0x13, 0x47, 0x5e, 0xdb, 0xfc, 0x8e, 0xa6, 0x22, 0x0f, 0x71, - 0xd4, 0x16, 0xda, 0x63, 0x7b, 0xa1, 0x91, 0xd7, 0xfd, 0x9b, 0x8e, 0x00, - 0x0f, 0x23, 0xae, 0x5b, 0x0e, 0xbf, 0xd8, 0x9b, 0xe8, 0x38, 0x27, 0x54, - 0x1f, 0xf4, 0x8d, 0xf8, 0x2d, 0x7c, 0x31, 0xbc, 0x8e, 0xbf, 0xff, 0x3e, - 0xe0, 0x0f, 0x5e, 0x59, 0xa1, 0xfd, 0xfe, 0x9d, 0x7c, 0x0c, 0xe4, 0xc7, - 0x53, 0x11, 0x35, 0xd2, 0x10, 0x2b, 0xd9, 0x53, 0xaf, 0xe4, 0xe0, 0xa7, - 0xb4, 0x75, 0xfb, 0x8e, 0x39, 0x07, 0x51, 0xa2, 0x1b, 0x43, 0xe0, 0xe8, - 0x8b, 0x95, 0xdd, 0x02, 0x75, 0xfc, 0x82, 0x1c, 0x40, 0x9d, 0x50, 0x6f, - 0xa4, 0x29, 0x7d, 0x93, 0x4b, 0x0e, 0xbf, 0xf3, 0xc9, 0x4c, 0xe3, 0x1d, - 0xd8, 0x68, 0x98, 0x2f, 0x36, 0x80, 0x3a, 0xfb, 0x4e, 0x20, 0x3a, 0xa6, - 0x37, 0x80, 0x1c, 0xbf, 0xdf, 0xef, 0xc4, 0x85, 0xe1, 0xd7, 0xee, 0xa4, - 0x0c, 0xe7, 0x5f, 0xf4, 0x4f, 0xe1, 0x8f, 0xfd, 0xa3, 0xad, 0xee, 0xa2, - 0x4b, 0x46, 0x7b, 0x24, 0xd7, 0xdb, 0xb1, 0x15, 0x3a, 0xb0, 0xf7, 0x3c, - 0x73, 0x7f, 0xb8, 0x9e, 0xc5, 0xc7, 0x4e, 0xbf, 0xda, 0x4e, 0xa2, 0xf1, - 0x53, 0xaf, 0xff, 0x3c, 0xfd, 0x48, 0x1c, 0x99, 0x38, 0x87, 0x56, 0x22, - 0xab, 0xc6, 0x2d, 0x99, 0x5c, 0xcc, 0x3a, 0xef, 0xc0, 0x55, 0x21, 0xac, - 0xe0, 0xad, 0xfe, 0xc0, 0x8e, 0x7b, 0xb8, 0x75, 0xcd, 0x26, 0x1e, 0x30, - 0xab, 0xfa, 0x7f, 0xbb, 0x2e, 0x20, 0x3a, 0xfe, 0xcf, 0x7a, 0x39, 0xa3, - 0xaf, 0xe7, 0x10, 0x4e, 0x0f, 0x1d, 0x50, 0x88, 0xb1, 0x32, 0xd9, 0x2c, - 0xb2, 0x90, 0xbd, 0xc1, 0x39, 0xf8, 0x61, 0x35, 0x90, 0xc8, 0x64, 0x24, - 0x37, 0x7e, 0xe1, 0x02, 0xc8, 0x5e, 0x10, 0xc3, 0x18, 0x86, 0xa1, 0x97, - 0xe5, 0xcd, 0xa4, 0x0d, 0x98, 0x7d, 0x85, 0x95, 0xe5, 0xff, 0xc2, 0xaf, - 0xfc, 0xf2, 0x53, 0x38, 0xc7, 0x76, 0x1a, 0x26, 0x3b, 0xe8, 0xe4, 0x6c, - 0x1d, 0x65, 0x11, 0x11, 0x4b, 0x1d, 0xea, 0x55, 0xf4, 0x4f, 0x1c, 0x3a, - 0xfd, 0x91, 0x32, 0x2c, 0xea, 0x43, 0xc7, 0xe1, 0x0d, 0xfc, 0x15, 0xc6, - 0x7b, 0x47, 0x5f, 0xee, 0xc7, 0x27, 0xfb, 0xf8, 0x0e, 0xb9, 0xf4, 0x75, - 0xf7, 0xcf, 0x67, 0x4e, 0xb4, 0x74, 0xdc, 0x68, 0x56, 0xf4, 0x0c, 0xe7, - 0x5f, 0xff, 0xff, 0x4b, 0x5d, 0xcf, 0xdb, 0xd7, 0x71, 0x99, 0xaf, 0x99, - 0xbc, 0xb4, 0x82, 0x87, 0x5e, 0x77, 0x61, 0xa2, 0xb1, 0xbe, 0x7f, 0xb0, - 0xa9, 0xd4, 0xc3, 0xca, 0xe1, 0x3d, 0xff, 0xb6, 0x73, 0xc3, 0x9f, 0xc0, - 0xf8, 0xea, 0x55, 0x36, 0xc6, 0x13, 0x6e, 0x37, 0xc8, 0x65, 0x78, 0x8a, - 0xff, 0xe1, 0xf2, 0xbf, 0xc0, 0xe3, 0x23, 0x87, 0x5f, 0xee, 0x4f, 0xed, - 0x3e, 0xec, 0x3a, 0xa0, 0xfe, 0x1d, 0x0e, 0xfd, 0xb1, 0xec, 0xde, 0x63, - 0xaf, 0xff, 0xff, 0xf3, 0xfb, 0xd9, 0xdd, 0x3c, 0x90, 0x7d, 0x2c, 0xe6, - 0x6b, 0x3a, 0xf3, 0x8c, 0x48, 0xea, 0x84, 0x5b, 0x68, 0xb2, 0xfe, 0xff, - 0x65, 0x9d, 0x46, 0x99, 0xd7, 0xf6, 0x6b, 0x79, 0x47, 0x4e, 0xba, 0x36, - 0x9d, 0x5d, 0x3c, 0x41, 0x2d, 0xbf, 0xd3, 0x3e, 0x24, 0xbe, 0xac, 0xea, - 0x09, 0xea, 0xa1, 0x0d, 0xff, 0x46, 0xf2, 0x9a, 0x4f, 0xc9, 0xce, 0xa8, - 0x4c, 0xab, 0x21, 0x9c, 0x84, 0x37, 0xa2, 0x5e, 0x3a, 0xff, 0xd8, 0x1e, - 0x27, 0xf3, 0x83, 0x52, 0x3a, 0xf9, 0x6f, 0xbf, 0x8e, 0xbf, 0xfa, 0x78, - 0xf7, 0xcf, 0xac, 0xfb, 0xb1, 0xf7, 0x47, 0x5f, 0xf7, 0x23, 0x4f, 0xc1, - 0x89, 0x1d, 0x5c, 0x44, 0x3e, 0xd5, 0x1b, 0xd2, 0x79, 0xce, 0xbd, 0xf2, - 0x75, 0x9d, 0x70, 0x7c, 0x75, 0x34, 0x93, 0x1f, 0xc8, 0x54, 0xee, 0x4a, - 0x83, 0x82, 0x3f, 0x7f, 0xe1, 0x70, 0xf6, 0x36, 0xf5, 0xc4, 0xeb, 0xff, - 0xff, 0x7f, 0x3e, 0x33, 0xe0, 0xff, 0xb1, 0xf3, 0x37, 0x96, 0x7e, 0x20, - 0xd1, 0xd7, 0xff, 0xa7, 0xcd, 0xfd, 0xa4, 0x18, 0x03, 0xac, 0xeb, 0xfd, - 0xb8, 0xe0, 0x7a, 0xed, 0x9d, 0x58, 0x7f, 0x8e, 0x93, 0x41, 0x4d, 0x40, - 0x4f, 0x75, 0x0f, 0x3b, 0xfa, 0x79, 0xa4, 0xd2, 0xe4, 0xe7, 0x5f, 0x08, - 0xe7, 0x8e, 0xbf, 0x23, 0x5f, 0x38, 0x87, 0x53, 0x54, 0x7f, 0xb0, 0x6b, - 0xd1, 0xfb, 0xfa, 0x7f, 0xbb, 0x2e, 0x20, 0x3a, 0xf9, 0xae, 0x34, 0x27, - 0x5f, 0xfb, 0xae, 0xbf, 0x76, 0x3d, 0xfa, 0xce, 0xac, 0x3e, 0x29, 0x88, - 0xef, 0xfe, 0xcc, 0x55, 0x70, 0x9c, 0xe2, 0x36, 0x75, 0xff, 0x24, 0x93, - 0xbf, 0xad, 0x68, 0x75, 0x42, 0x66, 0x39, 0x09, 0x4e, 0x11, 0x79, 0x0e, - 0xf7, 0x51, 0x48, 0x65, 0x5d, 0x4e, 0x43, 0x22, 0xcc, 0x8f, 0x6d, 0x90, - 0xca, 0xe4, 0x35, 0xbb, 0x1a, 0x63, 0x99, 0x88, 0xde, 0xa3, 0x5f, 0xf4, - 0x74, 0x5b, 0x30, 0xb2, 0xfb, 0x1b, 0x25, 0xe6, 0x8d, 0xb2, 0xd5, 0x1d, - 0x74, 0x84, 0xeb, 0xfb, 0x9c, 0x80, 0xe2, 0xce, 0xbe, 0x9f, 0x91, 0x39, - 0xd7, 0x7d, 0x01, 0xd7, 0xba, 0x8b, 0x3a, 0xd3, 0x1d, 0x4e, 0x6b, 0x3f, - 0x1b, 0xbf, 0x38, 0xcf, 0xfe, 0x8e, 0xbf, 0xe8, 0x0f, 0x70, 0x3c, 0x76, - 0x1d, 0x48, 0x98, 0x9b, 0x96, 0x00, 0x8c, 0x51, 0x34, 0x43, 0xe2, 0x8b, - 0x74, 0xeb, 0xda, 0xfb, 0xa3, 0xaf, 0xb7, 0x9e, 0x15, 0x3a, 0xa7, 0x3d, - 0x20, 0x88, 0x7e, 0x3d, 0x77, 0xa0, 0xeb, 0xfd, 0xbf, 0x21, 0x24, 0xfa, - 0x3a, 0xfb, 0x06, 0x24, 0x75, 0x61, 0xe8, 0xac, 0xca, 0xff, 0x60, 0x35, - 0x9e, 0x4e, 0x1d, 0x7d, 0xff, 0xb3, 0x47, 0x5f, 0x47, 0x1c, 0x4e, 0xbf, - 0xcf, 0xc9, 0x01, 0x37, 0xd1, 0xd7, 0xda, 0xd4, 0x00, 0xea, 0x84, 0x73, - 0xe1, 0x0a, 0x18, 0xf4, 0x8b, 0xf1, 0xf6, 0xcc, 0xef, 0xe4, 0x11, 0xcd, - 0xae, 0x75, 0xe9, 0x7d, 0xf1, 0xd7, 0xd2, 0x07, 0xf2, 0x3a, 0xfb, 0x9f, - 0x60, 0x07, 0x54, 0x1e, 0x32, 0x11, 0xdf, 0xe4, 0x9d, 0xd6, 0x00, 0x41, - 0xd7, 0x20, 0x4e, 0xbf, 0xe4, 0x67, 0x72, 0x61, 0x80, 0x9d, 0x7d, 0x2f, - 0x67, 0xd3, 0xaf, 0x32, 0x00, 0x75, 0xee, 0x42, 0xce, 0xa7, 0x3d, 0x9f, - 0xc8, 0xdb, 0x1b, 0xbe, 0x9f, 0xee, 0x4c, 0x75, 0xe8, 0xe4, 0xe7, 0x54, - 0x1e, 0x0a, 0x12, 0xde, 0x81, 0x91, 0xd7, 0xde, 0x14, 0xd8, 0x3a, 0x82, - 0xa9, 0x53, 0x72, 0xb9, 0x99, 0x38, 0x40, 0xb3, 0x2e, 0x8a, 0x8c, 0x24, - 0x34, 0xe3, 0xe2, 0x0f, 0xc6, 0xaf, 0xf7, 0x5e, 0x5b, 0x1b, 0x1f, 0xce, - 0x75, 0xdd, 0xd9, 0x3a, 0xff, 0xd1, 0x9a, 0xf9, 0x08, 0x1f, 0xb2, 0x3a, - 0xfe, 0x46, 0xf5, 0x3e, 0x36, 0x75, 0x09, 0xf7, 0xf9, 0x02, 0xfd, 0x01, - 0xf6, 0x30, 0xeb, 0xee, 0xc0, 0xb0, 0xea, 0x91, 0xf3, 0xe8, 0x87, 0xc4, - 0xd7, 0xce, 0x2f, 0x31, 0xd7, 0xe4, 0xf0, 0xe4, 0x8e, 0xbe, 0x86, 0xe2, - 0x63, 0xae, 0xfa, 0xb3, 0xaf, 0xef, 0x0b, 0x83, 0x04, 0xeb, 0xf0, 0xb8, - 0x30, 0x4e, 0xb7, 0xff, 0x0f, 0x3b, 0xc5, 0x55, 0x3a, 0x3e, 0x15, 0x20, - 0x42, 0x5e, 0x91, 0x0b, 0x35, 0xfe, 0x86, 0xc3, 0xfb, 0xf2, 0x47, 0x5f, - 0xc9, 0xcd, 0xf5, 0x12, 0x3a, 0xdb, 0x4e, 0xae, 0x1f, 0x9f, 0x4d, 0x36, - 0x0b, 0x6f, 0x0a, 0x2a, 0x75, 0xf6, 0x05, 0x36, 0x9d, 0x74, 0x2f, 0x0d, - 0xeb, 0x8d, 0xdf, 0xf6, 0x36, 0xfb, 0xf6, 0x3e, 0x89, 0xd6, 0xd1, 0xd4, - 0x87, 0xe9, 0xc2, 0xa7, 0x3a, 0xb8, 0x10, 0x55, 0xcd, 0xb6, 0x55, 0x21, - 0xad, 0x6c, 0x56, 0xff, 0x3c, 0x87, 0x3d, 0xd4, 0x29, 0x43, 0x43, 0x79, - 0xf7, 0xd1, 0xd6, 0xd1, 0xd7, 0xdf, 0x7a, 0xfe, 0x3a, 0x82, 0x79, 0xfb, - 0x8e, 0x78, 0x42, 0xf4, 0x0c, 0xc7, 0x5c, 0x30, 0x75, 0xa6, 0x3a, 0xa6, - 0x3c, 0x0e, 0x0d, 0xb8, 0xa5, 0xff, 0xca, 0xa0, 0xb3, 0x50, 0xb7, 0xdf, - 0xc7, 0x5e, 0x06, 0x6c, 0x1d, 0x4a, 0x9f, 0x17, 0x11, 0x2f, 0x97, 0xaf, - 0xd6, 0x75, 0x95, 0x3a, 0xdb, 0x27, 0x5d, 0xc5, 0x4e, 0xa8, 0x3d, 0xe4, - 0x23, 0xfc, 0x47, 0xe8, 0x9d, 0xff, 0xf7, 0x72, 0x5a, 0x8f, 0x4b, 0x1a, - 0xdc, 0x40, 0x75, 0xff, 0xa4, 0x9e, 0xee, 0x6f, 0xef, 0xe0, 0xeb, 0xb3, - 0x47, 0x54, 0x1e, 0xa4, 0x8f, 0xeb, 0x48, 0xc5, 0xf4, 0x29, 0x2c, 0x03, - 0xaf, 0xc9, 0x0b, 0x85, 0x9d, 0x6c, 0x3a, 0x90, 0xfb, 0x1c, 0xa3, 0x42, - 0x1b, 0x24, 0xb5, 0x0a, 0xcb, 0x71, 0xc1, 0x21, 0x23, 0xd8, 0x40, 0xbc, - 0x6d, 0xd7, 0xb5, 0x13, 0x1d, 0x7f, 0x60, 0x73, 0x6a, 0x70, 0xea, 0x3a, - 0xcb, 0x3a, 0xbc, 0x5d, 0x6d, 0x0a, 0xbf, 0x01, 0x38, 0x8a, 0x9d, 0x73, - 0xaa, 0x75, 0x4c, 0x8c, 0x25, 0x8e, 0x75, 0x1c, 0x04, 0x42, 0x4f, 0x76, - 0x70, 0xeb, 0xbd, 0x07, 0x5f, 0xa3, 0xb9, 0xb5, 0xce, 0xa5, 0x9e, 0x8b, - 0x8a, 0x80, 0x56, 0xfe, 0x4f, 0x67, 0x5d, 0x53, 0xaf, 0xee, 0xfe, 0xf3, - 0xf5, 0x0e, 0xbc, 0xdb, 0x6d, 0x95, 0x7f, 0xc1, 0x89, 0xfe, 0xe7, 0x5f, - 0x72, 0x94, 0x2f, 0xee, 0xc9, 0xce, 0xbd, 0x28, 0x59, 0xd4, 0x14, 0x64, - 0xb1, 0x35, 0x12, 0xe6, 0x16, 0xbd, 0x0b, 0x43, 0xab, 0x0f, 0x5d, 0x87, - 0xb7, 0xc9, 0xcd, 0x80, 0x9d, 0x7e, 0xec, 0x6e, 0xed, 0x67, 0x5f, 0xff, - 0x47, 0xb4, 0x1c, 0xf2, 0x77, 0xfc, 0xdf, 0xc7, 0x57, 0x4f, 0xeb, 0xc5, - 0x56, 0xe1, 0xd7, 0xfb, 0x31, 0x9f, 0x76, 0xf7, 0x0e, 0xbf, 0xf2, 0x40, - 0xf8, 0x73, 0xd0, 0xd9, 0xd7, 0xbd, 0xcf, 0xce, 0xb6, 0x8e, 0xa1, 0x35, - 0xbf, 0x8e, 0xdf, 0xff, 0xb0, 0x31, 0x9b, 0xfd, 0xf2, 0x0f, 0xf2, 0xcd, - 0x1d, 0x72, 0xc0, 0x75, 0xce, 0x27, 0x57, 0x4d, 0x53, 0x8b, 0x5f, 0x96, - 0x9e, 0x03, 0x9d, 0x53, 0xaa, 0x54, 0xc8, 0x4f, 0x35, 0x91, 0x4c, 0x21, - 0xc3, 0x57, 0x68, 0x12, 0x1f, 0x42, 0x03, 0xf2, 0x0b, 0xee, 0xf9, 0x27, - 0x3a, 0xff, 0x31, 0x34, 0x39, 0xb5, 0xce, 0xbe, 0x89, 0xde, 0x47, 0x5f, - 0x7b, 0x5d, 0x43, 0xaf, 0xe1, 0x7f, 0x4f, 0x8d, 0x9d, 0x47, 0x50, 0x9b, - 0x7f, 0x16, 0xd4, 0x1f, 0xc6, 0x2c, 0x5f, 0xb2, 0x71, 0xcd, 0xce, 0xac, - 0x4c, 0xd3, 0x72, 0x2e, 0x19, 0x76, 0x13, 0x22, 0x41, 0x78, 0x51, 0xac, - 0xeb, 0xe0, 0xec, 0xba, 0xa7, 0x54, 0x1e, 0x16, 0x0e, 0xde, 0xec, 0x04, - 0xeb, 0xb9, 0xa3, 0xa8, 0xe4, 0x2d, 0xaf, 0xf4, 0x0c, 0x9d, 0x78, 0x13, - 0xaf, 0xbc, 0xb5, 0xf0, 0xeb, 0xff, 0x81, 0x02, 0xc7, 0xf0, 0x3e, 0x8c, - 0x8e, 0xbd, 0x24, 0xe9, 0xd7, 0xde, 0x1c, 0x91, 0xd7, 0xec, 0xfd, 0xa7, - 0xa7, 0x3a, 0xff, 0xf2, 0x6b, 0xb8, 0x11, 0xcd, 0xa3, 0x9a, 0x3a, 0xa4, - 0x9a, 0x22, 0xa6, 0x1b, 0x91, 0x4c, 0x89, 0xc1, 0xb1, 0x20, 0xf1, 0x5d, - 0x35, 0x4d, 0xc7, 0x43, 0x48, 0xaa, 0x23, 0x28, 0x9e, 0x14, 0xf2, 0x31, - 0x0c, 0x69, 0xb9, 0x2a, 0xa9, 0x58, 0x4a, 0x30, 0xef, 0x78, 0x77, 0xa4, - 0x64, 0xf3, 0x42, 0xf7, 0x90, 0xe3, 0x5b, 0xdf, 0x65, 0xde, 0xbc, 0x63, - 0x40, 0x84, 0xdb, 0x4c, 0xb8, 0x63, 0x4c, 0xd4, 0xa7, 0x5f, 0x47, 0x83, - 0xb6, 0x12, 0x2d, 0x90, 0x6c, 0x98, 0xfd, 0x8d, 0x72, 0xff, 0x94, 0xf2, - 0x66, 0xc6, 0xbf, 0x83, 0xaf, 0xff, 0xfb, 0xf8, 0x53, 0xda, 0x4e, 0xba, - 0x7b, 0x38, 0x05, 0xbc, 0x8e, 0xa5, 0x15, 0x35, 0xcf, 0x1e, 0x48, 0x4f, - 0x2f, 0xdc, 0x63, 0xbb, 0x0d, 0x15, 0xbd, 0xff, 0x9e, 0x4a, 0x67, 0x18, - 0xee, 0xc3, 0x44, 0xe1, 0x65, 0x30, 0xff, 0x56, 0x67, 0x73, 0x48, 0x27, - 0x5b, 0xa7, 0x5b, 0x47, 0x57, 0xe6, 0x83, 0x64, 0x42, 0xf9, 0x8e, 0xec, - 0x34, 0x5a, 0x37, 0xff, 0xb0, 0x3d, 0x75, 0x66, 0x99, 0x35, 0xfa, 0xce, - 0xae, 0x1f, 0xd7, 0x4b, 0x6f, 0x98, 0xe2, 0x03, 0xaf, 0xfa, 0x6c, 0x6b, - 0xd7, 0x38, 0xfe, 0x3a, 0xfe, 0x87, 0x1f, 0xc3, 0x87, 0x5f, 0xfc, 0x39, - 0xb7, 0x59, 0xdc, 0x1f, 0xa1, 0x3a, 0xff, 0x67, 0x01, 0x93, 0x7d, 0xd1, - 0xd6, 0x54, 0xeb, 0xfe, 0xc8, 0x9f, 0x26, 0xe2, 0x68, 0xea, 0x43, 0xc9, - 0x98, 0x46, 0xff, 0xfd, 0x3c, 0x7a, 0x03, 0xc8, 0xeb, 0xe8, 0x70, 0x07, - 0x5f, 0xfa, 0x37, 0x76, 0xbe, 0x8b, 0xb5, 0xce, 0x75, 0xff, 0xa3, 0x80, - 0xc4, 0xce, 0x7b, 0xf3, 0xaa, 0x11, 0xa9, 0xd5, 0x3d, 0x22, 0x5b, 0x02, - 0x9f, 0x42, 0x22, 0xcc, 0xfd, 0xa8, 0x7b, 0x5f, 0xee, 0xf7, 0xf5, 0x57, - 0x1a, 0x3a, 0xff, 0xfc, 0x9a, 0x1c, 0xda, 0xfe, 0x1c, 0xd7, 0x5e, 0x63, - 0xaf, 0xd1, 0xed, 0x7d, 0xe9, 0xd5, 0x88, 0xb2, 0x98, 0xd4, 0x55, 0x2f, - 0xb0, 0x0f, 0xd3, 0xae, 0xee, 0x8e, 0xb2, 0x8d, 0x05, 0xcc, 0x96, 0xac, - 0xeb, 0x21, 0x3e, 0xc2, 0x29, 0x88, 0x16, 0x79, 0xd9, 0x42, 0x7e, 0x87, - 0xd6, 0xc9, 0x7f, 0xd2, 0x0b, 0xff, 0xff, 0x76, 0x00, 0xb7, 0x97, 0xcf, - 0x77, 0x17, 0x8c, 0x8e, 0xc2, 0xce, 0xbf, 0x92, 0x7f, 0x8e, 0x20, 0x3a, - 0xf9, 0x8e, 0xec, 0x34, 0x5b, 0x57, 0xff, 0xf4, 0x3f, 0xa3, 0xb1, 0xa4, - 0x49, 0x27, 0x30, 0x27, 0x5f, 0xdd, 0x85, 0xc2, 0x04, 0xea, 0x44, 0xd2, - 0x26, 0x6c, 0xe1, 0x76, 0x8b, 0x7c, 0xad, 0x7f, 0xee, 0xa0, 0x5e, 0x41, - 0xea, 0x2c, 0xeb, 0xfe, 0xcc, 0x66, 0xcf, 0xfd, 0x4e, 0x1d, 0x7d, 0x1b, - 0x71, 0x0e, 0xbb, 0xc0, 0x3a, 0xff, 0xa2, 0x51, 0xc9, 0xe3, 0x93, 0x9d, - 0x7f, 0xfe, 0xfc, 0x53, 0x6a, 0x7b, 0xb1, 0xed, 0x46, 0xd8, 0x3a, 0xe7, - 0x09, 0xd7, 0xfd, 0x1c, 0xf9, 0xa8, 0xeb, 0xa1, 0xd7, 0xfb, 0xa8, 0xf2, - 0xf2, 0x4e, 0x75, 0xf8, 0x31, 0x82, 0x87, 0x56, 0x2a, 0x2d, 0x62, 0x5c, - 0xc7, 0xbc, 0x3b, 0x59, 0x08, 0x8b, 0x68, 0xe7, 0xca, 0xed, 0x8a, 0xec, - 0x9c, 0x7d, 0x32, 0xbf, 0x95, 0x7e, 0x07, 0xf1, 0x3a, 0xfe, 0x1d, 0x94, - 0xe6, 0x2a, 0x75, 0xf9, 0x27, 0x5c, 0x30, 0xeb, 0xf3, 0xef, 0x2f, 0xba, - 0x3a, 0xff, 0xc9, 0x36, 0xb6, 0xb8, 0xcf, 0xf8, 0x4e, 0xb2, 0x8a, 0xa3, - 0xc0, 0x4b, 0xbc, 0x5f, 0xb4, 0x9f, 0xe9, 0x55, 0x28, 0x9f, 0x20, 0x23, - 0x8f, 0xb9, 0x7d, 0x3a, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x72, 0xdf, 0xce, - 0x1e, 0xc0, 0xce, 0x75, 0x94, 0x09, 0xfa, 0xe0, 0xb7, 0x4c, 0xef, 0xdc, - 0x63, 0xbb, 0x0d, 0x17, 0x6d, 0xff, 0x24, 0xa4, 0x82, 0x08, 0x91, 0xd7, - 0xc9, 0xc7, 0x01, 0xd6, 0x53, 0x11, 0x12, 0xe6, 0x7a, 0x36, 0xa8, 0x77, - 0xc6, 0x73, 0x94, 0xca, 0x7e, 0xe8, 0x31, 0xc3, 0xab, 0x4b, 0x37, 0x4a, - 0xf1, 0x29, 0xae, 0x16, 0xfd, 0x9c, 0xf1, 0x19, 0xe0, 0xdd, 0x42, 0x83, - 0xd0, 0xbe, 0xbf, 0xca, 0x67, 0x18, 0xee, 0xc3, 0x45, 0x4f, 0x7e, 0x15, - 0x39, 0xad, 0x1d, 0x74, 0xeb, 0x3a, 0xfd, 0xba, 0xdd, 0xc4, 0xea, 0x09, - 0xbd, 0xfc, 0x5e, 0xde, 0x3a, 0xff, 0xa1, 0xe7, 0xf9, 0xbe, 0xa0, 0x27, - 0x52, 0x1e, 0x58, 0x88, 0x5f, 0x31, 0xdd, 0x86, 0x8a, 0xe6, 0xff, 0x29, - 0x9c, 0x63, 0xbb, 0x0d, 0x16, 0x75, 0xe7, 0x79, 0x1d, 0x7f, 0x26, 0xb0, - 0x5d, 0xb3, 0xab, 0x88, 0xb1, 0xe9, 0x68, 0x9f, 0xf8, 0x6a, 0xff, 0xf7, - 0xa3, 0x5f, 0x3f, 0xd7, 0xa2, 0x69, 0x90, 0xeb, 0xf9, 0x17, 0x3f, 0xfc, - 0x91, 0xd7, 0xf3, 0xaf, 0x26, 0x70, 0x1d, 0x7f, 0xa3, 0xbf, 0x16, 0xd5, - 0xb4, 0x3c, 0x75, 0x62, 0x39, 0xfa, 0x9c, 0x25, 0xfb, 0x4b, 0x2f, 0xdc, - 0xcf, 0x22, 0xce, 0xbe, 0x71, 0x80, 0x9d, 0x7e, 0x9a, 0x17, 0x1f, 0x4e, - 0xba, 0x4b, 0x3a, 0xb0, 0xdf, 0x89, 0x4d, 0xff, 0xee, 0xa7, 0xce, 0xba, - 0x7a, 0x30, 0x28, 0x75, 0xfb, 0x8c, 0x77, 0x61, 0xa2, 0x42, 0xbf, 0xf6, - 0x2f, 0x1f, 0x93, 0xfc, 0xdd, 0x67, 0x5f, 0xf2, 0x6f, 0xaf, 0x0c, 0x2f, - 0x47, 0x59, 0x49, 0x23, 0xd3, 0x12, 0x3a, 0x66, 0x04, 0x1b, 0x93, 0xa7, - 0x5f, 0xf9, 0xfe, 0xcc, 0x29, 0xe1, 0x80, 0x1d, 0x52, 0x44, 0xb6, 0xe8, - 0x7e, 0x15, 0xbf, 0xfb, 0xa8, 0xbc, 0xd7, 0xcd, 0xe5, 0x9e, 0x3a, 0xfa, - 0x5d, 0xfb, 0xa3, 0xaa, 0x0f, 0xab, 0x11, 0xaf, 0x9a, 0xbe, 0xc2, 0xce, - 0xbf, 0xbb, 0xad, 0x67, 0x27, 0x3a, 0xe8, 0x6c, 0xea, 0xc3, 0xc4, 0x42, - 0xeb, 0xcb, 0xdb, 0x23, 0xaf, 0xff, 0x76, 0x00, 0xb7, 0x96, 0xbd, 0x98, - 0xb3, 0xac, 0xa4, 0xeb, 0xce, 0xc1, 0x6d, 0xc8, 0x68, 0xa4, 0x64, 0x7c, - 0x3d, 0x59, 0x37, 0x57, 0x9e, 0x3a, 0x91, 0x84, 0xde, 0x88, 0x3c, 0xd5, - 0xf9, 0x07, 0xd1, 0xeb, 0xff, 0xd9, 0xba, 0x81, 0xfd, 0xf9, 0x2e, 0xb6, - 0xe7, 0x5f, 0xfc, 0xa7, 0x5f, 0x43, 0x9e, 0xf4, 0x00, 0xeb, 0xff, 0xca, - 0x2d, 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x4f, 0x94, 0xc6, 0x46, 0x9a, - 0x1f, 0xb5, 0xcf, 0x6d, 0xf2, 0x1a, 0x4b, 0x4d, 0xea, 0x1d, 0xc9, 0xb9, - 0xd7, 0xff, 0xd2, 0x9d, 0xa2, 0x86, 0xae, 0x76, 0x73, 0xe7, 0xce, 0xec, - 0x9d, 0x52, 0x3f, 0xa0, 0x0b, 0x5f, 0xfe, 0x19, 0xfb, 0x09, 0xed, 0x20, - 0xef, 0x23, 0xaf, 0xef, 0xf8, 0x04, 0xec, 0x1d, 0x7e, 0xce, 0x66, 0x4c, - 0x75, 0x94, 0xea, 0x2f, 0x9c, 0x8b, 0x49, 0x3f, 0x4b, 0x6f, 0xdc, 0x63, - 0xbb, 0x0d, 0x15, 0x95, 0xff, 0x9e, 0x4a, 0x67, 0x18, 0xee, 0xc3, 0x44, - 0xdd, 0x65, 0x30, 0xff, 0x56, 0x67, 0x4c, 0x47, 0x52, 0x43, 0x0a, 0xf9, - 0x8e, 0xec, 0x34, 0x4a, 0xd7, 0xff, 0xdc, 0x9c, 0x63, 0x8e, 0x11, 0x7e, - 0x46, 0xd3, 0xab, 0x87, 0xf9, 0xf9, 0x6d, 0xf8, 0x60, 0x2f, 0xd3, 0xaf, - 0xf4, 0x20, 0xc4, 0xa3, 0x60, 0xeb, 0xf2, 0x8b, 0x79, 0x29, 0x87, 0xf4, - 0x84, 0x7a, 0x25, 0xbf, 0xf7, 0xb1, 0x4c, 0xe2, 0x4e, 0xeb, 0x3a, 0xff, - 0xf3, 0x50, 0xd5, 0x34, 0x35, 0x8f, 0x24, 0xce, 0x61, 0xd7, 0xfe, 0x4d, - 0x7e, 0xb1, 0x4d, 0xbf, 0xb9, 0xd7, 0xf4, 0x0b, 0xb1, 0xda, 0xce, 0xa9, - 0x1f, 0x6a, 0xd0, 0x2e, 0x0f, 0x0e, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x4b, - 0x97, 0xfc, 0x8f, 0x2f, 0x0c, 0x2f, 0x47, 0x5f, 0xa5, 0xb2, 0x9d, 0x73, - 0xaf, 0x46, 0xcc, 0x1d, 0x79, 0x06, 0x0e, 0xa9, 0x1e, 0xf8, 0x4a, 0x76, - 0x8e, 0xdf, 0xff, 0x9f, 0xc9, 0xfc, 0x85, 0x25, 0x1e, 0x1f, 0xe4, 0x75, - 0xfd, 0x2e, 0xe0, 0xe3, 0x0e, 0xbd, 0x2e, 0xf8, 0xeb, 0xbb, 0x08, 0x78, - 0xfd, 0x2b, 0xbf, 0xf8, 0x50, 0x1a, 0xe4, 0x24, 0x9f, 0x47, 0x56, 0x1f, - 0x6a, 0x16, 0x5f, 0xdc, 0x45, 0x8b, 0xc8, 0xeb, 0xcf, 0x25, 0x1a, 0x9a, - 0xb4, 0x68, 0x86, 0x14, 0x88, 0xb0, 0x5b, 0xa6, 0x6f, 0x09, 0x5d, 0x18, - 0xfa, 0x30, 0x8f, 0xc8, 0x2f, 0xfd, 0xfa, 0xd4, 0xd4, 0x0f, 0xb3, 0x87, - 0x5f, 0xf0, 0x71, 0x48, 0xe2, 0x77, 0xf3, 0xac, 0xa2, 0x2e, 0x51, 0x2e, - 0x5c, 0x26, 0xa1, 0x4d, 0xf9, 0xfd, 0xff, 0xca, 0x3c, 0x94, 0xce, 0x31, - 0xdd, 0x86, 0x88, 0xee, 0xff, 0xbd, 0xdc, 0x92, 0x8e, 0x3a, 0x3a, 0xfe, - 0x69, 0x0c, 0x33, 0x04, 0xeb, 0xbf, 0xe9, 0xd7, 0xf3, 0x40, 0x73, 0xaf, - 0xe3, 0xaf, 0xff, 0xef, 0x49, 0x03, 0xd4, 0xdb, 0xf3, 0x03, 0xc4, 0xfd, - 0x87, 0x5f, 0xec, 0x6f, 0x50, 0x3e, 0xd1, 0xd7, 0xf0, 0x07, 0x37, 0xf6, - 0x1d, 0x7e, 0x75, 0x7b, 0x80, 0x3a, 0xfe, 0x10, 0x3f, 0x1f, 0xe9, 0xd5, - 0x08, 0x80, 0xe1, 0x63, 0x93, 0xdf, 0xf9, 0x39, 0xf3, 0x43, 0x8b, 0x86, - 0x1d, 0x7f, 0xe8, 0x1f, 0xfc, 0x8f, 0xb5, 0xe4, 0x75, 0xff, 0x87, 0xf9, - 0x7c, 0xc4, 0x18, 0x59, 0xd7, 0xcc, 0x77, 0x61, 0xa2, 0xa1, 0xbf, 0xec, - 0xee, 0x0b, 0xf3, 0x88, 0x75, 0x2a, 0x98, 0xe3, 0x0f, 0x90, 0xfb, 0x87, - 0xda, 0x2d, 0xbc, 0xd6, 0xf0, 0x75, 0xd2, 0xc3, 0xaf, 0xfa, 0x5e, 0x4e, - 0x3b, 0x10, 0x4e, 0xbe, 0x90, 0x35, 0x87, 0x5f, 0xfe, 0x75, 0xe7, 0x07, - 0x13, 0x6a, 0x71, 0xce, 0xbf, 0xfb, 0xa3, 0x93, 0x7b, 0xb9, 0xc4, 0xd1, - 0xd7, 0xed, 0xc5, 0x16, 0x87, 0x5f, 0xa1, 0xa5, 0x3e, 0x36, 0x75, 0x42, - 0x37, 0x31, 0x1d, 0x10, 0xf8, 0x4d, 0x7f, 0xa3, 0xcf, 0xdf, 0x81, 0x83, - 0xaf, 0xfd, 0x9e, 0xd7, 0x32, 0x6e, 0xa2, 0xa7, 0x5f, 0xf8, 0x71, 0x5c, - 0x5a, 0x6c, 0xc2, 0xce, 0xbf, 0xef, 0x8e, 0x39, 0xb1, 0xf3, 0xbf, 0x9d, - 0x48, 0x8b, 0xd7, 0x3f, 0xfc, 0xfe, 0xff, 0x4a, 0x39, 0x3c, 0x72, 0x73, - 0xaf, 0xfd, 0xac, 0x1f, 0x6b, 0x24, 0x9d, 0x3a, 0xfe, 0xd6, 0x6d, 0x18, - 0xdc, 0xea, 0xd1, 0xf5, 0x78, 0xf2, 0xff, 0xfa, 0x01, 0x83, 0xf1, 0xfd, - 0xf3, 0xb8, 0x07, 0x3a, 0xe1, 0x9c, 0xea, 0x84, 0xc9, 0xb2, 0x13, 0xc8, - 0x44, 0x2a, 0x17, 0xf6, 0xd7, 0x5f, 0x5b, 0x73, 0xaf, 0xff, 0xf2, 0x47, - 0x9f, 0xaa, 0x6b, 0xb8, 0x3e, 0xf8, 0x09, 0x68, 0xea, 0x44, 0x48, 0x89, - 0x7d, 0xed, 0x7f, 0xc3, 0xab, 0x0d, 0xf2, 0x10, 0xdf, 0x77, 0xd9, 0x39, - 0xd7, 0xec, 0x9d, 0xc7, 0x69, 0xd7, 0xff, 0xff, 0xfa, 0x25, 0xf3, 0xdd, - 0x48, 0xd7, 0xcc, 0xfd, 0x91, 0xb7, 0xe6, 0x73, 0x99, 0xb7, 0xf7, 0xe9, - 0xd7, 0xdd, 0x17, 0xd8, 0x3a, 0xb1, 0x30, 0x51, 0x22, 0xd1, 0x47, 0xa1, - 0x31, 0x7f, 0xff, 0xdf, 0xbb, 0x5a, 0x4f, 0xd7, 0x4f, 0x47, 0x53, 0xda, - 0xc0, 0x9d, 0x65, 0x1a, 0x0c, 0x9d, 0x96, 0xac, 0xb9, 0xa4, 0x2f, 0x05, - 0xf3, 0xaf, 0x86, 0x16, 0x59, 0x1a, 0x52, 0xa9, 0x6c, 0x1d, 0xdc, 0x55, - 0x0d, 0xb9, 0x0f, 0xd5, 0x9d, 0x76, 0x1e, 0x03, 0x1a, 0xae, 0xa3, 0x0e, - 0xf4, 0x64, 0x9b, 0x28, 0x37, 0xcc, 0x77, 0x61, 0xa2, 0xa8, 0xbf, 0xdc, - 0x8d, 0xbb, 0xcb, 0x3c, 0x75, 0x70, 0xf8, 0xbf, 0x2d, 0xbf, 0xf3, 0xc9, - 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0x9a, 0xef, 0xa3, 0x91, 0xe3, 0xae, 0x7f, - 0x1d, 0x41, 0x36, 0xab, 0x20, 0xb2, 0x98, 0x8c, 0x35, 0x91, 0xbb, 0xfd, - 0xfb, 0x8c, 0x77, 0x61, 0xa2, 0xac, 0xbf, 0xe8, 0x94, 0x72, 0x78, 0xe4, - 0xe7, 0x59, 0x4c, 0x3e, 0xc1, 0x33, 0xbf, 0xee, 0xc6, 0xfe, 0x8e, 0xbb, - 0x59, 0xd7, 0xff, 0x03, 0x05, 0x49, 0x03, 0x53, 0xb8, 0x9d, 0x4a, 0x1f, - 0xfc, 0x1d, 0xdf, 0xfc, 0xa3, 0xc9, 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0x91, - 0x2f, 0xdc, 0x63, 0xbb, 0x0d, 0x16, 0x95, 0xff, 0x9e, 0x4a, 0x67, 0x18, - 0xee, 0xc3, 0x44, 0xfb, 0x65, 0x30, 0xff, 0x56, 0x67, 0x7f, 0xf9, 0x45, - 0xbc, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x8a, 0x12, 0xff, 0xec, 0x6d, 0x4f, - 0x2a, 0xfa, 0x4f, 0x41, 0xd7, 0xef, 0x7e, 0xc7, 0xd1, 0xd7, 0xc9, 0x3c, - 0x70, 0xea, 0x59, 0xe4, 0xf4, 0xa2, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x47, - 0xdf, 0xf4, 0x4a, 0x39, 0x3c, 0x72, 0x73, 0xaf, 0xff, 0xff, 0xf7, 0xd4, - 0xe4, 0xd1, 0xde, 0x67, 0x5f, 0xee, 0xb1, 0x57, 0x10, 0x40, 0xc4, 0xdd, - 0x83, 0xaf, 0xcf, 0xa4, 0xf4, 0x1d, 0x7f, 0xd1, 0x34, 0x0c, 0x4d, 0xd8, - 0x3a, 0xa1, 0x1d, 0x8a, 0xc2, 0x40, 0x49, 0x6f, 0xff, 0xec, 0x0f, 0x63, - 0xea, 0x9e, 0x17, 0x06, 0xb5, 0x00, 0x2a, 0xf3, 0xc9, 0x48, 0x54, 0x15, - 0x84, 0x42, 0x67, 0xe8, 0xc9, 0x76, 0x4d, 0x2f, 0xfe, 0xce, 0xa9, 0xe5, - 0x5f, 0x49, 0xe8, 0x3a, 0xca, 0x4e, 0xad, 0x01, 0x72, 0xa6, 0x3c, 0xc9, - 0x50, 0xdc, 0x19, 0xcf, 0x39, 0xdd, 0x25, 0x3c, 0x51, 0x56, 0x94, 0x22, - 0xc9, 0x4b, 0x3b, 0xc2, 0x85, 0x21, 0x4d, 0x31, 0x17, 0x61, 0x9c, 0x02, - 0x8f, 0x4b, 0x97, 0xbf, 0xca, 0x67, 0x18, 0xee, 0xc3, 0x44, 0x45, 0x7f, - 0x67, 0x18, 0xee, 0xc3, 0x44, 0x57, 0x7f, 0xcd, 0x6a, 0x67, 0x18, 0xee, - 0xc3, 0x45, 0x71, 0x4a, 0x22, 0x01, 0xce, 0x2f, 0xff, 0x02, 0x05, 0x8a, - 0x3f, 0x81, 0xf4, 0x64, 0x75, 0xf2, 0x93, 0xcc, 0xd6, 0x75, 0x93, 0x73, - 0xf3, 0x02, 0x5d, 0xf6, 0x75, 0xfc, 0x75, 0xfe, 0xc4, 0xe0, 0x01, 0xfe, - 0x8e, 0xb3, 0x40, 0x4f, 0x4f, 0x44, 0x17, 0xff, 0xf7, 0xb4, 0x9d, 0x74, - 0x92, 0x0f, 0xbf, 0xef, 0x30, 0xeb, 0xf7, 0x18, 0xee, 0xc3, 0x45, 0x3d, - 0x7f, 0x96, 0x81, 0xfd, 0xf9, 0x23, 0xae, 0x5a, 0x1d, 0x50, 0x79, 0x0c, - 0x33, 0xbf, 0xff, 0xd2, 0x8f, 0x6b, 0xf5, 0xb1, 0x01, 0x19, 0xd4, 0xfd, - 0x87, 0x5f, 0xff, 0xdc, 0xe7, 0xfc, 0xe4, 0x0e, 0x2a, 0x9d, 0xee, 0x7d, - 0x3a, 0xff, 0xe4, 0x96, 0x08, 0x21, 0x69, 0xc9, 0x1d, 0x7f, 0xa5, 0x1c, - 0x9e, 0x39, 0x39, 0xd7, 0xdf, 0x05, 0xe4, 0x75, 0xf9, 0xf3, 0xa8, 0xb3, - 0xab, 0x47, 0x8f, 0xb4, 0x8a, 0xa1, 0x13, 0xf8, 0xf7, 0x7f, 0xe4, 0x18, - 0x5c, 0x48, 0x71, 0x67, 0x5f, 0xf4, 0x0b, 0x33, 0x6e, 0x7b, 0x47, 0x5f, - 0x9e, 0x78, 0xe7, 0xe7, 0x53, 0x49, 0x5b, 0xcc, 0x15, 0xe2, 0xcb, 0x1e, - 0xf7, 0x21, 0x46, 0x17, 0x5d, 0x18, 0x70, 0x68, 0x87, 0x69, 0xd6, 0xc9, - 0xc5, 0xff, 0xe7, 0x92, 0x81, 0x17, 0x6f, 0x5a, 0x80, 0x1d, 0x7f, 0xf8, - 0x00, 0xff, 0x4a, 0x7d, 0x17, 0x58, 0xc1, 0xd7, 0xff, 0x0e, 0x01, 0xc4, - 0x0a, 0x2d, 0x16, 0x75, 0x71, 0x11, 0xde, 0x4c, 0xbf, 0xff, 0xc8, 0x20, - 0x1c, 0xf7, 0x71, 0x4e, 0xbf, 0x7a, 0x93, 0x1d, 0x4a, 0x27, 0xfc, 0x18, - 0x52, 0x24, 0x36, 0x34, 0x47, 0x6c, 0x3a, 0xfc, 0x31, 0xfb, 0x4f, 0x47, - 0x5f, 0xca, 0xf1, 0xc2, 0xe2, 0x75, 0x04, 0xf9, 0xb0, 0x3d, 0xca, 0xef, - 0xfe, 0x40, 0xf1, 0xf7, 0x53, 0x9c, 0x89, 0xce, 0xa5, 0x0f, 0xcf, 0xa5, - 0xb7, 0x06, 0x0e, 0xbf, 0xff, 0x76, 0x39, 0x92, 0x47, 0xf6, 0x05, 0x3f, - 0x61, 0x57, 0xe8, 0x90, 0x3f, 0x91, 0xd7, 0xcc, 0x77, 0x61, 0xa2, 0xb3, - 0xa9, 0x8f, 0x57, 0x85, 0x17, 0xde, 0x45, 0xe8, 0xeb, 0xca, 0xe9, 0x53, - 0xaf, 0xe9, 0xd7, 0x03, 0x2d, 0x1d, 0x7d, 0xed, 0x7d, 0xd1, 0xd6, 0x73, - 0xab, 0x0d, 0x9e, 0x89, 0x2f, 0x44, 0xe8, 0x75, 0xfb, 0xc0, 0xfa, 0x32, - 0x3a, 0xff, 0xfa, 0x17, 0xec, 0xc1, 0xf6, 0xbb, 0x80, 0x73, 0xaf, 0x7e, - 0xfa, 0x3a, 0xff, 0xb2, 0x49, 0xfb, 0x5b, 0x56, 0x05, 0x9d, 0x64, 0x3a, - 0xfe, 0xee, 0x08, 0xbf, 0x8e, 0xd1, 0x3e, 0xfd, 0x93, 0x4f, 0xf8, 0x0e, - 0xbf, 0xbd, 0x1c, 0x04, 0x4c, 0x75, 0x94, 0x85, 0x65, 0x41, 0x15, 0xc8, - 0x54, 0x6e, 0x46, 0x84, 0x3c, 0x1e, 0x5b, 0x07, 0x48, 0x1c, 0x6c, 0x05, - 0x22, 0x99, 0xa1, 0xcf, 0x28, 0x7d, 0x38, 0xd8, 0x2a, 0xbf, 0xf7, 0x53, - 0xcf, 0xc9, 0xe1, 0x02, 0x75, 0xff, 0xbd, 0xfa, 0xf1, 0x9c, 0xdd, 0xdb, - 0x3a, 0xff, 0x72, 0x15, 0xc1, 0x45, 0x4e, 0xbf, 0xfd, 0x0d, 0xfd, 0x58, - 0xe6, 0xfe, 0x8c, 0x6c, 0xeb, 0xf7, 0x90, 0x71, 0x67, 0x5f, 0x49, 0xc5, - 0x4c, 0x4c, 0x87, 0x73, 0xde, 0x20, 0xfd, 0x32, 0xd8, 0x4c, 0xbf, 0xf3, - 0xc9, 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0x91, 0x6f, 0xff, 0xde, 0xee, 0x0a, - 0x9e, 0x77, 0xdf, 0x4a, 0xaa, 0xe7, 0x5f, 0xf9, 0xfc, 0xa4, 0x27, 0x13, - 0xdf, 0x9d, 0x4a, 0x23, 0x7e, 0x12, 0x9d, 0x5e, 0xfe, 0xce, 0x31, 0xdd, - 0x86, 0x8b, 0x26, 0xff, 0xf7, 0xb5, 0xf7, 0x4a, 0x64, 0xe8, 0x32, 0xd1, - 0xd4, 0xa2, 0x21, 0x70, 0xe2, 0xfe, 0xea, 0x72, 0x25, 0xa3, 0xaf, 0xe5, - 0xf9, 0x3a, 0xeb, 0x3a, 0xff, 0xf2, 0x7b, 0xb9, 0xec, 0x18, 0xf4, 0x04, - 0xea, 0x83, 0xf2, 0x72, 0xcb, 0xfe, 0x74, 0xf7, 0xfc, 0x7d, 0x28, 0xc4, - 0x5f, 0x76, 0x13, 0xd7, 0xf6, 0x71, 0x8e, 0xec, 0x34, 0x5b, 0x17, 0xff, - 0xf3, 0x43, 0xbf, 0x07, 0x39, 0xed, 0x76, 0x6f, 0x9f, 0x3b, 0xb2, 0x75, - 0xee, 0x7f, 0xd3, 0xae, 0xf2, 0x90, 0x88, 0x7e, 0x35, 0x52, 0x88, 0xee, - 0x48, 0x5f, 0xde, 0xcd, 0x61, 0xd7, 0xcc, 0x77, 0x61, 0xa2, 0xdb, 0xbe, - 0xd4, 0xef, 0xc3, 0xab, 0x87, 0x9f, 0xe2, 0xdb, 0xf9, 0x3b, 0xe4, 0x07, - 0xe7, 0x5f, 0xf4, 0x4a, 0x39, 0x3c, 0x72, 0x73, 0xac, 0xa4, 0x91, 0xe3, - 0x8d, 0x33, 0x11, 0x09, 0x6d, 0xff, 0xec, 0x10, 0x28, 0xb7, 0x0e, 0x60, - 0xaa, 0x75, 0xe6, 0x97, 0x42, 0x75, 0xe9, 0xfa, 0x87, 0x5f, 0xf9, 0xa4, - 0xd2, 0x68, 0xfe, 0xee, 0x0c, 0x00, 0xeb, 0xfa, 0x06, 0x41, 0xfd, 0x67, - 0x5f, 0xf6, 0x73, 0x91, 0x27, 0xdd, 0xb3, 0xaf, 0x98, 0xee, 0xc3, 0x45, - 0xe1, 0x7f, 0xe7, 0xf4, 0x6d, 0xe7, 0x33, 0x7d, 0x1d, 0x5c, 0x3e, 0xd1, - 0x2d, 0xbe, 0xf6, 0xce, 0x74, 0xeb, 0xf2, 0xe0, 0x64, 0xe7, 0x5f, 0xd0, - 0x3e, 0xda, 0xec, 0x3a, 0xfe, 0x94, 0x6d, 0x8e, 0x6e, 0x75, 0x48, 0xf7, - 0x30, 0xb6, 0xff, 0x47, 0x9f, 0xbf, 0x03, 0x07, 0x5f, 0xfb, 0xea, 0xf7, - 0x97, 0xb0, 0x7d, 0xa3, 0xae, 0xc5, 0x4e, 0xa8, 0x3d, 0x7c, 0x41, 0xbe, - 0x49, 0xf1, 0x67, 0x5f, 0xb0, 0x41, 0xb1, 0x07, 0x5f, 0xa3, 0xef, 0xef, - 0xa3, 0xaf, 0xfe, 0x5c, 0x33, 0xe6, 0x0f, 0xf2, 0xcd, 0x1d, 0x7f, 0xff, - 0xe7, 0x4f, 0x3a, 0xdc, 0x40, 0xce, 0xa7, 0x25, 0xf6, 0x58, 0x27, 0x5f, - 0xd1, 0xbe, 0xf2, 0x7d, 0xce, 0xac, 0x46, 0xf7, 0x51, 0x7f, 0x6a, 0xbf, - 0xfb, 0x3b, 0xd7, 0x92, 0xd2, 0x39, 0x23, 0xae, 0x80, 0x1d, 0x52, 0x3d, - 0x7f, 0x21, 0x53, 0x41, 0x73, 0x91, 0xa4, 0x40, 0xd4, 0xc7, 0x27, 0x4b, - 0x09, 0x6e, 0x42, 0x9b, 0x72, 0x14, 0x24, 0x9a, 0x10, 0x2b, 0x21, 0xec, - 0x22, 0x9c, 0x80, 0x04, 0x22, 0x51, 0xa8, 0xc1, 0xfd, 0x08, 0x7b, 0xfd, - 0xba, 0x98, 0x07, 0xe6, 0x8e, 0xbf, 0xc0, 0x52, 0x69, 0x40, 0xf8, 0xea, - 0x51, 0x36, 0xb8, 0x8c, 0x0f, 0x86, 0x97, 0x93, 0x37, 0x3a, 0xf9, 0x8e, - 0xec, 0x34, 0x5e, 0x97, 0xfe, 0x4f, 0x74, 0x5e, 0x40, 0x70, 0x1d, 0x5c, - 0x3e, 0x95, 0x96, 0xde, 0x5a, 0x78, 0xeb, 0xfe, 0x7f, 0x4a, 0x15, 0xf2, - 0x4e, 0x75, 0x2c, 0xf5, 0x04, 0x6e, 0xfd, 0x8b, 0xeb, 0x84, 0xea, 0x0a, - 0x68, 0x39, 0x08, 0x4f, 0xae, 0xdb, 0x04, 0x37, 0xff, 0xfb, 0x6e, 0x0a, - 0x81, 0xc0, 0xf7, 0x16, 0xb7, 0x96, 0x09, 0xd7, 0xf9, 0x4f, 0x64, 0xd2, - 0x70, 0x9d, 0x48, 0x89, 0x4e, 0xb0, 0x52, 0x88, 0xfd, 0xc8, 0x6d, 0xd4, - 0x37, 0x8c, 0x33, 0xc2, 0xfe, 0x50, 0x96, 0xc9, 0xdf, 0x26, 0x46, 0x42, - 0x92, 0xd3, 0x66, 0x8f, 0xf3, 0x91, 0xa3, 0x2e, 0x16, 0x9d, 0x87, 0x08, - 0x23, 0x45, 0x18, 0xc6, 0x74, 0x87, 0xfc, 0xf4, 0xbb, 0x72, 0x9d, 0x6e, - 0xff, 0xa7, 0x5f, 0xfd, 0xfc, 0x4c, 0x39, 0xb5, 0xd6, 0xb4, 0x3a, 0xfb, - 0x3a, 0xfe, 0x3a, 0xff, 0x62, 0x70, 0x00, 0xff, 0x47, 0x59, 0xa0, 0xaa, - 0x26, 0x05, 0x17, 0x44, 0x17, 0xde, 0x8d, 0xe7, 0x3a, 0xff, 0xbd, 0xac, - 0xde, 0x5d, 0xfd, 0x53, 0xa9, 0x0f, 0x7c, 0x48, 0xef, 0xa3, 0x6c, 0x48, - 0xeb, 0xfd, 0xfb, 0xf2, 0x43, 0xfb, 0x9d, 0x79, 0xdd, 0x86, 0x88, 0x8e, - 0xf9, 0x56, 0x3f, 0x0e, 0xa6, 0x1e, 0x4a, 0x13, 0xdf, 0x9a, 0x5e, 0xd3, - 0x80, 0xea, 0xe1, 0xe6, 0x2c, 0x86, 0xff, 0xfb, 0xbf, 0xeb, 0x58, 0xb1, - 0xcd, 0xbf, 0x21, 0xa8, 0x3a, 0xff, 0xa2, 0x7e, 0x67, 0xbc, 0x9e, 0x3a, - 0xf0, 0xc6, 0xe7, 0x54, 0x8f, 0x4c, 0x27, 0x17, 0xfd, 0x9c, 0xcd, 0x63, - 0x8c, 0xe7, 0x5e, 0xc0, 0xac, 0xeb, 0xff, 0xfd, 0xd7, 0x4f, 0x47, 0x47, - 0x3d, 0xd4, 0xee, 0x23, 0x67, 0x5f, 0xff, 0xfe, 0xf7, 0x91, 0x7c, 0x4c, - 0xdc, 0x7f, 0xf4, 0x77, 0xe6, 0xd4, 0xf4, 0xd0, 0x75, 0x42, 0x36, 0x71, - 0x76, 0xff, 0x3a, 0xf3, 0x92, 0x85, 0x9d, 0x74, 0xeb, 0x2a, 0xe6, 0xdb, - 0x2a, 0xff, 0xca, 0x33, 0xa9, 0x37, 0x62, 0x75, 0x00, 0x6b, 0xdb, 0x17, - 0xbe, 0xdb, 0x1e, 0x83, 0xaa, 0x47, 0xf8, 0x8b, 0x57, 0xf6, 0x3a, 0xf3, - 0x7f, 0x1d, 0x7f, 0xdf, 0xc7, 0x72, 0x69, 0x3c, 0xe7, 0x5f, 0xca, 0x69, - 0x38, 0xe0, 0x3a, 0xb0, 0xf9, 0xdc, 0xea, 0xcd, 0x67, 0x5f, 0xf4, 0x66, - 0xf0, 0xf2, 0x79, 0x1d, 0x4d, 0x51, 0xe4, 0x84, 0x4e, 0xfc, 0x39, 0xd7, - 0xf1, 0xd7, 0xbe, 0x69, 0x87, 0x53, 0x59, 0xe1, 0xf4, 0x96, 0xfe, 0x85, - 0x70, 0x51, 0x53, 0xaf, 0xec, 0xf6, 0xc7, 0xb3, 0xa7, 0x56, 0x22, 0x00, - 0x49, 0x74, 0x59, 0x7f, 0xff, 0x31, 0x4e, 0x38, 0xa7, 0x94, 0xe4, 0x78, - 0x5c, 0x07, 0x53, 0x56, 0xbf, 0xee, 0xd2, 0x85, 0x7c, 0x42, 0x66, 0x44, - 0x01, 0x22, 0xc8, 0x64, 0x30, 0x8b, 0x78, 0x55, 0xa1, 0x14, 0xc6, 0xdc, - 0x87, 0xa7, 0x48, 0x5e, 0x1b, 0x80, 0x21, 0x18, 0x49, 0xe9, 0xa7, 0xd0, - 0xea, 0xda, 0x5d, 0x76, 0xc7, 0x4e, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x45, - 0xd7, 0xef, 0x03, 0xe8, 0xc8, 0xab, 0xf6, 0xbd, 0xd8, 0x01, 0xd7, 0xe7, - 0x9e, 0x39, 0xf9, 0xd6, 0x52, 0x74, 0x62, 0x60, 0xcb, 0x99, 0xfe, 0x53, - 0xb2, 0x4f, 0x4a, 0x2a, 0x3e, 0x94, 0x7d, 0x57, 0xff, 0x2d, 0xe4, 0xa6, - 0x71, 0x8e, 0xec, 0x34, 0x4c, 0xd7, 0xf3, 0x44, 0xd1, 0xda, 0x1a, 0x8f, - 0x1d, 0x7b, 0x78, 0xd1, 0xd7, 0x98, 0x8b, 0x3a, 0xf9, 0xa5, 0xe7, 0x13, - 0xae, 0xd9, 0x6a, 0x8e, 0xbb, 0x3f, 0x3a, 0xff, 0xf7, 0x61, 0x6f, 0xec, - 0xdc, 0x0b, 0xfb, 0xd3, 0xaf, 0x92, 0x7f, 0xc4, 0xeb, 0xf6, 0x4f, 0x80, - 0x98, 0xea, 0xf8, 0x79, 0x5e, 0x22, 0xbf, 0xdf, 0x30, 0x5f, 0x80, 0xd9, - 0x3a, 0xff, 0xfc, 0xb7, 0xee, 0x6e, 0x0e, 0xb6, 0xfd, 0x9b, 0xbf, 0x9d, - 0x7f, 0x66, 0xa3, 0xe8, 0xc1, 0xd4, 0x14, 0x5d, 0xe1, 0xb7, 0x56, 0x6e, - 0xd6, 0x1d, 0x76, 0xc7, 0x8e, 0xb3, 0x4c, 0xeb, 0x02, 0x0d, 0x6f, 0xe3, - 0x37, 0xff, 0xfe, 0x41, 0x86, 0x0c, 0x2f, 0xe4, 0x73, 0x89, 0xb7, 0x8e, - 0xe0, 0x3a, 0x9a, 0xa5, 0x55, 0x8c, 0x1e, 0x41, 0x69, 0xa1, 0x2d, 0xd8, - 0x6f, 0xb9, 0x78, 0x10, 0xbc, 0x4f, 0x7f, 0x37, 0x02, 0x39, 0xe3, 0xaf, - 0x9f, 0xa9, 0x31, 0xd7, 0xdd, 0x9a, 0x02, 0x75, 0x61, 0xf7, 0x30, 0xad, - 0xc8, 0x6f, 0xf3, 0x13, 0x04, 0x3d, 0x83, 0xa8, 0xeb, 0xe7, 0xf4, 0x80, - 0x75, 0xff, 0x69, 0x18, 0xf9, 0xcc, 0xf1, 0xd7, 0xf9, 0xf8, 0x90, 0xd6, - 0x8b, 0x3a, 0xba, 0x88, 0xaf, 0x10, 0xed, 0x36, 0xbf, 0xfd, 0xf3, 0xae, - 0x9e, 0x07, 0xe2, 0x2f, 0x23, 0xaf, 0x35, 0x36, 0xa9, 0xa0, 0x75, 0x62, - 0x6d, 0x6c, 0x30, 0x48, 0x4a, 0x2c, 0xc8, 0x52, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0x35, 0x36, 0x86, 0x35, 0x36, 0x93, 0x47, 0x68, 0xec, 0x69, 0xc3, - 0x46, 0x69, 0x72, 0x7d, 0x8c, 0xfc, 0x2d, 0x4a, 0x36, 0x77, 0xfb, 0xd6, - 0x94, 0x43, 0x49, 0xad, 0xa2, 0xf7, 0xcf, 0x9d, 0xd9, 0x3a, 0xff, 0xfc, - 0x0d, 0xe5, 0xdf, 0xe3, 0x8a, 0x75, 0x18, 0xfc, 0x3a, 0xff, 0xed, 0xdb, - 0x8f, 0x05, 0x1a, 0xf5, 0x0b, 0x3a, 0xf9, 0x07, 0xda, 0x3a, 0xff, 0xff, - 0x96, 0x9c, 0xef, 0xfa, 0x94, 0x6d, 0xe4, 0x0f, 0xbb, 0x92, 0x3a, 0xa4, - 0x88, 0x84, 0x20, 0xbf, 0xf2, 0x79, 0x18, 0x81, 0xf6, 0x30, 0xea, 0xc4, - 0xcb, 0xbd, 0x0d, 0x0d, 0x82, 0x2b, 0xef, 0x6c, 0xe7, 0x4e, 0xbf, 0xff, - 0xce, 0x2c, 0x1c, 0x0f, 0x7f, 0xf9, 0xd8, 0x97, 0x22, 0x73, 0xab, 0x11, - 0x0d, 0xf9, 0x25, 0xff, 0xfe, 0x75, 0x47, 0x01, 0xfe, 0xbe, 0x49, 0x3b, - 0x0c, 0x17, 0x3a, 0xfb, 0xc9, 0xd4, 0x3a, 0xff, 0x9f, 0x92, 0xf9, 0x8c, - 0x0e, 0x1d, 0x4d, 0x25, 0xc4, 0xd8, 0x8c, 0xb3, 0x23, 0x86, 0xec, 0x2f, - 0x9c, 0x8c, 0x58, 0x7f, 0x20, 0xb7, 0x0e, 0xbf, 0xbd, 0x8b, 0xdf, 0x16, - 0x75, 0xbb, 0x86, 0xf5, 0x04, 0x2f, 0xf7, 0xe1, 0x79, 0x69, 0x24, 0x75, - 0xf9, 0x9f, 0x8f, 0xb4, 0x75, 0xff, 0x86, 0x18, 0xab, 0xe7, 0x10, 0x07, - 0x5f, 0xda, 0xc4, 0xe7, 0x1c, 0xea, 0x9c, 0xf9, 0xc0, 0x79, 0x7f, 0xfc, - 0x83, 0x3e, 0x69, 0x1f, 0xaa, 0x36, 0xdb, 0x65, 0x54, 0x1f, 0xa8, 0x48, - 0xef, 0xed, 0xf3, 0xbf, 0xee, 0x03, 0xaf, 0xdd, 0x89, 0xfb, 0xf9, 0xd5, - 0x87, 0xb3, 0xe3, 0x0b, 0xfe, 0x1c, 0x85, 0x5f, 0xce, 0xa9, 0xd7, 0xf6, - 0xf2, 0xd0, 0x3f, 0x98, 0xeb, 0xfe, 0x9f, 0x00, 0x1f, 0xdf, 0x92, 0x3a, - 0xfe, 0x77, 0x0e, 0xdc, 0x09, 0xd7, 0x9d, 0xd8, 0x68, 0xb3, 0xef, 0xe0, - 0x38, 0xc9, 0x16, 0x75, 0x4e, 0x8b, 0x90, 0x9d, 0x30, 0xb4, 0x04, 0xf7, - 0xfb, 0xbe, 0xd3, 0xef, 0xf5, 0x67, 0x5f, 0xf7, 0x62, 0x49, 0xe8, 0xf6, - 0x8e, 0xa8, 0x3e, 0xd4, 0x36, 0xbf, 0xfd, 0xce, 0xbf, 0xcc, 0xda, 0x39, - 0xac, 0x13, 0xaf, 0xfa, 0x10, 0x38, 0xb6, 0xf3, 0xa7, 0x5f, 0xfd, 0xaf, - 0x24, 0xcd, 0xb8, 0x63, 0x7d, 0x1d, 0x48, 0x8c, 0x77, 0x4a, 0xfc, 0xde, - 0xf3, 0x6d, 0xb6, 0x55, 0xff, 0x9e, 0x5a, 0x1c, 0x60, 0x73, 0x85, 0x28, - 0x5f, 0xdf, 0xb6, 0x3f, 0x5e, 0x04, 0xeb, 0xfd, 0xee, 0xe6, 0xdf, 0x92, - 0x59, 0xd5, 0x87, 0xc5, 0xf9, 0x5d, 0xff, 0xb7, 0x90, 0xfe, 0x0f, 0x8c, - 0x58, 0x0e, 0xba, 0x15, 0x3a, 0xff, 0x83, 0x03, 0x00, 0x97, 0x50, 0xea, - 0x84, 0x47, 0xce, 0x86, 0x82, 0xd7, 0xfb, 0xa8, 0x11, 0x77, 0x98, 0xeb, - 0xfc, 0x1e, 0xfe, 0xe0, 0xd9, 0xc3, 0xaa, 0x0f, 0x9d, 0x0c, 0x6f, 0xf4, - 0x7c, 0xf6, 0x6b, 0x50, 0x75, 0xfc, 0x1f, 0xa1, 0xff, 0xda, 0x3a, 0xc9, - 0xc3, 0xe4, 0x13, 0x3b, 0xd0, 0x2a, 0x9d, 0x52, 0x5f, 0xb2, 0x09, 0x2e, - 0x19, 0xb2, 0x30, 0x4d, 0xde, 0x90, 0x86, 0x63, 0x7e, 0x43, 0xa9, 0x70, - 0xab, 0xec, 0x39, 0xc0, 0x9c, 0x30, 0xae, 0xd4, 0x2c, 0x7d, 0x09, 0x6d, - 0xb0, 0x84, 0xfa, 0x4d, 0x70, 0x34, 0x75, 0xff, 0x7f, 0xed, 0x0e, 0x4d, - 0x0b, 0x3a, 0xf8, 0x0e, 0xdf, 0x8e, 0xbf, 0xce, 0xdf, 0x52, 0x39, 0x07, - 0x50, 0x51, 0x44, 0xa8, 0xb2, 0x1c, 0xf0, 0x8a, 0xff, 0xdc, 0x4d, 0x4b, - 0xef, 0x60, 0x60, 0xeb, 0xee, 0x24, 0x2c, 0xeb, 0xff, 0xf7, 0x95, 0xfe, - 0x30, 0x3d, 0xcd, 0x6f, 0x28, 0xe9, 0xd5, 0xc4, 0x5a, 0xac, 0xf8, 0x48, - 0x2e, 0x79, 0x1d, 0x7f, 0xff, 0xff, 0x0b, 0xb7, 0xec, 0xe8, 0xe7, 0xbf, - 0x02, 0xde, 0x4e, 0x18, 0x17, 0xe3, 0xc8, 0xeb, 0xfd, 0x9d, 0xef, 0xfe, - 0x71, 0x3a, 0xff, 0x99, 0x9d, 0x63, 0xf1, 0xe4, 0x75, 0xe4, 0x9b, 0x47, - 0x54, 0x1e, 0x9a, 0xcd, 0xec, 0x81, 0x4d, 0x02, 0x61, 0x5e, 0x42, 0x15, - 0x70, 0x85, 0xbf, 0xbe, 0x27, 0x5d, 0x68, 0x75, 0xed, 0xb8, 0x13, 0xad, - 0xc9, 0xcf, 0x2a, 0x62, 0xdb, 0xff, 0x63, 0x7b, 0x1c, 0xcd, 0x81, 0xfd, - 0xb3, 0xaa, 0x15, 0x3b, 0xf6, 0x36, 0xf7, 0x84, 0xc0, 0x95, 0x5f, 0xff, - 0xff, 0x03, 0x59, 0x82, 0xaf, 0xde, 0x0c, 0x67, 0x54, 0xd0, 0xe4, 0xeb, - 0xc5, 0x9d, 0x7e, 0xfb, 0x03, 0xf5, 0x67, 0x56, 0x22, 0xa3, 0xcf, 0xd7, - 0xed, 0xaf, 0xd8, 0xfa, 0x75, 0xff, 0xf7, 0xfb, 0xcb, 0x41, 0xec, 0x70, - 0x2e, 0xed, 0x9d, 0x58, 0x89, 0xe4, 0x22, 0x12, 0xab, 0xda, 0x89, 0xce, - 0xbf, 0xe8, 0xc6, 0x75, 0x36, 0xbf, 0x0e, 0xbb, 0x3a, 0x75, 0x09, 0xe6, - 0xec, 0x9c, 0x54, 0x91, 0x75, 0xa2, 0xdf, 0x34, 0xde, 0xef, 0xed, 0x9d, - 0x78, 0x1f, 0xb0, 0xeb, 0xde, 0xcf, 0xa7, 0x5f, 0xd1, 0xbe, 0xbe, 0x72, - 0x0e, 0xbc, 0x1f, 0xd8, 0x75, 0xf0, 0x46, 0x24, 0x75, 0x21, 0xbd, 0x71, - 0xda, 0x0a, 0x38, 0xf7, 0x1e, 0x41, 0xd5, 0x8e, 0xf5, 0xb2, 0xff, 0x24, - 0xce, 0x29, 0xbe, 0x8e, 0xbb, 0x18, 0x75, 0xfd, 0xc4, 0xdb, 0x83, 0xa3, - 0xaf, 0xed, 0xfd, 0x9d, 0xfd, 0xac, 0xeb, 0xfb, 0x99, 0xde, 0xff, 0xe3, - 0xaf, 0xdd, 0x18, 0xce, 0x19, 0x7f, 0x67, 0x27, 0xfd, 0xc2, 0x68, 0x83, - 0x54, 0x34, 0xb6, 0xe4, 0xe8, 0x9f, 0x92, 0x9d, 0xf0, 0xf7, 0x37, 0x3a, - 0xa1, 0x31, 0xc4, 0x86, 0x8b, 0x95, 0x5f, 0x9d, 0x88, 0xb8, 0x3a, 0xfe, - 0x97, 0x45, 0xf7, 0xf1, 0xd4, 0xc3, 0xd2, 0x12, 0x5b, 0xef, 0xa2, 0xf3, - 0x9d, 0x58, 0x78, 0x9a, 0x21, 0xbf, 0x47, 0xbe, 0x2d, 0xb3, 0xaf, 0xf4, - 0x91, 0x71, 0xdf, 0xa1, 0x3a, 0xff, 0xf4, 0x60, 0xef, 0xec, 0xe2, 0x4e, - 0xeb, 0x3a, 0xfc, 0xed, 0xfb, 0x3b, 0xa3, 0xfc, 0xf1, 0xa5, 0x7c, 0x56, - 0xbe, 0xd5, 0x99, 0x40, 0xac, 0xa3, 0x49, 0xc8, 0x64, 0xf0, 0x84, 0x61, - 0x4d, 0x7b, 0x59, 0x23, 0xaf, 0xc8, 0x0e, 0xc0, 0x4e, 0xbf, 0x26, 0xf2, - 0x41, 0x3a, 0xf2, 0x77, 0x0e, 0xba, 0x17, 0x87, 0x80, 0xc2, 0x6b, 0xf9, - 0xbc, 0x5c, 0x71, 0x53, 0xaf, 0x83, 0xae, 0xc1, 0xd7, 0xe1, 0xe3, 0x6f, - 0x39, 0xd5, 0x07, 0xef, 0x85, 0xce, 0x43, 0x77, 0xe2, 0x75, 0x42, 0x6c, - 0xd8, 0x36, 0x8c, 0xdc, 0x85, 0x1e, 0x8b, 0x2f, 0x77, 0x04, 0xeb, 0xcf, - 0xe8, 0x3a, 0xff, 0x4d, 0x13, 0xad, 0xe6, 0x83, 0xaf, 0xff, 0x9d, 0x5f, - 0x47, 0x01, 0xc8, 0xf0, 0xb8, 0x0e, 0xbf, 0x87, 0x01, 0x83, 0x23, 0xaf, - 0xff, 0x95, 0xf9, 0xf4, 0x5f, 0xda, 0x4d, 0xfa, 0x8d, 0x9d, 0x61, 0xc3, - 0xff, 0x72, 0xaa, 0xc4, 0xd6, 0xb8, 0x34, 0xe3, 0x42, 0x69, 0xfc, 0x33, - 0x6e, 0xd6, 0xd3, 0xaf, 0x90, 0x5c, 0x27, 0x5f, 0xf9, 0x79, 0xed, 0x7d, - 0xd3, 0xcb, 0x0e, 0xbf, 0x6a, 0x39, 0xe8, 0x39, 0x43, 0x7f, 0x41, 0x44, - 0xae, 0x97, 0xaf, 0xdf, 0x66, 0x77, 0xe1, 0xd7, 0xdd, 0xc4, 0xda, 0x75, - 0xfd, 0xa4, 0xe6, 0x7f, 0xc3, 0xaf, 0xff, 0xf4, 0x4d, 0xf1, 0x19, 0xff, - 0x35, 0xff, 0xc5, 0xa7, 0xba, 0x87, 0x56, 0x27, 0x5e, 0x90, 0xad, 0x59, - 0x1f, 0x4a, 0x7c, 0x45, 0xb0, 0x5b, 0x72, 0xda, 0x06, 0x8b, 0xf2, 0xfb, - 0x5c, 0xcc, 0x3a, 0xff, 0xe9, 0x7b, 0xf9, 0x49, 0x7e, 0xf4, 0x2c, 0xeb, - 0xfd, 0xed, 0x44, 0xf9, 0xa0, 0x9d, 0x77, 0x70, 0xeb, 0xff, 0xee, 0xc0, - 0x71, 0x9f, 0x30, 0x70, 0x3d, 0x83, 0xaf, 0xfe, 0x4c, 0x1c, 0xcd, 0x7c, - 0x96, 0x96, 0x75, 0xff, 0x9e, 0x37, 0x97, 0xcd, 0x6e, 0x18, 0x3a, 0x82, - 0x9c, 0x06, 0xe4, 0x08, 0x8c, 0xd6, 0x67, 0x30, 0xae, 0x93, 0xbc, 0x87, - 0x79, 0x58, 0xe1, 0xd7, 0xf0, 0x60, 0x1c, 0xcd, 0xce, 0xa5, 0x0f, 0x25, - 0x63, 0x97, 0xfa, 0x17, 0x89, 0xc9, 0xa4, 0x75, 0xc9, 0x31, 0xd7, 0xfb, - 0x90, 0xa8, 0x46, 0x37, 0x3a, 0xff, 0xf7, 0xa3, 0xa2, 0xf3, 0xc7, 0x38, - 0xf2, 0x3a, 0xf7, 0x92, 0x73, 0xaf, 0xc0, 0x7d, 0xe2, 0x63, 0xaf, 0x0c, - 0x30, 0xeb, 0xff, 0x82, 0x93, 0x76, 0x39, 0xbc, 0xa3, 0x87, 0x5f, 0xfe, - 0x41, 0x7d, 0xf5, 0xac, 0xe0, 0x7b, 0x87, 0x57, 0xc4, 0xdf, 0x24, 0x2c, - 0x86, 0x6b, 0x48, 0x71, 0xc1, 0x28, 0xd0, 0xd6, 0xc2, 0x2d, 0xa0, 0xeb, - 0xdd, 0x4f, 0x1d, 0x6d, 0xb8, 0x6a, 0xbe, 0x87, 0xd4, 0x2e, 0xa8, 0x05, - 0x7b, 0x23, 0xa7, 0x48, 0x59, 0x74, 0x8d, 0xe3, 0xae, 0x04, 0x27, 0xaf, - 0x2d, 0xfe, 0x9d, 0x7f, 0xd8, 0x32, 0x1c, 0x5c, 0x30, 0xeb, 0xf7, 0x53, - 0x6e, 0x04, 0xeb, 0xff, 0x06, 0x07, 0x07, 0xf9, 0x66, 0x8e, 0xbf, 0x3a, - 0xd3, 0x63, 0x0e, 0xbd, 0xe8, 0xdc, 0xea, 0xc3, 0xc4, 0x72, 0x8b, 0xd0, - 0x93, 0x1d, 0x78, 0x5a, 0xad, 0x83, 0xaf, 0xd9, 0x3a, 0xe3, 0x47, 0x5f, - 0xff, 0xfa, 0x3a, 0x8b, 0x52, 0x69, 0x3f, 0x3e, 0xf5, 0x37, 0xd3, 0x12, - 0x73, 0xaa, 0x74, 0xfc, 0x02, 0x3a, 0xa9, 0xaa, 0x14, 0x4d, 0x08, 0x0e, - 0x90, 0x08, 0xde, 0x88, 0xf6, 0x09, 0xef, 0xbe, 0x3c, 0x9a, 0x83, 0xaf, - 0xfe, 0xcd, 0xb8, 0x1c, 0x1f, 0xe5, 0x9a, 0x3a, 0xfd, 0xc8, 0xef, 0xd0, - 0x9d, 0x5c, 0x3e, 0xd7, 0x44, 0xbe, 0x84, 0x9e, 0x0e, 0xbe, 0x6d, 0xf3, - 0x47, 0x5f, 0xc1, 0x80, 0x0e, 0x6e, 0x75, 0xff, 0x49, 0x6f, 0x2f, 0x6a, - 0x15, 0x3a, 0xa1, 0x10, 0xd8, 0x42, 0xe5, 0x97, 0xb4, 0x82, 0x75, 0xf8, - 0x59, 0xf3, 0x5b, 0x9d, 0x58, 0x78, 0x8e, 0x35, 0x4d, 0x69, 0xf6, 0xbc, - 0x25, 0x40, 0x42, 0x30, 0xa6, 0xfd, 0xc6, 0xe9, 0xe4, 0x75, 0xe4, 0xea, - 0x1d, 0x5b, 0x9b, 0x1f, 0x0b, 0xdf, 0x7d, 0xfd, 0xf4, 0x75, 0xff, 0x22, - 0xb0, 0x18, 0xdb, 0x9d, 0x3a, 0xff, 0xba, 0x8d, 0xef, 0x2d, 0x63, 0x0e, - 0xbf, 0xbf, 0xd4, 0x4d, 0xff, 0x0e, 0xbd, 0xfe, 0x6e, 0x75, 0x74, 0xf3, - 0x7c, 0x61, 0x7f, 0xa5, 0xf8, 0xcf, 0xa4, 0xdc, 0xeb, 0xe0, 0x03, 0x37, - 0x3a, 0xfe, 0xd8, 0xf6, 0x38, 0xb0, 0xeb, 0xfe, 0xfd, 0xe4, 0x1c, 0xc0, - 0x68, 0xeb, 0xfc, 0x04, 0xdf, 0x79, 0x67, 0x8e, 0xae, 0x9f, 0x66, 0x8e, - 0x2f, 0xdb, 0xe9, 0x68, 0xd6, 0x75, 0xff, 0xfb, 0x35, 0xf3, 0xae, 0x9e, - 0x07, 0xe2, 0x2f, 0x23, 0xaa, 0x11, 0x00, 0x25, 0x77, 0xf3, 0xce, 0x07, - 0x10, 0x9d, 0x53, 0xaa, 0xc2, 0x09, 0xcb, 0x21, 0x0f, 0x31, 0x17, 0x0d, - 0x7a, 0x45, 0xe8, 0x4d, 0x6d, 0x85, 0x16, 0xc9, 0x0d, 0xfe, 0xfb, 0x0c, - 0xd9, 0xce, 0x41, 0xd7, 0xfc, 0x1c, 0xff, 0x93, 0xb1, 0x27, 0x3a, 0xfe, - 0x8e, 0xa7, 0x21, 0x67, 0x57, 0x51, 0x38, 0xe6, 0xde, 0x3b, 0xa8, 0x5c, - 0x47, 0xc9, 0x5c, 0xcf, 0x19, 0x95, 0xd3, 0x7e, 0x75, 0x96, 0x75, 0x6e, - 0x6a, 0x1a, 0x63, 0x17, 0xff, 0x47, 0x33, 0x6b, 0xc8, 0x19, 0x81, 0x3a, - 0xfe, 0x7d, 0xe4, 0x30, 0x13, 0xaf, 0xfa, 0x37, 0x92, 0x0a, 0xdf, 0xc7, - 0x53, 0x9f, 0x18, 0x96, 0x5f, 0x9e, 0x59, 0x3c, 0x1d, 0x7f, 0xf4, 0x6b, - 0x58, 0xbf, 0x0c, 0x2f, 0x47, 0x5f, 0xfc, 0x91, 0xa1, 0x79, 0x7c, 0xd6, - 0x70, 0xeb, 0xff, 0xfc, 0x9a, 0x9f, 0x1b, 0xc1, 0xff, 0x62, 0x14, 0xc1, - 0x7e, 0x1d, 0x7f, 0xb7, 0x96, 0xa6, 0x94, 0x4e, 0x75, 0x05, 0x34, 0x46, - 0x13, 0x0a, 0x17, 0x90, 0xff, 0x63, 0xbf, 0xff, 0xf7, 0x53, 0x7f, 0x66, - 0xfe, 0xe7, 0x23, 0xc0, 0xfa, 0x32, 0xee, 0x1d, 0x78, 0x2e, 0x27, 0x5e, - 0xe4, 0x6d, 0x3a, 0xef, 0xf8, 0x75, 0x04, 0xf3, 0xb8, 0x35, 0xa1, 0xdb, - 0xff, 0x4a, 0x07, 0xdc, 0x4d, 0xb8, 0x13, 0xaf, 0xfc, 0xfe, 0xd7, 0xf2, - 0xfa, 0x14, 0xf1, 0xd7, 0xfe, 0x7e, 0xb1, 0x1f, 0xe6, 0x9f, 0xa7, 0x5f, - 0xdd, 0x71, 0xde, 0x48, 0x75, 0xff, 0xfb, 0x43, 0xf3, 0xae, 0x9e, 0x07, - 0xe2, 0x2f, 0x23, 0xaf, 0xf7, 0x51, 0x5d, 0x9f, 0xf8, 0xa9, 0xd7, 0xfd, - 0x0d, 0xaf, 0xb0, 0x83, 0x39, 0xd7, 0xff, 0xc3, 0x9a, 0xc5, 0xc3, 0x33, - 0xc9, 0xcc, 0x3a, 0xd8, 0xc4, 0x5e, 0x78, 0xe7, 0x69, 0xc5, 0xfd, 0x3e, - 0x71, 0x19, 0x07, 0x5f, 0x08, 0x61, 0x67, 0x5f, 0xff, 0x7e, 0x3e, 0xd7, - 0x52, 0x61, 0x85, 0xbc, 0x8e, 0xbe, 0xc1, 0xfd, 0xce, 0xa5, 0x9f, 0x7e, - 0xd4, 0xfb, 0xf9, 0xc1, 0x81, 0x79, 0x1d, 0x50, 0x8d, 0xec, 0x84, 0x7a, - 0x12, 0x52, 0x26, 0x79, 0xd8, 0xc2, 0xaa, 0x17, 0xbf, 0x67, 0x26, 0x0c, - 0x29, 0xb2, 0x36, 0x46, 0x25, 0xa4, 0x2f, 0x66, 0x2f, 0x59, 0xf7, 0x50, - 0x5c, 0xf8, 0x05, 0x83, 0x18, 0x8f, 0xa3, 0x73, 0xbf, 0xfb, 0x04, 0x19, - 0x9c, 0xd7, 0xa3, 0x0e, 0xbf, 0xed, 0xfd, 0x9c, 0x49, 0xdd, 0x67, 0x5b, - 0x00, 0x7f, 0x22, 0x81, 0x79, 0xa7, 0x24, 0x3a, 0xfa, 0x05, 0xe4, 0x75, - 0xfb, 0x1a, 0xdc, 0x41, 0xf0, 0xdf, 0x70, 0x7e, 0xfe, 0xdb, 0xd4, 0x8e, - 0x68, 0xeb, 0xff, 0x75, 0x16, 0x1c, 0x9a, 0x33, 0x87, 0x5e, 0x94, 0x6e, - 0x75, 0xf4, 0x01, 0xd6, 0x75, 0xc3, 0x2c, 0x3f, 0x99, 0x8f, 0x44, 0x72, - 0xfb, 0x49, 0xe8, 0x3a, 0xa0, 0xf6, 0x5c, 0xe6, 0xf9, 0x9d, 0x49, 0x8e, - 0xbf, 0xff, 0x0e, 0x2a, 0xaa, 0x07, 0xa9, 0x37, 0x53, 0x7f, 0x1d, 0x50, - 0x7f, 0x38, 0x45, 0x79, 0x8f, 0xc3, 0xaf, 0xda, 0x64, 0x71, 0x53, 0xab, - 0xa7, 0x86, 0x01, 0xbb, 0xfa, 0x58, 0x81, 0xea, 0x1d, 0x79, 0xf8, 0xa9, - 0xd5, 0x87, 0x8e, 0xe5, 0x77, 0xff, 0x66, 0xfe, 0xd2, 0x0c, 0x01, 0xd6, - 0x75, 0xe9, 0x2f, 0xa7, 0x54, 0xe7, 0xbd, 0xe4, 0x2b, 0xe4, 0x55, 0x1b, - 0x3a, 0xb0, 0xf1, 0x44, 0x8e, 0xef, 0x98, 0x75, 0xf6, 0x86, 0x16, 0x75, - 0x41, 0xb7, 0xdc, 0x5e, 0xf7, 0x64, 0xb3, 0xae, 0xea, 0x1d, 0x58, 0x6c, - 0x7c, 0x39, 0x50, 0xb9, 0x2d, 0x26, 0x4c, 0x41, 0x56, 0x30, 0x0e, 0xc2, - 0x65, 0xd8, 0xc5, 0xa7, 0x50, 0xc3, 0xfd, 0x5f, 0x65, 0x4a, 0xf0, 0x56, - 0xc3, 0xad, 0xd3, 0xac, 0x03, 0xae, 0xd4, 0x8e, 0xa0, 0x1b, 0x6d, 0x08, - 0x7e, 0x21, 0x7f, 0x4f, 0x34, 0x9a, 0x5c, 0x9c, 0xeb, 0xcf, 0x9c, 0x3a, - 0xf0, 0xe7, 0x8e, 0xae, 0x9b, 0x41, 0x1a, 0xbb, 0xc2, 0x75, 0xe8, 0xdf, - 0x47, 0x5f, 0x20, 0xcb, 0x0e, 0xbd, 0x3b, 0x89, 0xd4, 0x13, 0xd6, 0x58, - 0xe7, 0x87, 0xef, 0xd9, 0xee, 0xa7, 0x8e, 0xbf, 0x3e, 0xf9, 0xbf, 0x8e, - 0xb2, 0xbd, 0x3c, 0xef, 0x13, 0x5c, 0x9c, 0x3a, 0xfe, 0x9f, 0xe4, 0xee, - 0xfd, 0x3a, 0x9a, 0xa4, 0xf7, 0xe1, 0xa6, 0x44, 0x18, 0xd6, 0x8f, 0xbd, - 0x29, 0x71, 0x5b, 0xfe, 0xc0, 0x85, 0x37, 0xcd, 0xfc, 0x75, 0xf3, 0x06, - 0x24, 0x75, 0x74, 0xf6, 0x5c, 0xe6, 0xff, 0x46, 0x7a, 0x3a, 0xe1, 0x3a, - 0xa7, 0x3d, 0x10, 0x90, 0xdf, 0xfc, 0x18, 0x0f, 0x23, 0xc8, 0xc4, 0x09, - 0xd7, 0xd3, 0x46, 0xc4, 0x8e, 0xbf, 0xbc, 0xc0, 0x85, 0x7c, 0x3a, 0xff, - 0xa6, 0xd6, 0xd7, 0x19, 0xff, 0x09, 0xd7, 0xd9, 0xec, 0x59, 0xd7, 0x0a, - 0xa7, 0x5b, 0x4e, 0x6d, 0xbf, 0x20, 0xbf, 0xbb, 0xfc, 0xf3, 0x75, 0x0e, - 0xbe, 0x11, 0xcf, 0x1d, 0x50, 0x9d, 0x08, 0x48, 0xf1, 0x09, 0x52, 0x54, - 0x2e, 0x99, 0xcf, 0xa4, 0xfe, 0x30, 0xbf, 0xbe, 0x4d, 0x1e, 0x1d, 0xa7, - 0x5f, 0xfe, 0x18, 0xdb, 0xc8, 0xe6, 0x27, 0x60, 0x27, 0x5e, 0x17, 0x59, - 0xd5, 0x24, 0x49, 0xe1, 0x8a, 0x24, 0x59, 0x46, 0xa9, 0xf1, 0xe9, 0x9a, - 0xb3, 0xc6, 0x8e, 0x38, 0xd4, 0x86, 0xe2, 0x56, 0x84, 0xf0, 0xef, 0x94, - 0x73, 0x01, 0x9c, 0x9a, 0xca, 0x43, 0x42, 0xb1, 0xd5, 0x32, 0x5b, 0x4e, - 0xf2, 0x91, 0xd2, 0x31, 0x39, 0xa5, 0xd4, 0xf2, 0x3e, 0x05, 0xc7, 0x4f, - 0xd9, 0xf4, 0xd7, 0x94, 0xd2, 0x09, 0x4e, 0xad, 0x38, 0x44, 0x0c, 0xe3, - 0x4e, 0xa7, 0xd8, 0xbd, 0x3b, 0xbb, 0xfc, 0x27, 0xdb, 0x52, 0xd9, 0x94, - 0x1d, 0xf6, 0x55, 0x8e, 0xc4, 0x60, 0x94, 0xa3, 0xe5, 0x1c, 0x76, 0xf1, - 0xfd, 0xaf, 0xff, 0x28, 0xb7, 0x92, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x36, - 0x5f, 0xe5, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0xad, 0xbf, 0xd2, 0x97, 0xfe, - 0x18, 0x91, 0xd7, 0xd9, 0xd7, 0xf1, 0xd6, 0x68, 0x61, 0xe9, 0x89, 0x9d, - 0xff, 0x60, 0xe2, 0xe2, 0x5f, 0xf0, 0xeb, 0xfd, 0xcc, 0x64, 0x03, 0xea, - 0xce, 0xbf, 0xdd, 0x89, 0xf9, 0x18, 0x13, 0xaf, 0xff, 0xd1, 0x3c, 0x72, - 0x17, 0x11, 0xee, 0xa0, 0x16, 0x75, 0x42, 0x21, 0x7a, 0x65, 0x4c, 0x4c, - 0x4b, 0x86, 0xfd, 0x85, 0xcd, 0xfa, 0x38, 0xbe, 0x84, 0xeb, 0xc1, 0xc1, - 0x3a, 0xf3, 0xbb, 0x0d, 0x15, 0xa5, 0xf9, 0x5d, 0xf5, 0xfe, 0xe7, 0x53, - 0x0f, 0x4d, 0x09, 0xef, 0xff, 0x27, 0xa5, 0x0c, 0xea, 0x7b, 0x4f, 0xb9, - 0xd5, 0xc3, 0xea, 0xda, 0x43, 0x7f, 0xfb, 0xa8, 0xb8, 0x66, 0x2f, 0x07, - 0xdb, 0x27, 0x5f, 0xff, 0x32, 0x39, 0x80, 0x75, 0xbc, 0xa1, 0x18, 0x75, - 0xff, 0xf4, 0xb5, 0x83, 0x0b, 0x7c, 0xf7, 0xa1, 0x67, 0x5d, 0xef, 0x42, - 0x26, 0x1d, 0x32, 0xff, 0xff, 0xf4, 0x6d, 0x4f, 0x6b, 0x15, 0x67, 0x53, - 0xd9, 0x30, 0xc2, 0xe7, 0xc6, 0xce, 0xbf, 0xd1, 0xe7, 0xef, 0xc0, 0xc1, - 0xd7, 0xd2, 0xf2, 0x4e, 0x75, 0xfb, 0xef, 0x86, 0x00, 0x75, 0x6e, 0x79, - 0x5b, 0x48, 0xaf, 0xf3, 0xcb, 0xc9, 0x3f, 0x50, 0xea, 0x83, 0xd7, 0x42, - 0x5b, 0xf6, 0x75, 0x31, 0x67, 0x5f, 0x90, 0x0b, 0x4e, 0x1d, 0x7f, 0xf0, - 0xba, 0x33, 0xaf, 0xfc, 0xfc, 0x43, 0xaa, 0x74, 0x47, 0x04, 0x97, 0xa4, - 0xd7, 0xfa, 0x51, 0xc9, 0xe3, 0x93, 0x9d, 0x7d, 0x2e, 0x62, 0xce, 0xbd, - 0x9c, 0x01, 0xd7, 0xe9, 0xb0, 0x2b, 0x6b, 0x3a, 0xfe, 0x18, 0x6f, 0x79, - 0x68, 0xea, 0xdd, 0x12, 0xa8, 0x43, 0x30, 0xde, 0xc1, 0x5d, 0x42, 0x61, - 0x59, 0x0c, 0x9b, 0xff, 0xff, 0xfb, 0x11, 0x99, 0xe8, 0x1f, 0x6b, 0xe4, - 0x20, 0x71, 0x7f, 0x39, 0x09, 0x27, 0xd1, 0xd7, 0xf6, 0x79, 0xc4, 0x1f, - 0x9d, 0x7f, 0x77, 0xe2, 0x4e, 0xe2, 0x75, 0xfe, 0x85, 0xe8, 0x22, 0xed, - 0x9d, 0x7c, 0xe0, 0x70, 0x9d, 0x52, 0x45, 0x66, 0x16, 0x09, 0x76, 0x8c, - 0xac, 0xa3, 0x49, 0x90, 0xdf, 0x11, 0x9e, 0x4e, 0x6c, 0x12, 0x7c, 0x86, - 0xbb, 0x09, 0x12, 0x1c, 0x5c, 0x2d, 0x5b, 0xd7, 0x61, 0xa8, 0xf0, 0xae, - 0x18, 0xce, 0xf4, 0x4f, 0xe8, 0xcc, 0xef, 0xdc, 0x63, 0xbb, 0x0d, 0x16, - 0x05, 0xf9, 0xd9, 0xf7, 0xb3, 0x1d, 0x65, 0x30, 0xf7, 0x74, 0x67, 0x7e, - 0xe3, 0x1d, 0xd8, 0x68, 0x9d, 0x6f, 0xff, 0xf7, 0x62, 0x70, 0xe2, 0xd4, - 0xd6, 0xb3, 0xa9, 0xaf, 0xe7, 0x3a, 0xfc, 0xa2, 0xde, 0x4a, 0x62, 0x25, - 0xe6, 0x33, 0xbc, 0xac, 0x2c, 0xeb, 0xe7, 0x67, 0xd5, 0x9d, 0x7a, 0x5a, - 0x51, 0x53, 0x7f, 0xb4, 0x72, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x6c, 0xdf, - 0xde, 0x7e, 0xfc, 0x0c, 0x1d, 0x7f, 0xff, 0x49, 0x4d, 0x42, 0x60, 0x53, - 0x35, 0x9e, 0x18, 0x3a, 0xa1, 0x10, 0xae, 0x5d, 0x7f, 0xe0, 0x46, 0x94, - 0xea, 0x31, 0xf8, 0x75, 0xff, 0x44, 0xa3, 0x93, 0xc7, 0x27, 0x3a, 0xca, - 0x62, 0x6a, 0x0b, 0x85, 0xc3, 0x90, 0x89, 0xf5, 0xff, 0x85, 0x45, 0xfe, - 0x9e, 0x17, 0xd8, 0x3a, 0xff, 0xef, 0xf4, 0xa6, 0x71, 0xf5, 0xd7, 0x91, - 0xd7, 0x38, 0x31, 0x10, 0xc0, 0x41, 0xbb, 0x76, 0x1d, 0x7c, 0xc7, 0x76, - 0x1a, 0x2e, 0x6b, 0x2c, 0xea, 0xe1, 0xbd, 0x6c, 0xb6, 0xff, 0x70, 0x73, - 0x70, 0x24, 0x8e, 0xba, 0x65, 0x9d, 0x47, 0x59, 0x48, 0x46, 0x4e, 0x2a, - 0x21, 0x13, 0x66, 0x5b, 0x22, 0xf7, 0xee, 0x31, 0xdd, 0x86, 0x8b, 0xbe, - 0xff, 0x49, 0x4d, 0x73, 0x88, 0xd9, 0xd6, 0x53, 0x0f, 0xa1, 0xcc, 0xef, - 0x94, 0x54, 0x20, 0x3a, 0xa1, 0xf6, 0xb3, 0xf2, 0xf2, 0x99, 0x18, 0x6f, - 0xba, 0xba, 0x52, 0x40, 0x79, 0x1a, 0x6a, 0xe1, 0x7e, 0xf0, 0x81, 0x04, - 0x70, 0xe3, 0x0c, 0xdd, 0x43, 0xdb, 0xd0, 0xba, 0xfa, 0x4f, 0x7f, 0xe6, - 0xdc, 0x67, 0xd2, 0x0e, 0xf2, 0x3a, 0xff, 0xec, 0x9f, 0x1b, 0xee, 0x6b, - 0x10, 0x4e, 0xb9, 0x14, 0xea, 0x20, 0x44, 0xfe, 0xfd, 0xad, 0x2d, 0xe4, - 0x75, 0xff, 0xff, 0xff, 0xba, 0x9d, 0x48, 0x1f, 0x0b, 0xab, 0x9e, 0xff, - 0xc9, 0xed, 0x75, 0x39, 0x13, 0xbf, 0x18, 0x75, 0xda, 0x83, 0xaf, 0xfe, - 0xdd, 0x9f, 0xbe, 0xfe, 0xcc, 0x15, 0x4e, 0xbc, 0x2e, 0xa4, 0x26, 0x34, - 0xc2, 0x7d, 0x42, 0x63, 0xc2, 0xb7, 0xbf, 0x75, 0x9d, 0x7e, 0xcd, 0x8f, - 0x42, 0xa7, 0x5b, 0x60, 0xea, 0x9c, 0xde, 0xe1, 0x55, 0x70, 0xfe, 0x85, - 0x66, 0xff, 0xda, 0x75, 0x7a, 0x90, 0x3f, 0xc1, 0xd7, 0xfe, 0xeb, 0xf9, - 0xfb, 0xbc, 0xb3, 0xc7, 0x56, 0x1f, 0xda, 0x1e, 0xdc, 0xe0, 0x3a, 0xff, - 0xff, 0xf0, 0xbb, 0x63, 0x9e, 0xf6, 0x4f, 0x02, 0xea, 0xe9, 0x71, 0x82, - 0x13, 0xaf, 0x67, 0xdd, 0x1d, 0x58, 0x8a, 0x6e, 0x0a, 0xec, 0x3a, 0x5f, - 0xee, 0xe0, 0x53, 0x6f, 0x30, 0xeb, 0xce, 0xec, 0x34, 0x4a, 0xf7, 0xf9, - 0x57, 0x10, 0x7b, 0x3a, 0x75, 0x30, 0xf6, 0x50, 0x9e, 0xff, 0x6e, 0x2e, - 0xab, 0xfa, 0x47, 0x5f, 0xfd, 0xdc, 0x93, 0x3a, 0x81, 0x81, 0xf1, 0xd4, - 0x87, 0xeb, 0xe3, 0x3a, 0x92, 0x68, 0x7c, 0x84, 0x60, 0xc2, 0x5a, 0xff, - 0xff, 0xfb, 0x8e, 0x3f, 0x60, 0x19, 0x2e, 0xc6, 0xd0, 0xc2, 0x98, 0x3f, - 0xcb, 0x34, 0x75, 0xd2, 0x9c, 0xeb, 0xff, 0xfc, 0xfb, 0xeb, 0x39, 0xef, - 0x3c, 0xff, 0x56, 0x1e, 0xa2, 0xa7, 0x5f, 0xf6, 0x26, 0xd1, 0x8c, 0xe4, - 0x8e, 0xbf, 0xff, 0x7a, 0x58, 0xd6, 0xe2, 0x0d, 0xfd, 0xc8, 0xc6, 0xce, - 0x6c, 0xdb, 0xdf, 0xb7, 0xf7, 0x60, 0x07, 0x53, 0xa2, 0x47, 0xf6, 0x9b, - 0xff, 0xd3, 0x0c, 0x7b, 0x5e, 0xdd, 0x88, 0x33, 0x9d, 0x7f, 0xce, 0xd8, - 0x7b, 0x13, 0xe3, 0x67, 0x52, 0x22, 0x14, 0x52, 0xef, 0xff, 0xd8, 0x80, - 0xc5, 0xa7, 0xb5, 0x0b, 0x7d, 0xfc, 0x75, 0xff, 0x42, 0xfd, 0x93, 0x49, - 0x3c, 0x75, 0x49, 0x11, 0x7e, 0x53, 0xbe, 0xfd, 0xf9, 0x23, 0xaf, 0xe1, - 0x89, 0xc0, 0xfe, 0x3a, 0xff, 0x38, 0x7e, 0xec, 0x40, 0xc8, 0xeb, 0x43, - 0x0f, 0x89, 0x65, 0x97, 0xff, 0xf9, 0x3c, 0xeb, 0x71, 0x07, 0x5b, 0x71, - 0x9d, 0x89, 0x39, 0xd4, 0x14, 0xc2, 0xd2, 0x10, 0x8e, 0x4f, 0x7f, 0xdf, - 0x81, 0x6f, 0x2d, 0x70, 0x27, 0x5f, 0xff, 0xec, 0x41, 0xf6, 0x0f, 0xc1, - 0x70, 0xc0, 0xcf, 0x1c, 0x3a, 0xd9, 0xe4, 0x4b, 0xed, 0x3a, 0xbf, 0xed, - 0xc1, 0x9c, 0xcc, 0xf6, 0x8e, 0xa0, 0xab, 0x07, 0xc8, 0x56, 0x76, 0x32, - 0xe1, 0x86, 0x5f, 0xd2, 0xab, 0xff, 0x67, 0x7a, 0xf2, 0x07, 0x33, 0x73, - 0xaf, 0xfb, 0x37, 0xd0, 0x61, 0xc6, 0x73, 0xaf, 0xf9, 0xe5, 0xae, 0xc7, - 0x3e, 0x84, 0xea, 0x92, 0x2c, 0x30, 0xfb, 0xc7, 0x17, 0xff, 0x79, 0x36, - 0xa7, 0xa6, 0x94, 0x0f, 0x8e, 0xbf, 0xfc, 0xf9, 0x2e, 0xe2, 0x0e, 0x03, - 0x67, 0x0e, 0xbc, 0xf2, 0x52, 0x19, 0x49, 0x72, 0x84, 0xe0, 0x61, 0x8d, - 0x91, 0xba, 0xf0, 0xe9, 0x6f, 0xe0, 0x17, 0x18, 0xcb, 0x75, 0x2e, 0xbf, - 0xd1, 0x86, 0x7d, 0x2f, 0xd8, 0x45, 0xbf, 0xfd, 0x9d, 0x50, 0x70, 0x28, - 0x3e, 0xce, 0x9d, 0x7b, 0xd0, 0x12, 0xaf, 0xff, 0x75, 0xd3, 0xd1, 0x24, - 0xe4, 0xff, 0x80, 0xab, 0xfc, 0xec, 0x50, 0x3c, 0x69, 0xa9, 0x07, 0xcb, - 0xa1, 0xbb, 0x28, 0x16, 0x71, 0xe3, 0x23, 0x48, 0x5d, 0x2c, 0x63, 0xd0, - 0xe0, 0xdb, 0x0a, 0xcb, 0xff, 0xca, 0x2d, 0xe4, 0xa6, 0x71, 0x8e, 0xec, - 0x34, 0x4c, 0x37, 0xff, 0xf6, 0x6d, 0x70, 0xf6, 0x14, 0xf7, 0x70, 0x3f, - 0xfb, 0x47, 0x5f, 0xfe, 0xe3, 0x81, 0x45, 0x7d, 0x26, 0xe3, 0x52, 0x3a, - 0xec, 0x50, 0x51, 0x57, 0xf5, 0x7a, 0xe5, 0xed, 0x3a, 0xff, 0xe6, 0x86, - 0x6f, 0x2f, 0xdf, 0xc3, 0x12, 0x3a, 0xfc, 0xd5, 0xb5, 0x6d, 0x46, 0xcb, - 0x54, 0x75, 0xfb, 0x17, 0xf3, 0x76, 0xb3, 0xaf, 0xe8, 0x5e, 0x02, 0x36, - 0x9d, 0x41, 0x3d, 0xae, 0x96, 0xdf, 0xee, 0x63, 0x20, 0x1f, 0x56, 0x75, - 0xfb, 0xb0, 0x14, 0x54, 0xea, 0x43, 0xfd, 0xe1, 0x16, 0xc1, 0xa5, 0xfe, - 0x87, 0x9f, 0xca, 0xbf, 0x0e, 0xbf, 0x3f, 0x24, 0xeb, 0x3a, 0x84, 0xf6, - 0x7f, 0x33, 0xbf, 0xda, 0x8c, 0x10, 0xf6, 0x0e, 0xbf, 0xa3, 0x04, 0x3d, - 0x83, 0xaf, 0x7f, 0xc9, 0xbe, 0x1e, 0xd6, 0x8c, 0x2f, 0xff, 0x71, 0x3f, - 0xc5, 0x73, 0xdf, 0xc6, 0xe1, 0x3a, 0xff, 0xfc, 0x9c, 0xeb, 0xfc, 0x0e, - 0x4b, 0xb1, 0xb4, 0x30, 0x75, 0xff, 0x37, 0xf7, 0xb0, 0xce, 0xa4, 0xc7, - 0x5f, 0x7e, 0xbc, 0x09, 0xd6, 0xcd, 0xcf, 0x7b, 0x60, 0xf2, 0xfe, 0x8e, - 0x44, 0xb5, 0x87, 0x53, 0x13, 0x8f, 0xe1, 0xc7, 0x53, 0x06, 0x16, 0xbe, - 0x2b, 0xbf, 0xfd, 0x0c, 0xd7, 0xfe, 0x4e, 0xa2, 0xbd, 0x43, 0xaf, 0xe5, - 0xc6, 0x0f, 0xb6, 0x4e, 0xb6, 0x8e, 0xbf, 0x46, 0x0f, 0xb6, 0x4e, 0xbd, - 0xa7, 0xdf, 0xe1, 0xf3, 0x4c, 0x5c, 0xb1, 0x0b, 0xba, 0x8b, 0x47, 0xa7, - 0xa1, 0x61, 0x7f, 0x7a, 0x17, 0xb4, 0x12, 0x3a, 0xef, 0x21, 0xd5, 0x23, - 0xc4, 0x54, 0xbe, 0xff, 0xff, 0x37, 0xb1, 0xec, 0xef, 0xc1, 0xc9, 0xd3, - 0x07, 0x79, 0x68, 0xeb, 0xf3, 0x7e, 0xce, 0xb0, 0xeb, 0x0e, 0x22, 0x39, - 0xd9, 0xaf, 0xff, 0x78, 0x5c, 0x1d, 0xc4, 0x0f, 0xfe, 0xd1, 0xd7, 0xfd, - 0x13, 0xfd, 0x97, 0x7f, 0x79, 0xce, 0xa8, 0x44, 0x37, 0x12, 0x6f, 0xfe, - 0xcd, 0xe5, 0xf3, 0xae, 0xc8, 0x10, 0x9d, 0x7c, 0x91, 0xbe, 0x8e, 0xbf, - 0x7d, 0xf0, 0xc0, 0x0e, 0xaf, 0x1e, 0x4e, 0xd2, 0x1b, 0xef, 0x7b, 0x1b, - 0x3a, 0xff, 0xf4, 0x78, 0x11, 0x2c, 0xdf, 0xd3, 0xfe, 0xd9, 0xd7, 0xb4, - 0xe0, 0x3a, 0xa1, 0x15, 0xd8, 0x48, 0x84, 0x5e, 0x4d, 0xbf, 0xfe, 0xea, - 0x6a, 0x25, 0xf3, 0x3a, 0x9c, 0xeb, 0x9d, 0x7f, 0x38, 0x39, 0xc4, 0xe1, - 0xd7, 0xbd, 0xf3, 0x0e, 0xa0, 0x1e, 0x4f, 0xd2, 0xcb, 0xfb, 0x48, 0xaa, - 0xdf, 0xc7, 0x5f, 0xff, 0xfb, 0x99, 0xb6, 0x07, 0xdf, 0x3e, 0x8c, 0x75, - 0xd3, 0xd1, 0xed, 0x1d, 0x7f, 0x0e, 0x6b, 0xe3, 0x1a, 0x47, 0x56, 0xe8, - 0xcd, 0xe1, 0x6e, 0xd6, 0xeb, 0xef, 0x9b, 0x76, 0x27, 0x3a, 0xb0, 0xf7, - 0x55, 0x33, 0xb3, 0x59, 0xd7, 0xe5, 0xf3, 0x03, 0xe3, 0xae, 0xf6, 0x1d, - 0x7f, 0xf9, 0xa6, 0x30, 0xb7, 0x4e, 0xbf, 0xbb, 0x07, 0x54, 0x1e, 0xff, - 0xe2, 0xb7, 0xfb, 0xa9, 0x33, 0xb3, 0x52, 0x3a, 0xfe, 0x1f, 0x3a, 0xd3, - 0xc7, 0x5f, 0xf9, 0x3d, 0xff, 0x1f, 0x5f, 0x17, 0xe3, 0xaa, 0x0f, 0xb1, - 0xca, 0xef, 0xfb, 0x13, 0x16, 0x39, 0x3b, 0x9d, 0x7e, 0x8f, 0x68, 0x1f, - 0x9d, 0x4d, 0x52, 0x7a, 0xf0, 0x27, 0x90, 0x86, 0x61, 0x17, 0x61, 0x3e, - 0x24, 0x1e, 0x35, 0xbf, 0xff, 0x74, 0x73, 0xdd, 0x4c, 0xdf, 0xd9, 0xb6, - 0x34, 0x75, 0xff, 0xce, 0x3d, 0x84, 0x0a, 0x6b, 0x24, 0x75, 0xe8, 0x07, - 0xd3, 0xaf, 0xec, 0xdb, 0xd4, 0x04, 0xc7, 0x56, 0x23, 0x85, 0xd5, 0x45, - 0x03, 0x43, 0xb7, 0xbe, 0x87, 0x0e, 0xbc, 0xd3, 0xd3, 0x48, 0xea, 0x73, - 0xc1, 0xd0, 0xed, 0xf7, 0xc5, 0xfc, 0x61, 0xd7, 0xb1, 0x81, 0x3a, 0xfe, - 0x76, 0xe3, 0xd9, 0x39, 0xd5, 0x87, 0x90, 0x23, 0x77, 0xed, 0xdb, 0x9b, - 0x50, 0x75, 0x94, 0x6a, 0x99, 0xe7, 0xed, 0x21, 0x86, 0xa4, 0x91, 0x11, - 0x8b, 0x06, 0x11, 0x59, 0x28, 0x2d, 0x91, 0xa1, 0xee, 0xef, 0x34, 0x2c, - 0x79, 0x0a, 0xc5, 0x91, 0x76, 0x33, 0xc7, 0x3a, 0x04, 0x26, 0x06, 0x34, - 0xed, 0x47, 0xf3, 0xe8, 0xd4, 0xbf, 0x7b, 0x6c, 0x87, 0x65, 0xbb, 0xe9, - 0x05, 0xff, 0xf7, 0x13, 0x79, 0x69, 0x3d, 0xd8, 0xe7, 0xa0, 0xeb, 0xf7, - 0x18, 0xee, 0xc3, 0x45, 0x5d, 0x7b, 0x90, 0xb3, 0xaf, 0xf4, 0x73, 0xd0, - 0x30, 0x03, 0xaf, 0xfa, 0x4a, 0x67, 0x18, 0xee, 0xc3, 0x44, 0x79, 0x7f, - 0xd1, 0x28, 0xe4, 0xf1, 0xc9, 0xce, 0xbf, 0xf4, 0x79, 0x3f, 0x69, 0xe4, - 0xa7, 0x98, 0xeb, 0xfe, 0xdd, 0x89, 0xae, 0xa7, 0x90, 0xeb, 0x28, 0x14, - 0xf1, 0xf1, 0x3f, 0x86, 0x7d, 0x1b, 0x73, 0x01, 0x45, 0xd1, 0xcf, 0x91, - 0x2f, 0xdc, 0x63, 0xbb, 0x0d, 0x16, 0x0d, 0xe5, 0x62, 0x73, 0xaf, 0xff, - 0xe1, 0xfd, 0xe7, 0x5e, 0x6c, 0xff, 0xcc, 0xe4, 0xbe, 0xc8, 0xeb, 0xf6, - 0x0e, 0x7b, 0x47, 0x5f, 0xee, 0x3a, 0xfe, 0xf1, 0xf7, 0x3a, 0xca, 0x62, - 0x61, 0x8a, 0x99, 0xb0, 0x75, 0xd8, 0xbe, 0x92, 0xdf, 0xe5, 0x33, 0x8c, - 0x77, 0x61, 0xa2, 0xca, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x5a, 0x77, 0xfc, - 0xe1, 0xeb, 0xcd, 0xd4, 0x59, 0xd6, 0x53, 0x0f, 0xad, 0x66, 0x77, 0xe6, - 0x8e, 0xd4, 0xda, 0xa6, 0xa9, 0xab, 0x3a, 0xff, 0x9a, 0x5d, 0x46, 0xc2, - 0xee, 0xc3, 0xaf, 0xcd, 0x1d, 0xa1, 0xac, 0x83, 0xaf, 0xf7, 0xd5, 0xe7, - 0xb4, 0x9a, 0x3a, 0xc8, 0x75, 0x34, 0x8f, 0x0f, 0x64, 0xd2, 0xff, 0xfe, - 0x4e, 0xb8, 0xfa, 0x59, 0xcc, 0x81, 0x1c, 0xf1, 0xd7, 0xed, 0xae, 0x1c, - 0x59, 0xd7, 0xcb, 0x8d, 0xf4, 0x75, 0xff, 0xc9, 0x8e, 0x08, 0x97, 0x23, - 0x04, 0xeb, 0xe4, 0xdb, 0xdd, 0xa7, 0x54, 0x93, 0x03, 0xc5, 0x59, 0x8a, - 0x04, 0x8b, 0x47, 0xf7, 0xf9, 0x7f, 0x56, 0x05, 0xa0, 0x0e, 0xbf, 0x7c, - 0xe7, 0x3f, 0xe9, 0xd7, 0xe4, 0x56, 0x05, 0x87, 0x56, 0x8f, 0x47, 0xc5, - 0x75, 0x08, 0xa8, 0xc8, 0x43, 0x5f, 0xff, 0x0b, 0x3a, 0x9d, 0x4e, 0x44, - 0xcd, 0xe7, 0x4e, 0xbf, 0xf2, 0xd6, 0xf2, 0xd9, 0xff, 0xa9, 0xc3, 0xaf, - 0xcf, 0xaf, 0x40, 0x4e, 0xa8, 0x3e, 0x8f, 0xd0, 0xaf, 0xf3, 0xf2, 0x4f, - 0xe7, 0x61, 0xd5, 0x09, 0x85, 0x76, 0x16, 0xff, 0x91, 0x5f, 0x47, 0xd8, - 0xe9, 0xd7, 0xcc, 0x77, 0x61, 0xa2, 0xdc, 0xbe, 0x9a, 0x03, 0x87, 0x5f, - 0xfb, 0x39, 0x83, 0xf3, 0xb9, 0xbb, 0x67, 0x5f, 0x84, 0x0f, 0xbe, 0x8e, - 0xa8, 0x3e, 0x77, 0x40, 0xad, 0xd1, 0xef, 0xc2, 0x27, 0x2d, 0xd4, 0x22, - 0x2f, 0xf3, 0x88, 0x26, 0x18, 0x59, 0xd7, 0x96, 0x28, 0x75, 0x84, 0xeb, - 0xfe, 0xef, 0xef, 0xac, 0xc1, 0x54, 0xeb, 0xf6, 0x9f, 0x77, 0x09, 0xd6, - 0x40, 0x9e, 0xff, 0x8e, 0x2a, 0x11, 0x5f, 0x83, 0x5d, 0x6e, 0xbf, 0xe8, - 0x71, 0xee, 0x60, 0xb0, 0xeb, 0xfd, 0xef, 0x24, 0xeb, 0x81, 0x3a, 0xa4, - 0x7c, 0xd8, 0x69, 0x7f, 0xd0, 0x3f, 0xae, 0x35, 0xe4, 0x3a, 0xf4, 0x67, - 0x0e, 0xbf, 0xdd, 0x89, 0x26, 0xce, 0x2c, 0xea, 0x09, 0xe7, 0x68, 0x6a, - 0xfd, 0xf3, 0x7d, 0x22, 0xa7, 0x59, 0xe7, 0x3c, 0xdd, 0xc8, 0xaf, 0xfe, - 0x96, 0x75, 0x38, 0x1e, 0xc0, 0xb0, 0xeb, 0xfd, 0xbc, 0xa0, 0x7d, 0x80, - 0x3a, 0xfb, 0x40, 0x4f, 0x1d, 0x4e, 0x8b, 0xed, 0x14, 0xfe, 0x85, 0xf4, - 0xca, 0xfc, 0xfc, 0xf6, 0x74, 0xeb, 0xff, 0x20, 0x22, 0x41, 0xec, 0x0b, - 0x0e, 0xa9, 0x1f, 0x17, 0x89, 0xaf, 0xef, 0x4b, 0x39, 0x9a, 0x3a, 0x8e, - 0xbd, 0xfb, 0xf8, 0xeb, 0xbf, 0x83, 0xaa, 0x46, 0xcb, 0xc3, 0x94, 0x75, - 0xf6, 0xec, 0x4e, 0x1d, 0x7a, 0x16, 0xa6, 0x22, 0x27, 0x73, 0xc5, 0x90, - 0xf8, 0x2a, 0xa1, 0x32, 0x6c, 0x22, 0x48, 0x5a, 0xde, 0x1f, 0x6c, 0x9d, - 0x7b, 0xe3, 0x56, 0xd5, 0x9d, 0x7f, 0xd2, 0x53, 0x38, 0xc7, 0x76, 0x1a, - 0x28, 0x7a, 0x44, 0x45, 0xcc, 0x3c, 0xe5, 0x17, 0xe0, 0x43, 0x31, 0x67, - 0x5f, 0x44, 0xd8, 0x13, 0xab, 0x87, 0x8f, 0xa2, 0x6b, 0xfe, 0xc8, 0x0f, - 0x63, 0x62, 0x26, 0x3a, 0xff, 0x01, 0x3b, 0xdc, 0x03, 0x9d, 0x4b, 0x3e, - 0xb0, 0x1d, 0x54, 0x22, 0xbd, 0xe1, 0x1b, 0x7f, 0xe7, 0x0c, 0x07, 0xa8, - 0x28, 0xb3, 0xaf, 0xfd, 0xb5, 0xf9, 0xa7, 0xee, 0xa2, 0x73, 0xaf, 0xf6, - 0xbf, 0x66, 0x78, 0x60, 0xea, 0x5a, 0x2b, 0x7a, 0x77, 0xe4, 0x0b, 0xff, - 0xbf, 0x97, 0x5f, 0x9b, 0xfa, 0x12, 0x73, 0xaf, 0xf4, 0xa3, 0x93, 0xc7, - 0x27, 0x3a, 0xfc, 0xfa, 0xdb, 0x9a, 0x3a, 0xa0, 0xf7, 0x00, 0x69, 0x7e, - 0x4f, 0x69, 0xd0, 0xeb, 0xfe, 0xe0, 0x38, 0xe3, 0xec, 0x01, 0xd4, 0x03, - 0xdc, 0xfc, 0x96, 0xf7, 0xde, 0x48, 0xeb, 0xfb, 0xef, 0xbf, 0x8c, 0x9c, - 0xea, 0x91, 0xe7, 0x4c, 0x3d, 0x7f, 0xf3, 0x06, 0x3c, 0x39, 0xb7, 0x39, - 0x23, 0xaf, 0xfb, 0xf1, 0x57, 0xef, 0x7b, 0xfe, 0x8e, 0xbf, 0xef, 0xb0, - 0x09, 0xa5, 0x1c, 0x9c, 0xeb, 0xf8, 0x5f, 0xdf, 0x61, 0x87, 0x52, 0xcf, - 0xa4, 0x4f, 0x2f, 0x84, 0x13, 0x80, 0xea, 0xc3, 0xc3, 0x42, 0x1b, 0xfd, - 0xaf, 0x9e, 0xf8, 0x1c, 0x13, 0xac, 0x03, 0xac, 0x9b, 0x9e, 0x37, 0x0d, - 0xaf, 0xcf, 0xbe, 0xbc, 0x87, 0x54, 0x2a, 0x05, 0xc2, 0x34, 0x43, 0xec, - 0x3a, 0x85, 0x9b, 0x45, 0x17, 0xe7, 0xfd, 0x58, 0xfa, 0x75, 0xf9, 0xa5, - 0x9c, 0x8d, 0x1d, 0x53, 0x1e, 0xa0, 0x95, 0x5f, 0xf3, 0xea, 0x26, 0xde, - 0x59, 0xb4, 0xeb, 0xff, 0xf0, 0x7b, 0x1f, 0x54, 0xf0, 0xb8, 0x35, 0xa8, - 0x01, 0x57, 0x07, 0x0e, 0xbf, 0x4f, 0x13, 0xbe, 0x8e, 0xac, 0x44, 0xa2, - 0x2b, 0xb8, 0xad, 0xc0, 0xfc, 0xeb, 0xf9, 0xc1, 0x30, 0xc0, 0x4e, 0xbf, - 0xe1, 0xc9, 0xc3, 0xdc, 0x1f, 0x1d, 0x50, 0x7f, 0x5d, 0x17, 0x12, 0xca, - 0x6a, 0x1b, 0x38, 0x96, 0xad, 0x0d, 0xa9, 0x9e, 0x34, 0x4e, 0x71, 0x19, - 0x64, 0xa1, 0xe4, 0x18, 0xcc, 0x32, 0x32, 0xd5, 0x50, 0x99, 0x0e, 0x0d, - 0xe1, 0x28, 0x84, 0x33, 0x47, 0x21, 0xc8, 0xf1, 0xd7, 0x0b, 0xee, 0xc6, - 0x4a, 0xf0, 0xd3, 0x01, 0x80, 0xc2, 0x8b, 0x4f, 0xbe, 0x94, 0xed, 0xfc, - 0x2b, 0xb6, 0x91, 0x6c, 0xc3, 0x3f, 0xec, 0x29, 0xef, 0xff, 0xcc, 0x50, - 0x1c, 0xcd, 0xd9, 0xd4, 0xf6, 0x9f, 0x73, 0xa9, 0x45, 0x43, 0xdf, 0xc7, - 0x8d, 0x7d, 0x1c, 0x92, 0xce, 0xbe, 0xdf, 0x4e, 0xd6, 0x75, 0xe7, 0xe2, - 0xa7, 0x59, 0x49, 0xcf, 0x89, 0x08, 0x5b, 0x25, 0xbf, 0xca, 0x67, 0x18, - 0xee, 0xc3, 0x45, 0xe7, 0x50, 0xeb, 0x5c, 0xe4, 0xe0, 0x18, 0xc0, 0xb2, - 0x9e, 0xdf, 0xbc, 0xb3, 0xfe, 0x47, 0x04, 0xb5, 0x3e, 0xc2, 0xa8, 0x6b, - 0x5c, 0xfd, 0x42, 0x3f, 0x69, 0xbd, 0xfe, 0x53, 0x38, 0xc7, 0x76, 0x1a, - 0x29, 0x6b, 0xf7, 0x18, 0xee, 0xc3, 0x45, 0x85, 0x7f, 0xfe, 0x8c, 0x10, - 0xc7, 0x63, 0x7f, 0x60, 0xba, 0xce, 0xb6, 0x8e, 0xbf, 0xbf, 0xe2, 0x4e, - 0xeb, 0x3a, 0xca, 0x62, 0x30, 0x96, 0x67, 0xa5, 0x1d, 0x91, 0x0b, 0xfc, - 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x59, 0x77, 0x71, 0x53, 0xaf, 0x94, 0x55, - 0xa2, 0x6a, 0x0e, 0xa2, 0xaf, 0x29, 0xf5, 0x67, 0x53, 0x0f, 0x5f, 0x45, - 0xdf, 0x85, 0x50, 0xa2, 0x7b, 0x4d, 0xd7, 0x47, 0x4e, 0xb0, 0x0e, 0xb9, - 0x59, 0xce, 0xb7, 0x24, 0x6a, 0x30, 0x42, 0x98, 0x7c, 0x6e, 0x7b, 0x72, - 0x00, 0xeb, 0xfe, 0x7d, 0xc7, 0x37, 0xf4, 0x2a, 0x75, 0xfe, 0x9f, 0x7d, - 0x40, 0x7c, 0x87, 0x5f, 0xa3, 0x36, 0xc6, 0x8e, 0xb4, 0x39, 0xed, 0xb6, - 0x69, 0x4e, 0x8b, 0xb1, 0x84, 0xa5, 0xf3, 0xca, 0x41, 0x3a, 0xfe, 0x7e, - 0x47, 0x9f, 0xa7, 0x5e, 0x6d, 0xb6, 0xca, 0xbf, 0xe8, 0x96, 0xfe, 0xe4, - 0x66, 0xe5, 0x28, 0x5f, 0xdf, 0xf7, 0xef, 0xbe, 0x79, 0x37, 0x6c, 0xeb, - 0xa3, 0x47, 0x50, 0x53, 0x04, 0xe9, 0x08, 0xa5, 0x69, 0x27, 0x69, 0xdd, - 0xcd, 0x13, 0x50, 0x75, 0xfc, 0x8f, 0xa0, 0x6b, 0xf3, 0xaf, 0xfe, 0x49, - 0x3e, 0x9c, 0x7f, 0x66, 0x68, 0xab, 0xff, 0xfb, 0xa9, 0xee, 0xe6, 0x87, - 0x17, 0xfe, 0xba, 0xf2, 0x3a, 0xff, 0x44, 0xbc, 0xfd, 0x70, 0x9d, 0x50, - 0x8c, 0xdc, 0x42, 0xe2, 0xd5, 0xa4, 0x75, 0xa4, 0x75, 0xa4, 0x75, 0x41, - 0xb0, 0x54, 0x41, 0x04, 0x2f, 0xef, 0xf5, 0xd7, 0x96, 0x1d, 0x7f, 0xfd, - 0xa4, 0x66, 0x0f, 0x20, 0x70, 0x38, 0xa9, 0xd4, 0xb3, 0xf9, 0xf1, 0x6d, - 0xb7, 0x3a, 0xca, 0x9d, 0x6f, 0xce, 0xa1, 0x34, 0x5a, 0x11, 0xac, 0x3f, - 0x5d, 0x11, 0x78, 0xce, 0xed, 0x2a, 0x75, 0xb0, 0xeb, 0xbf, 0x04, 0x1a, - 0x60, 0x8b, 0xdc, 0x90, 0x75, 0xfc, 0x30, 0xb1, 0x8c, 0x3a, 0xe9, 0x41, - 0xd5, 0x39, 0xff, 0x84, 0xb6, 0x61, 0x4f, 0xca, 0x6f, 0xff, 0xff, 0xbb, - 0x1e, 0xd2, 0x6b, 0x51, 0xee, 0xa4, 0x70, 0x0b, 0x79, 0x4b, 0xca, 0x9d, - 0x72, 0x6e, 0x75, 0xd0, 0xb3, 0xaf, 0xff, 0xd0, 0x3f, 0xca, 0x51, 0xee, - 0xe2, 0xfe, 0xc0, 0x0e, 0xbf, 0xfe, 0x41, 0xfe, 0x59, 0xae, 0x42, 0x49, - 0xf4, 0x55, 0x49, 0x14, 0x7e, 0x56, 0xb9, 0x8a, 0x42, 0xff, 0xfc, 0xf0, - 0x85, 0x91, 0x08, 0x61, 0xa1, 0x91, 0x95, 0x2a, 0x98, 0xc2, 0x0e, 0x43, - 0xe9, 0xd7, 0x86, 0x31, 0xbd, 0x43, 0x4f, 0xc7, 0xfb, 0x5f, 0x76, 0x45, - 0xbe, 0xc2, 0xe2, 0xff, 0xf2, 0x8b, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, - 0x14, 0x65, 0xfb, 0x6c, 0x72, 0x00, 0x75, 0xf8, 0x5c, 0x11, 0xf4, 0xeb, - 0xff, 0x26, 0xf2, 0xd0, 0xe7, 0xbb, 0xf9, 0xd7, 0xfc, 0x9c, 0xee, 0x60, - 0xcb, 0x47, 0x5b, 0x79, 0x1f, 0xab, 0x0f, 0xef, 0xfc, 0xf2, 0x67, 0x51, - 0x71, 0xc5, 0x4e, 0xb2, 0x90, 0x99, 0x5f, 0x4a, 0x3d, 0x09, 0xc6, 0xca, - 0x6a, 0x4c, 0xcf, 0x5e, 0x46, 0x02, 0xb4, 0x67, 0xa4, 0x6e, 0x6a, 0x30, - 0x6f, 0x47, 0x05, 0x7f, 0xf2, 0x8f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, - 0x39, 0xbf, 0xfc, 0xa2, 0xde, 0x4a, 0x67, 0x18, 0xee, 0xc3, 0x44, 0xe5, - 0x7f, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x8b, 0x32, 0xff, 0xa5, 0xa7, 0x5a, - 0x9d, 0xf0, 0x0e, 0xbf, 0xe6, 0x8c, 0x1c, 0x5c, 0x6f, 0x0b, 0x3a, 0xff, - 0x72, 0x3d, 0xd7, 0xde, 0x47, 0x5f, 0xff, 0xff, 0x44, 0xdd, 0x8f, 0x47, - 0xd4, 0xe4, 0xd1, 0xdc, 0xdb, 0x9d, 0xc0, 0xed, 0xc3, 0xa8, 0x08, 0xb4, - 0x13, 0x3b, 0xfe, 0xcd, 0x3f, 0x81, 0xf4, 0x64, 0x75, 0xfe, 0xcd, 0x73, - 0x99, 0xbe, 0x8e, 0xbd, 0xcc, 0x59, 0xd7, 0xc8, 0x39, 0xa3, 0xad, 0x9e, - 0x37, 0x5b, 0x03, 0x77, 0xfe, 0x41, 0x8d, 0x47, 0xa7, 0xc6, 0xce, 0xbf, - 0xb8, 0xce, 0xba, 0x34, 0xce, 0xbf, 0x38, 0xc6, 0xdf, 0xce, 0xbb, 0x75, - 0x9d, 0x65, 0x1a, 0x85, 0x51, 0xf1, 0x0f, 0x29, 0xc8, 0xa4, 0x72, 0x16, - 0xd5, 0x94, 0xfe, 0x7b, 0xb4, 0xc3, 0x64, 0xa2, 0xff, 0x29, 0x9c, 0x63, - 0xbb, 0x0d, 0x16, 0xed, 0xfc, 0x2e, 0xa7, 0x27, 0xe9, 0xd7, 0x93, 0x70, - 0x1d, 0x7f, 0xf7, 0x1d, 0x80, 0xff, 0x5e, 0x8d, 0xdb, 0x3a, 0xe1, 0x54, - 0xeb, 0xe6, 0x3b, 0xb0, 0xd1, 0x48, 0x56, 0x1e, 0x1f, 0x05, 0xaf, 0xf4, - 0xbc, 0x8d, 0xe8, 0x08, 0x75, 0xff, 0xb3, 0xa9, 0xb7, 0xb9, 0x82, 0xc3, - 0xaf, 0x3c, 0x94, 0x0a, 0x63, 0x79, 0x08, 0xad, 0xc8, 0x74, 0x67, 0x79, - 0xc6, 0x47, 0x59, 0x46, 0x27, 0xa9, 0xc2, 0xe5, 0xc6, 0x6e, 0xda, 0xad, - 0xff, 0xca, 0x3c, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x89, 0x4a, 0xa7, 0x5e, - 0xf7, 0x99, 0x45, 0x6a, 0xee, 0x7e, 0x09, 0x59, 0x23, 0x09, 0x7f, 0x4a, - 0x13, 0xd8, 0x4c, 0xbf, 0xd2, 0x41, 0xf6, 0x20, 0x4e, 0xbd, 0xaf, 0xd6, - 0x75, 0x94, 0xdc, 0xf3, 0x50, 0xc2, 0xf0, 0xbc, 0x8e, 0xbf, 0x71, 0x8e, - 0xec, 0x34, 0x4e, 0xd7, 0xff, 0x67, 0x45, 0xe5, 0xf8, 0x16, 0xf2, 0x3a, - 0xf3, 0xc9, 0x4c, 0x3f, 0x61, 0x33, 0xba, 0x76, 0xb3, 0xaf, 0xff, 0xc8, - 0x1f, 0xd7, 0x1b, 0x0e, 0x11, 0x81, 0xc6, 0x1d, 0x7f, 0xa5, 0x1c, 0x9e, - 0x39, 0x39, 0xd7, 0xfe, 0xe8, 0xbc, 0xbf, 0x02, 0xde, 0x47, 0x54, 0x1f, - 0x96, 0x1a, 0x59, 0x4c, 0x4f, 0x0d, 0x70, 0x90, 0xe9, 0x93, 0x8d, 0x0c, - 0x31, 0xef, 0xff, 0x94, 0xfb, 0xb2, 0xe2, 0x0c, 0xf4, 0x0a, 0x00, 0xeb, - 0xff, 0x9d, 0x7d, 0xc6, 0x3f, 0x63, 0xec, 0x8e, 0xbc, 0x81, 0x73, 0xaf, - 0xfe, 0x1c, 0xeb, 0xcf, 0x9a, 0x17, 0xdc, 0xeb, 0xb6, 0x54, 0x0a, 0x28, - 0x3a, 0x89, 0xa1, 0xaa, 0x92, 0xb7, 0x75, 0xc7, 0xd9, 0xa5, 0x9d, 0x98, - 0x79, 0x5f, 0xff, 0xc1, 0x7f, 0x29, 0x9a, 0x81, 0xdc, 0x1a, 0xd4, 0x00, - 0xeb, 0xf7, 0x18, 0xee, 0xc3, 0x44, 0x59, 0x7f, 0xe7, 0x92, 0x99, 0xc6, - 0x3b, 0xb0, 0xd1, 0x2e, 0xdf, 0xff, 0xd8, 0x1e, 0xc7, 0xd5, 0x3c, 0x2e, - 0x0d, 0x6a, 0x00, 0x55, 0x94, 0xc4, 0x6c, 0xac, 0xcf, 0x65, 0x2a, 0xff, - 0xe5, 0xbc, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x89, 0x8a, 0xff, 0xfb, 0x19, - 0x0a, 0x75, 0xd3, 0x65, 0x01, 0x81, 0x3a, 0x94, 0x45, 0x07, 0x54, 0x2f, - 0xdc, 0x63, 0xbb, 0x0d, 0x15, 0x4d, 0xb0, 0xea, 0xc3, 0xc2, 0x54, 0xce, - 0xff, 0xdf, 0xbf, 0x24, 0x38, 0xdb, 0x80, 0xeb, 0xff, 0x9f, 0x5c, 0x46, - 0xfd, 0xd4, 0xe4, 0x8e, 0xbf, 0xee, 0x3f, 0x77, 0x96, 0x79, 0x40, 0xa2, - 0x0b, 0xa7, 0xd4, 0xa2, 0x3d, 0xde, 0x14, 0x97, 0xff, 0x94, 0x5b, 0xc9, - 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0x9d, 0x2f, 0xf2, 0x3f, 0x22, 0x4f, 0xb4, - 0xeb, 0xf4, 0xd1, 0x34, 0x68, 0xeb, 0xf9, 0xbc, 0x4d, 0xb8, 0x27, 0x52, - 0x1e, 0xae, 0x8a, 0x2f, 0x27, 0x60, 0xe5, 0x0d, 0x0d, 0xff, 0xdf, 0xeb, - 0xd1, 0xba, 0x9f, 0xcc, 0x8b, 0x3a, 0x96, 0x7e, 0x9d, 0x2b, 0xbf, 0xf3, - 0xc9, 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0x9d, 0xef, 0xde, 0xfd, 0xd6, 0x85, - 0x5f, 0xf8, 0x63, 0xd9, 0xac, 0xcd, 0xe4, 0x75, 0x05, 0x3e, 0xbc, 0x8c, - 0x71, 0x64, 0x4e, 0x95, 0xe2, 0x7b, 0xfe, 0x0c, 0x4a, 0x14, 0x6f, 0x40, - 0x3a, 0xfe, 0x85, 0x00, 0x38, 0x13, 0xa9, 0x44, 0x5a, 0xe2, 0x78, 0x9d, - 0x5f, 0xfe, 0x51, 0x6f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x85, 0xbf, - 0xfe, 0x7f, 0x4b, 0x05, 0x02, 0xa6, 0xa7, 0x8e, 0x1d, 0x7f, 0xff, 0xfb, - 0xbf, 0xad, 0x6f, 0x25, 0x19, 0xdf, 0xfd, 0x03, 0x93, 0xab, 0xfc, 0x4c, - 0x75, 0xfb, 0xfd, 0xfc, 0x8c, 0x3a, 0xfd, 0x80, 0xc7, 0x13, 0xaf, 0xb4, - 0x8d, 0xf8, 0xeb, 0xd0, 0x05, 0x27, 0x3e, 0xf1, 0x29, 0xf1, 0x25, 0x22, - 0x65, 0xc3, 0x0e, 0xdb, 0xff, 0xca, 0x2d, 0xe4, 0xa6, 0x71, 0x8e, 0xec, - 0x34, 0x52, 0x57, 0xff, 0xfb, 0x34, 0xa7, 0xdc, 0x9b, 0xae, 0xbf, 0x76, - 0x3d, 0xfa, 0xce, 0xa8, 0x64, 0xb7, 0xcf, 0x19, 0xa4, 0xa1, 0xb2, 0xc8, - 0xd7, 0x78, 0x50, 0xb9, 0x5e, 0xe0, 0x2f, 0x15, 0x7f, 0x46, 0xfb, 0xf9, - 0x3e, 0xca, 0xbd, 0xfe, 0x53, 0x38, 0xc7, 0x76, 0x1a, 0x22, 0x4b, 0xff, - 0xca, 0x2d, 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x4b, 0xd7, 0x9a, 0x85, - 0x80, 0xeb, 0xee, 0x7f, 0xed, 0x1d, 0x7e, 0xe0, 0x16, 0x9a, 0x3a, 0xf4, - 0x0e, 0xe7, 0x5f, 0xbd, 0xf5, 0x63, 0x07, 0x59, 0x3a, 0x78, 0x62, 0x37, - 0x7f, 0xfb, 0xbb, 0x60, 0x40, 0xd7, 0x81, 0xce, 0x6e, 0x75, 0xd1, 0xe3, - 0xaf, 0xf9, 0xe7, 0xe4, 0x6f, 0x24, 0x59, 0xd7, 0xff, 0xbf, 0x0a, 0x73, - 0xec, 0xdb, 0x1f, 0xb8, 0xcc, 0x75, 0x49, 0x31, 0x44, 0x26, 0x02, 0x70, - 0x8a, 0xe8, 0xe6, 0xfe, 0x07, 0x63, 0x88, 0xb3, 0xaf, 0xfd, 0x36, 0xa3, - 0x6b, 0xf6, 0x37, 0x98, 0xea, 0x83, 0xee, 0x72, 0xcb, 0xf6, 0x4f, 0x9a, - 0x59, 0xd7, 0xff, 0x4d, 0xf3, 0xe8, 0xc6, 0xd7, 0xdb, 0x13, 0x1d, 0x47, - 0x5f, 0xa4, 0xfe, 0x7d, 0xa7, 0x5f, 0x9f, 0x51, 0xb7, 0x0e, 0xa9, 0x8f, - 0x3f, 0x69, 0x45, 0x42, 0x32, 0xb1, 0x31, 0xd6, 0x6e, 0xe4, 0x1d, 0x41, - 0x57, 0x56, 0x84, 0x73, 0x46, 0xfd, 0xc8, 0x5b, 0x89, 0x06, 0xd8, 0x78, - 0xec, 0x16, 0xdd, 0x82, 0x75, 0xfd, 0xf3, 0x5d, 0xc4, 0xf1, 0xd4, 0x13, - 0xc2, 0x41, 0x4b, 0x83, 0xb9, 0xd7, 0xf0, 0xff, 0xe9, 0xa1, 0x53, 0xaf, - 0x34, 0xd3, 0x87, 0x59, 0x1c, 0xf3, 0xbf, 0x2f, 0xbf, 0x0e, 0x4f, 0xf7, - 0x69, 0xd7, 0xd9, 0x3f, 0xdd, 0xa7, 0x5f, 0x83, 0x1b, 0x85, 0xfe, 0x1e, - 0x88, 0x95, 0xdf, 0xff, 0x27, 0x3e, 0x76, 0x13, 0xda, 0xfd, 0x9f, 0xc1, - 0xd7, 0xc9, 0x38, 0x1a, 0xce, 0xbe, 0x63, 0xbb, 0x0d, 0x14, 0xbd, 0xf0, - 0xfa, 0x38, 0x75, 0xff, 0x67, 0x1a, 0xf0, 0x39, 0xcd, 0xce, 0xa4, 0x3d, - 0xbd, 0xa4, 0x15, 0x24, 0xd8, 0x95, 0x40, 0x99, 0x4b, 0x84, 0xbd, 0x84, - 0x45, 0xfc, 0x1d, 0xe3, 0x89, 0xb9, 0xd7, 0xde, 0x9f, 0x1b, 0x3a, 0x90, - 0xf4, 0x44, 0xba, 0xff, 0xd0, 0x31, 0xdf, 0x9f, 0x8f, 0xec, 0x3a, 0xf7, - 0xef, 0xa3, 0xaf, 0xa6, 0xfd, 0xe6, 0x3a, 0xfd, 0x00, 0x7d, 0xf4, 0x75, - 0xe1, 0x40, 0x1d, 0x7b, 0x3d, 0xa3, 0xaa, 0x0d, 0xae, 0x86, 0xa8, 0x28, - 0xfc, 0x99, 0x03, 0xa3, 0x80, 0x24, 0xf2, 0xe5, 0xf9, 0xad, 0xc4, 0x3b, - 0x07, 0x5d, 0x1b, 0x9d, 0x7f, 0xc0, 0xd7, 0x23, 0x79, 0x22, 0xce, 0xbd, - 0xe7, 0xda, 0x75, 0xfa, 0x7f, 0xe6, 0x86, 0xb3, 0xaf, 0xbf, 0x9a, 0x1a, - 0xce, 0xb9, 0xe7, 0xf8, 0x7a, 0x73, 0x96, 0xd4, 0x23, 0x69, 0xce, 0x7f, - 0x70, 0xbf, 0xe4, 0xd4, 0xc8, 0x3e, 0x80, 0x1d, 0x7f, 0xf0, 0xfb, 0x6c, - 0x73, 0x4e, 0x30, 0xd6, 0x75, 0x49, 0x15, 0x8b, 0x2f, 0xd1, 0xbd, 0xfe, - 0x86, 0xbd, 0x42, 0xdf, 0xc7, 0x5c, 0xe2, 0x75, 0xff, 0x40, 0x3e, 0x76, - 0x16, 0xe2, 0x75, 0x6e, 0x79, 0x9b, 0x45, 0x2a, 0x48, 0xa5, 0xe4, 0x20, - 0x2f, 0xe8, 0x6d, 0x3b, 0xfb, 0x59, 0xd7, 0xf6, 0xf2, 0xd3, 0x8e, 0xe7, - 0x54, 0x2b, 0x24, 0x91, 0x66, 0x47, 0x38, 0x90, 0xd5, 0xe1, 0x47, 0xd3, - 0x1b, 0xdc, 0x85, 0x9d, 0x7f, 0x40, 0xcd, 0xe4, 0x54, 0xeb, 0xfe, 0x96, - 0x72, 0x6c, 0x18, 0x59, 0xd7, 0xe0, 0x43, 0x31, 0x67, 0x5f, 0xec, 0x9f, - 0x51, 0x37, 0xfc, 0x3a, 0x91, 0x12, 0x5c, 0x37, 0x12, 0x6b, 0xa5, 0x87, - 0x5f, 0x70, 0x61, 0x67, 0x5e, 0x80, 0x68, 0xea, 0x83, 0xfe, 0x09, 0x76, - 0x0a, 0xb6, 0x41, 0x7c, 0xfd, 0x79, 0xce, 0xbf, 0x77, 0xf5, 0x70, 0x4e, - 0xbf, 0xcd, 0x8b, 0xfa, 0x4e, 0x13, 0xaf, 0xfa, 0x3b, 0xa7, 0xf4, 0x73, - 0x60, 0xeb, 0xff, 0x2d, 0xc3, 0xf6, 0x69, 0x40, 0xee, 0x75, 0x04, 0xfe, - 0xd0, 0xea, 0xfb, 0x80, 0xfb, 0xb4, 0xeb, 0xc8, 0xdf, 0x8e, 0xae, 0x9e, - 0x16, 0x89, 0xaa, 0x74, 0xde, 0xc2, 0x43, 0xb9, 0x47, 0x61, 0x5b, 0xe6, - 0x3b, 0xfc, 0x3e, 0xcd, 0x23, 0xf4, 0xeb, 0xfe, 0x02, 0x77, 0x38, 0xf3, - 0x68, 0xeb, 0xff, 0xf4, 0x48, 0x62, 0x7f, 0xb3, 0x6b, 0xb9, 0xb1, 0xc0, - 0x1d, 0x7f, 0x7c, 0x5e, 0x79, 0xfc, 0x75, 0x98, 0x75, 0xdb, 0xeb, 0x0d, - 0xf3, 0x97, 0x5e, 0x84, 0x09, 0xd5, 0x09, 0xa3, 0xee, 0x60, 0xb3, 0x87, - 0x84, 0xce, 0x8b, 0x2f, 0xf6, 0x37, 0x24, 0xd7, 0xeb, 0x3a, 0xed, 0xba, - 0x3a, 0xfe, 0xff, 0x51, 0x37, 0xfc, 0x3a, 0xfd, 0x93, 0xe7, 0x74, 0x75, - 0x41, 0xf7, 0xf4, 0x60, 0x4c, 0x2f, 0x67, 0x34, 0x75, 0x30, 0xf2, 0x36, - 0x96, 0xdf, 0xf0, 0x20, 0x1f, 0x76, 0xc0, 0xec, 0x1d, 0x50, 0x9a, 0x6e, - 0x43, 0xad, 0x09, 0x2f, 0xff, 0xfe, 0xec, 0x73, 0x76, 0x26, 0xff, 0x15, - 0x7f, 0x9a, 0xeb, 0xb2, 0x04, 0x27, 0x5f, 0x22, 0xbb, 0x38, 0x75, 0xfd, - 0xf7, 0xd1, 0x38, 0xee, 0x75, 0xe1, 0x45, 0x9d, 0x5c, 0x3e, 0xe0, 0x12, - 0x78, 0xc2, 0xff, 0x0c, 0x38, 0xfb, 0x04, 0xeb, 0xfd, 0xd7, 0x99, 0x39, - 0x13, 0x9d, 0x76, 0x2c, 0xea, 0x0a, 0x71, 0x59, 0x0e, 0x55, 0x97, 0xb9, - 0x76, 0xd3, 0x3b, 0xf6, 0xc2, 0x2e, 0x34, 0x75, 0xf9, 0xf6, 0xe7, 0x34, - 0x75, 0x04, 0xf4, 0x56, 0x53, 0x7e, 0xeb, 0x8a, 0x2c, 0xeb, 0xe5, 0x66, - 0xd4, 0x1d, 0x7f, 0x03, 0x70, 0x67, 0x30, 0xeb, 0xf9, 0xc0, 0xb8, 0xcf, - 0x1d, 0x50, 0x7b, 0x08, 0x5b, 0x7f, 0x9c, 0x1a, 0x8e, 0xc6, 0x8e, 0xbf, - 0x6f, 0xed, 0x64, 0xe7, 0x5d, 0x93, 0x9d, 0x4e, 0x6f, 0xc4, 0xa6, 0xa1, - 0x37, 0x1c, 0x22, 0x42, 0x5e, 0xbd, 0x89, 0x06, 0x9c, 0x2e, 0x03, 0x0e, - 0xb6, 0x8e, 0xb9, 0x15, 0xd1, 0xa6, 0xfc, 0x5a, 0xf0, 0x1d, 0x87, 0x5f, - 0x37, 0x36, 0xa0, 0xeb, 0xfb, 0x42, 0xf3, 0xc7, 0x8e, 0xbf, 0x4e, 0xfa, - 0xc9, 0x1d, 0x7f, 0xfc, 0x1c, 0xda, 0xfc, 0x9b, 0xec, 0x9f, 0xce, 0xb3, - 0xaa, 0x0f, 0xe9, 0x09, 0xef, 0xe7, 0xdc, 0x0b, 0x4d, 0x1d, 0x50, 0x99, - 0x8e, 0xe3, 0x73, 0x11, 0xf2, 0x14, 0xdd, 0x20, 0xbf, 0xde, 0x46, 0xde, - 0x68, 0x59, 0xd6, 0x51, 0xab, 0x6e, 0x3a, 0x22, 0x5e, 0x64, 0xf0, 0xbc, - 0x91, 0x08, 0x59, 0x72, 0x3d, 0xad, 0xe1, 0x46, 0x91, 0x8e, 0x4d, 0x2d, - 0xbf, 0x8c, 0x6b, 0x1b, 0xec, 0x67, 0xaf, 0x1d, 0xb0, 0x23, 0x99, 0x18, - 0xe7, 0x35, 0x1d, 0xef, 0xa5, 0x09, 0x6c, 0xbd, 0x7d, 0x8d, 0x7f, 0x61, - 0x46, 0xff, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x14, 0xe5, 0xfe, 0x5c, 0x2f, - 0x36, 0x23, 0xc7, 0x5f, 0xf9, 0x38, 0xfa, 0xee, 0x60, 0xb0, 0xeb, 0xf2, - 0xf9, 0xcc, 0xd1, 0xd7, 0xff, 0xee, 0xff, 0xee, 0x47, 0xb5, 0x8c, 0xd4, - 0x71, 0x87, 0x5f, 0xff, 0xde, 0xc9, 0x85, 0x35, 0xe8, 0xfa, 0x9c, 0x9a, - 0x3a, 0x75, 0xfe, 0x45, 0x86, 0x35, 0xf8, 0x9d, 0x7f, 0x67, 0xb7, 0x94, - 0x36, 0x75, 0xff, 0x93, 0x7d, 0x0e, 0x07, 0xae, 0xd9, 0xd7, 0xff, 0xd9, - 0x3e, 0x6f, 0xed, 0x20, 0xc0, 0x1d, 0x67, 0x52, 0xa8, 0x8c, 0xd1, 0xf5, - 0xff, 0xb3, 0xb1, 0xcc, 0x51, 0xb6, 0xdb, 0x2a, 0xe4, 0x6c, 0xeb, 0xa7, - 0x52, 0x15, 0x57, 0x84, 0xd3, 0x0e, 0xd8, 0x4e, 0x8a, 0xdd, 0x5c, 0x13, - 0x2f, 0x42, 0xeb, 0x64, 0x93, 0x61, 0x06, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, - 0x5e, 0x5f, 0xff, 0xd8, 0x1e, 0xc7, 0xd5, 0x3c, 0x2e, 0x0d, 0x6a, 0x00, - 0x55, 0x94, 0xc4, 0x47, 0xec, 0x99, 0xdf, 0xfc, 0xa3, 0xc9, 0x4c, 0xe3, - 0x1d, 0xd8, 0x68, 0x91, 0xef, 0x33, 0x16, 0x75, 0xe4, 0x04, 0x1d, 0x79, - 0x98, 0xb2, 0x94, 0x2e, 0xaf, 0xdc, 0x63, 0xbb, 0x0d, 0x12, 0x45, 0xff, - 0xfd, 0x09, 0xc4, 0xd8, 0x81, 0x9e, 0x3c, 0x9d, 0x79, 0xce, 0xbf, 0xfc, - 0x38, 0x0d, 0x9c, 0xe4, 0x4e, 0xfc, 0x61, 0xd7, 0x49, 0x48, 0x4c, 0x13, - 0x0a, 0xfa, 0x67, 0xe5, 0xbb, 0xf6, 0x75, 0x4c, 0x59, 0xd6, 0x52, 0x13, - 0xa9, 0x78, 0xce, 0x7c, 0x93, 0x7f, 0xf2, 0x8f, 0x25, 0x33, 0x8c, 0x77, - 0x61, 0xa2, 0x4a, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x5e, 0x37, 0xfd, 0x25, - 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x4d, 0xb2, 0x98, 0x7f, 0x0e, 0x67, 0x7f, - 0x46, 0x91, 0x71, 0x31, 0xd6, 0xe9, 0xd4, 0xb3, 0x78, 0xd9, 0x65, 0xf9, - 0x01, 0xac, 0x13, 0xaf, 0xfe, 0x4f, 0xd9, 0xad, 0x3f, 0x3d, 0x0a, 0x9d, - 0x7f, 0xfd, 0xfb, 0xef, 0x98, 0xaa, 0xaf, 0x2c, 0xdf, 0xc7, 0x54, 0x91, - 0x78, 0x12, 0x5d, 0x22, 0xdf, 0xfc, 0xe0, 0x67, 0x53, 0x82, 0x9e, 0xd1, - 0xd7, 0x0c, 0xe7, 0x53, 0x9e, 0xc7, 0xd4, 0x2b, 0xb9, 0xe3, 0xaf, 0x4c, - 0x33, 0x9d, 0x73, 0xb0, 0xeb, 0xf9, 0x81, 0xfe, 0x7f, 0xab, 0x3a, 0xa0, - 0xf1, 0xf0, 0x56, 0xc2, 0x75, 0xdf, 0x7e, 0x9d, 0x40, 0x35, 0x3f, 0x43, - 0xee, 0xd9, 0x52, 0x15, 0x37, 0xe4, 0x37, 0xbb, 0x08, 0x87, 0x23, 0xd0, - 0xb7, 0x99, 0x3e, 0xa4, 0xd4, 0x3a, 0x58, 0xc9, 0xcf, 0xe5, 0x5c, 0x9f, - 0x86, 0x37, 0x34, 0x95, 0xdd, 0x34, 0x66, 0x2b, 0x2c, 0xec, 0x7f, 0x5e, - 0x3c, 0xfe, 0x19, 0x3f, 0x65, 0x69, 0x54, 0x4e, 0x7f, 0x30, 0xcf, 0x2c, - 0x0a, 0x53, 0xc9, 0x01, 0x9e, 0x24, 0xcc, 0x55, 0xe7, 0xab, 0x3c, 0x8c, - 0xcb, 0xe7, 0x3e, 0xde, 0xb6, 0x6d, 0x4a, 0x5c, 0x73, 0x5c, 0xa3, 0x19, - 0xad, 0xdf, 0x57, 0x2d, 0x66, 0x22, 0xf3, 0xcb, 0x7d, 0xed, 0x35, 0xc1, - 0xed, 0xfb, 0xc0, 0x29, 0x36, 0x6d, 0x39, 0x51, 0x83, 0x5c, 0xa8, 0x6a, - 0xbd, 0x3a, 0xf5, 0xf3, 0x12, 0xff, 0x6f, 0x48, 0x76, 0xd3, 0x70, 0xdb, - 0x9f, 0x6c, 0xd9, 0x9c, 0x4e, 0xfb, 0x49, 0xbc, 0xd8, 0xb4, 0xc9, 0x34, + 0x3a, 0x24, 0x02, 0x30, 0x83, 0x00, 0x18, 0xd0, 0xc6, 0xd1, 0x8a, 0x2e, + 0x21, 0x8a, 0x2e, 0x21, 0x8a, 0x91, 0xb0, 0xd0, 0xc5, 0x17, 0x10, 0xc5, + 0x17, 0x10, 0xc5, 0x17, 0x10, 0xc5, 0x17, 0x10, 0xc5, 0x48, 0xf8, 0x00, + 0x31, 0xe1, 0x8d, 0x81, 0x8a, 0x2e, 0x21, 0x8a, 0x2e, 0x21, 0x8a, 0x2e, + 0x21, 0x8a, 0x2e, 0x21, 0x8a, 0x9c, 0xf8, 0x15, 0x18, 0xe0, 0xc7, 0x46, + 0x2c, 0xa9, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x51, 0x71, + 0x0c, 0x51, 0x71, 0x0c, 0x50, 0x4f, 0x83, 0x71, 0x80, 0x0c, 0x7e, 0x31, + 0x45, 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x7e, 0xec, 0x03, + 0x58, 0x5c, 0x43, 0x14, 0x5c, 0x43, 0x15, 0x24, 0x4a, 0x30, 0x63, 0xa3, + 0x0e, 0x30, 0x03, 0x4b, 0x30, 0xb8, 0x86, 0x28, 0xb8, 0x86, 0x28, 0xb8, + 0x86, 0x28, 0xb8, 0x86, 0x28, 0xb8, 0x86, 0x2a, 0x47, 0xc1, 0xb8, 0xc2, + 0x0c, 0x6d, 0x18, 0xa2, 0xe2, 0x18, 0xa2, 0xe2, 0x18, 0xa2, 0xe2, 0x18, + 0xa2, 0xe2, 0x18, 0xa9, 0x1f, 0x00, 0x46, 0x3a, 0x30, 0x23, 0x16, 0xe9, + 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x5a, 0x45, 0xc4, 0x31, + 0x45, 0xc4, 0x31, 0xb9, 0x7d, 0x45, 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x45, + 0xc4, 0x31, 0x45, 0xc4, 0x31, 0x53, 0xa3, 0x5a, 0x43, 0x0a, 0x9b, 0x30, + 0xa2, 0x61, 0x80, 0x0c, 0x78, 0x62, 0xd8, 0x5c, 0x43, 0x14, 0x5c, 0x43, + 0x14, 0x5c, 0x43, 0x16, 0x91, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x6e, 0x5f, + 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x54, 0x22, 0x9a, 0x43, 0x08, 0x6d, + 0xc2, 0x85, 0x8c, 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, + 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x54, 0x1f, 0xc6, 0xe3, 0x1c, 0x18, + 0x58, 0xc0, 0x8c, 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, 0x51, 0x71, 0x0c, + 0x57, 0x0f, 0x23, 0x43, 0x1e, 0x18, 0xa2, 0xe2, 0x18, 0xa2, 0xe2, 0x18, + 0xa2, 0xe2, 0x18, 0xa5, 0x9e, 0x40, 0x8c, 0x78, 0x62, 0xcb, 0x2e, 0x21, + 0x8a, 0x2e, 0x21, 0x8a, 0x2e, 0x21, 0x8a, 0x01, 0xb0, 0xfc, 0x62, 0x8b, + 0x88, 0x62, 0x8b, 0x88, 0x62, 0x8b, 0x88, 0x62, 0x8b, 0x88, 0x62, 0xa0, + 0xf8, 0x26, 0x18, 0xe8, 0xc7, 0xe3, 0x15, 0x0c, 0xbc, 0x69, 0xe1, 0x01, + 0x24, 0xc0, 0xa9, 0x64, 0x2c, 0x19, 0x08, 0x9d, 0xe1, 0x02, 0x90, 0x9f, + 0x6b, 0x3e, 0x99, 0xff, 0x90, 0xd2, 0x5a, 0x4f, 0x5f, 0x9e, 0x13, 0xc0, + 0x3b, 0x18, 0x7a, 0x69, 0x9f, 0xd0, 0xc3, 0xfe, 0x18, 0x1b, 0x61, 0x20, + 0xdb, 0xbe, 0xc9, 0x77, 0xd4, 0xed, 0x88, 0x41, 0x5f, 0xa4, 0x31, 0x9a, + 0x2e, 0x21, 0x85, 0x13, 0x8e, 0xbc, 0x90, 0xb2, 0xe2, 0x18, 0xbe, 0x46, + 0x3f, 0x0f, 0x88, 0x65, 0xe4, 0x0e, 0x1f, 0x10, 0xcb, 0x29, 0xba, 0x30, + 0xf8, 0x8f, 0xd2, 0x8f, 0x16, 0xda, 0x36, 0xb3, 0xc9, 0xbe, 0xd3, 0xb8, + 0x6f, 0xf7, 0x51, 0xb0, 0xf2, 0x27, 0x3a, 0xf2, 0x6d, 0x69, 0x9d, 0x5b, + 0xa2, 0x3a, 0x63, 0x9f, 0x1a, 0x5f, 0xb3, 0x26, 0x7f, 0xa7, 0x5c, 0x08, + 0x3a, 0xfe, 0xe3, 0x8f, 0xd8, 0x01, 0xd7, 0x3f, 0x0e, 0xb2, 0x1c, 0xc2, + 0xd6, 0xcc, 0x3a, 0xcb, 0x3a, 0xed, 0x95, 0x11, 0x12, 0xbc, 0x15, 0xea, + 0x13, 0x8f, 0x7d, 0x10, 0xbf, 0xee, 0xc2, 0xf2, 0x68, 0x19, 0xce, 0xbf, + 0xfb, 0xe3, 0xb0, 0x3d, 0x80, 0x60, 0x80, 0xeb, 0x81, 0x07, 0x56, 0x1e, + 0xc8, 0x11, 0x2b, 0x13, 0x0c, 0x02, 0xd7, 0xf0, 0x91, 0xbf, 0xf8, 0x46, + 0x27, 0x1c, 0x4d, 0xb1, 0xb2, 0x75, 0xe8, 0xdf, 0x47, 0x53, 0x9f, 0x0e, + 0x91, 0x6f, 0x3f, 0x20, 0xeb, 0xf2, 0x6c, 0xb8, 0x80, 0xea, 0x91, 0xe1, + 0x2c, 0x6a, 0xff, 0xbe, 0xb8, 0x75, 0x8b, 0x86, 0xb3, 0xaf, 0x66, 0xed, + 0x9d, 0x7b, 0x70, 0x67, 0x0f, 0x64, 0x4f, 0x2f, 0xb6, 0xe7, 0x24, 0x75, + 0xe0, 0xb8, 0x9d, 0x48, 0x6f, 0x5c, 0x8e, 0xff, 0xfa, 0x3e, 0x3f, 0x38, + 0xe0, 0x85, 0x1b, 0x6d, 0xb3, 0xaa, 0x13, 0x5e, 0x77, 0xbd, 0x38, 0x7e, + 0x3f, 0x7f, 0xf7, 0xff, 0x66, 0xf9, 0x1f, 0x5d, 0x91, 0xd3, 0xa9, 0xa0, + 0xdf, 0xa5, 0x43, 0x94, 0xed, 0xf2, 0x8c, 0x94, 0x30, 0x9e, 0xc8, 0x5b, + 0x32, 0x34, 0x8d, 0xd5, 0xd2, 0x52, 0xfb, 0x5a, 0x2c, 0xd0, 0xba, 0xe1, + 0xba, 0xe3, 0x03, 0xec, 0x61, 0x4f, 0x4f, 0xd4, 0x01, 0x90, 0xc7, 0x93, + 0xa8, 0x4b, 0xfa, 0x3c, 0x1f, 0xa7, 0xb7, 0x97, 0xa6, 0x1d, 0x78, 0x59, + 0x07, 0x57, 0xc3, 0x6c, 0x83, 0x97, 0xf3, 0x6f, 0xce, 0x3e, 0xe7, 0x5f, + 0xff, 0xb5, 0xce, 0x24, 0xda, 0xe4, 0x79, 0x18, 0x81, 0x3a, 0x96, 0x8a, + 0x51, 0x22, 0x6c, 0xba, 0xf9, 0x7e, 0x8d, 0x1d, 0x7d, 0xc4, 0x15, 0x4e, + 0xbf, 0xde, 0x8f, 0xd9, 0xd4, 0xe1, 0xd7, 0xf6, 0x33, 0xb1, 0xbc, 0x8e, + 0xbf, 0x97, 0xa4, 0x57, 0xcd, 0x9d, 0x7e, 0x8d, 0xfb, 0x12, 0x3a, 0xb8, + 0x8d, 0x71, 0x21, 0xf1, 0x9f, 0xd2, 0xdd, 0x82, 0xfb, 0xfe, 0xcd, 0xc7, + 0x3d, 0xec, 0x9c, 0xeb, 0xb7, 0xf1, 0xd7, 0xec, 0x19, 0xd3, 0x87, 0x5f, + 0xbc, 0xe3, 0xfe, 0x1d, 0x7f, 0xb5, 0x8b, 0x4f, 0x75, 0xce, 0xb4, 0x62, + 0x25, 0x38, 0x2e, 0x24, 0xde, 0x26, 0xbd, 0xf1, 0x68, 0x75, 0xc2, 0xb3, + 0xaa, 0x46, 0xcb, 0x43, 0xb7, 0xb6, 0x39, 0x07, 0x5f, 0xee, 0x24, 0xc3, + 0x9b, 0x5c, 0xeb, 0xb7, 0xd7, 0xc3, 0xf2, 0x82, 0x1e, 0x0f, 0x5f, 0xf0, + 0xc3, 0xcf, 0xd8, 0xe0, 0x0e, 0xbf, 0xc9, 0xc1, 0xf7, 0xb2, 0x73, 0xae, + 0x7d, 0xa7, 0x5f, 0xd2, 0x14, 0x97, 0x70, 0xeb, 0xf4, 0xe9, 0xc8, 0x91, + 0xd4, 0xaa, 0x26, 0xe6, 0x32, 0xe0, 0xb8, 0x95, 0xdf, 0xbf, 0xf6, 0xce, + 0x78, 0xeb, 0xc1, 0x45, 0x4e, 0xa8, 0x3c, 0x7c, 0x2b, 0xbd, 0xc0, 0x7d, + 0x3a, 0xff, 0xe4, 0xf4, 0x7b, 0x5d, 0x74, 0xef, 0xe7, 0x54, 0x1f, 0x0b, + 0x8f, 0x5f, 0x08, 0xff, 0x23, 0xaf, 0xfd, 0xd8, 0xe0, 0x07, 0x1b, 0x70, + 0x1d, 0x7b, 0x32, 0x63, 0xad, 0x9d, 0x3d, 0x80, 0x1e, 0xde, 0x8d, 0xdb, + 0x3a, 0xfd, 0xcf, 0xd6, 0xe2, 0x75, 0x78, 0xf1, 0x3f, 0x1d, 0xbe, 0x5c, + 0x64, 0xe7, 0x5f, 0xb3, 0x68, 0xc6, 0xe7, 0x52, 0x1e, 0x4e, 0x88, 0x6f, + 0xa0, 0x7c, 0xc3, 0xa8, 0x2a, 0xe2, 0x72, 0x1a, 0x5c, 0x84, 0x2f, 0x61, + 0x02, 0xe4, 0x02, 0xf3, 0xa6, 0xbf, 0x36, 0x6c, 0x90, 0xdf, 0xe0, 0x7d, + 0xc1, 0x0f, 0x60, 0xea, 0x84, 0x61, 0x3c, 0x23, 0xef, 0xed, 0x62, 0xd3, + 0xb0, 0x75, 0xed, 0xe5, 0xa3, 0xab, 0x73, 0xc8, 0xe1, 0x5d, 0xed, 0x01, + 0xb3, 0xaa, 0x0f, 0x03, 0x08, 0xef, 0xbf, 0x7e, 0x48, 0xeb, 0xe8, 0xfd, + 0xa7, 0xa2, 0xaf, 0xd2, 0x51, 0xb6, 0xdb, 0x3a, 0x84, 0xf4, 0xbf, 0x26, + 0xbe, 0x7f, 0x2f, 0xc7, 0x50, 0x51, 0x6f, 0x8e, 0x80, 0x22, 0xbf, 0xdf, + 0x44, 0x5d, 0xb7, 0xe9, 0xd5, 0x0c, 0x99, 0x5c, 0x30, 0x48, 0x7c, 0x71, + 0x39, 0x70, 0xcc, 0x78, 0x72, 0x02, 0x72, 0x20, 0x61, 0x5d, 0xfc, 0x35, + 0xdb, 0x2f, 0xbc, 0xd5, 0x35, 0x36, 0x81, 0xd7, 0xa4, 0x2e, 0x75, 0xb7, + 0x6a, 0x8f, 0x16, 0x0a, 0xef, 0xdb, 0x11, 0x2e, 0x41, 0xd7, 0xbc, 0xe0, + 0x3a, 0xfe, 0x8e, 0x4f, 0x1c, 0x9c, 0xeb, 0xff, 0x40, 0xfb, 0xbf, 0xbc, + 0xa5, 0x07, 0x5f, 0xbf, 0x06, 0x0b, 0x0e, 0xbd, 0xc8, 0x98, 0xeb, 0xe4, + 0x17, 0x98, 0xeb, 0xff, 0x0c, 0x2b, 0xd7, 0xf7, 0xdc, 0x01, 0xd7, 0xc9, + 0xae, 0x61, 0xd6, 0x6b, 0x3a, 0xfe, 0xcf, 0xb1, 0x32, 0x68, 0xea, 0x13, + 0xc1, 0xf0, 0x9d, 0x42, 0x7a, 0x73, 0x94, 0xc8, 0x6c, 0x25, 0xdc, 0x3d, + 0x59, 0x3f, 0x47, 0x04, 0x83, 0xc7, 0xfb, 0x58, 0x6f, 0xfa, 0x13, 0xb0, + 0xb9, 0xf1, 0xb3, 0xaf, 0xdd, 0x49, 0xdc, 0x4e, 0xbf, 0x7e, 0xab, 0x88, + 0x0e, 0xa8, 0x3c, 0xee, 0x93, 0x5f, 0xf4, 0xe3, 0x92, 0xee, 0x03, 0x47, + 0x5f, 0xfb, 0x07, 0x79, 0x6b, 0x9f, 0xc0, 0x0e, 0xbf, 0x67, 0xb5, 0x8a, + 0x9d, 0x48, 0x7c, 0xcb, 0x3f, 0xbf, 0x87, 0xdf, 0x3b, 0x9b, 0x07, 0x5e, + 0x0c, 0x6d, 0x3a, 0xff, 0xf0, 0x8c, 0x36, 0x11, 0x8d, 0xe4, 0x82, 0x75, + 0xf9, 0x79, 0xd7, 0xd8, 0x3a, 0xb0, 0xfc, 0x11, 0x1e, 0xff, 0xf3, 0xfc, + 0x9a, 0x51, 0xc9, 0xfe, 0x37, 0x9d, 0x3a, 0xa1, 0x32, 0xe0, 0x98, 0xf6, + 0x11, 0xa2, 0x41, 0x7f, 0xcb, 0xee, 0x7b, 0x3f, 0xe4, 0xe7, 0x5f, 0xff, + 0x2a, 0xfe, 0xd2, 0x0c, 0xd0, 0xce, 0x66, 0xe7, 0x5f, 0xf4, 0x7b, 0x38, + 0xc7, 0x76, 0x1a, 0x2f, 0x8b, 0xf6, 0x72, 0x37, 0x91, 0xd7, 0xbb, 0x0b, + 0x61, 0xf5, 0x79, 0x0e, 0xff, 0xfc, 0x2c, 0xf9, 0xd8, 0x4e, 0x22, 0xd3, + 0x66, 0x16, 0x75, 0xe7, 0xe4, 0xe6, 0x8b, 0xfe, 0xa1, 0x16, 0x78, 0x66, + 0xc5, 0x7b, 0xff, 0x01, 0xfd, 0xa4, 0x1d, 0xe4, 0xb3, 0xaf, 0xff, 0xf7, + 0x5f, 0x49, 0x1a, 0xf9, 0xee, 0xe2, 0xf1, 0x8f, 0xc3, 0xae, 0x8d, 0x83, + 0xaf, 0xb5, 0xa7, 0x59, 0xd5, 0xd4, 0x4c, 0x81, 0x83, 0xc3, 0x17, 0xdb, + 0xcb, 0xce, 0x75, 0xff, 0xf0, 0x59, 0xd4, 0x1c, 0xda, 0xf2, 0xd2, 0x04, + 0xeb, 0x4b, 0x0f, 0xc5, 0xc8, 0xaf, 0xfa, 0x17, 0xf0, 0x39, 0x80, 0xd1, + 0xd7, 0xfc, 0x98, 0x21, 0x55, 0x33, 0x87, 0x52, 0x1f, 0x7e, 0xc1, 0xcd, + 0xef, 0x66, 0xe7, 0x5f, 0xcf, 0xcd, 0xe5, 0x9e, 0x3a, 0xff, 0xde, 0xd2, + 0x73, 0xc3, 0xfb, 0xc8, 0xeb, 0xff, 0xcb, 0x8d, 0x9c, 0xfc, 0x73, 0x36, + 0xc6, 0xe7, 0x5f, 0xfa, 0x33, 0x99, 0xc0, 0x2d, 0x34, 0x75, 0xe7, 0xdf, + 0x60, 0xeb, 0xf9, 0xfd, 0xa8, 0xc9, 0xce, 0xa8, 0x4c, 0xff, 0x0b, 0x50, + 0xf8, 0x53, 0x76, 0x9e, 0x36, 0x3f, 0x7f, 0xdf, 0xc2, 0xf5, 0x8b, 0x86, + 0xb3, 0xaf, 0xfd, 0xc9, 0xf0, 0x39, 0xde, 0xe3, 0x59, 0xd7, 0xfe, 0xc1, + 0xf6, 0xbe, 0xed, 0x8c, 0xdc, 0xea, 0xc4, 0x41, 0x69, 0x06, 0xff, 0xfa, + 0x51, 0xc9, 0xfc, 0x8a, 0xeb, 0x4e, 0x32, 0x3a, 0xfe, 0x9f, 0x58, 0xb8, + 0x6b, 0x3a, 0xcd, 0xcc, 0x88, 0x0f, 0xaa, 0x17, 0x93, 0xa8, 0x75, 0xf4, + 0xb8, 0x19, 0x1d, 0x7c, 0xbf, 0x24, 0xe7, 0x56, 0x1e, 0x22, 0x11, 0x5f, + 0xfd, 0xb7, 0xca, 0xc0, 0xcb, 0x3a, 0x8b, 0x3a, 0xe9, 0xfc, 0x75, 0xfe, + 0xdb, 0xd7, 0x94, 0x60, 0x9d, 0x50, 0x79, 0x38, 0x2f, 0x7f, 0xfe, 0x97, + 0x63, 0x8f, 0xef, 0xfc, 0x9e, 0xd7, 0x50, 0xeb, 0xfb, 0x1b, 0xfb, 0xd7, + 0xf1, 0xd7, 0xf4, 0x97, 0xe1, 0xfe, 0x63, 0xaf, 0xff, 0xbe, 0xca, 0x36, + 0xa0, 0x83, 0x89, 0x0b, 0xc2, 0xab, 0x87, 0xff, 0xe2, 0xfb, 0xee, 0xfd, + 0xdf, 0xc7, 0x5f, 0xb1, 0x78, 0x9b, 0x4e, 0xbd, 0x3c, 0xcd, 0x67, 0x54, + 0x27, 0x25, 0x3a, 0xae, 0x42, 0xb9, 0x84, 0x48, 0x4b, 0xf9, 0x3d, 0xde, + 0xc3, 0xaf, 0xdc, 0x49, 0xdd, 0x66, 0x98, 0x4e, 0xfb, 0xdf, 0xc3, 0x9a, + 0x61, 0x3b, 0x81, 0x06, 0xa0, 0x4e, 0xff, 0x0b, 0xab, 0xe8, 0xe0, 0x0d, + 0x40, 0x9d, 0xfe, 0xd6, 0x75, 0x35, 0xfc, 0xe6, 0x98, 0x4e, 0xec, 0x09, + 0xa6, 0x13, 0xb9, 0xb6, 0xcf, 0x30, 0x9d, 0x62, 0x69, 0x7b, 0x9a, 0x21, + 0x72, 0xc8, 0xb4, 0x7f, 0xb5, 0x05, 0xb2, 0x2b, 0x78, 0xb3, 0x09, 0x94, + 0x3e, 0x7b, 0x26, 0xe9, 0xfb, 0xb7, 0x1e, 0x3d, 0x42, 0xeb, 0x7a, 0x16, + 0xf5, 0x79, 0xc8, 0x06, 0x11, 0xda, 0x8e, 0xcb, 0xd2, 0x94, 0xef, 0xff, + 0xdd, 0x79, 0x76, 0x21, 0x3d, 0xa4, 0x1d, 0xe4, 0x75, 0xe1, 0x02, 0xce, + 0xbf, 0xe8, 0xff, 0xc2, 0x9b, 0x7e, 0xac, 0xeb, 0xb3, 0x58, 0x7a, 0xfc, + 0x1b, 0xa7, 0x46, 0xb0, 0xc2, 0xaa, 0xfb, 0x13, 0x8a, 0x9d, 0x78, 0x20, + 0x98, 0xea, 0x86, 0xc1, 0x8e, 0x78, 0x4f, 0x06, 0x34, 0xfc, 0x41, 0x54, + 0xe9, 0x91, 0xb6, 0xee, 0x5c, 0x90, 0xd7, 0x9a, 0x14, 0x3c, 0x84, 0xaa, + 0xc9, 0x3b, 0x1a, 0xd8, 0xab, 0xea, 0x17, 0xbe, 0x9e, 0x11, 0xdb, 0x1a, + 0x5e, 0xc9, 0x37, 0xd2, 0x1b, 0xf0, 0x73, 0x88, 0xa9, 0xd7, 0xf7, 0x63, + 0xe8, 0xee, 0x03, 0xaf, 0x35, 0x79, 0xb0, 0x75, 0xec, 0xc6, 0xce, 0xb9, + 0x15, 0x3a, 0xa7, 0x36, 0x28, 0x37, 0x7e, 0xf6, 0x4c, 0x8b, 0x3a, 0xfd, + 0x1b, 0x80, 0x10, 0x75, 0x41, 0xe7, 0x09, 0x3d, 0xfa, 0x36, 0xc0, 0xf8, + 0xeb, 0xf2, 0x6d, 0xf2, 0x4e, 0x75, 0xf9, 0xe5, 0xec, 0x61, 0xd7, 0xe1, + 0xcf, 0xb9, 0x31, 0xd7, 0xff, 0xc2, 0xc4, 0x58, 0x7f, 0x7e, 0x4b, 0x37, + 0xf1, 0xd7, 0xfe, 0x71, 0x06, 0xfe, 0xe4, 0x63, 0x67, 0x5f, 0xfb, 0x5d, + 0x4f, 0x9b, 0xca, 0x32, 0x73, 0xad, 0x8d, 0x67, 0xfe, 0x03, 0xeb, 0xfe, + 0xeb, 0xaf, 0xa9, 0x1b, 0xc8, 0xeb, 0xfb, 0xe8, 0xcb, 0x65, 0xe7, 0x3a, + 0xa1, 0x36, 0x39, 0x43, 0x3d, 0x0a, 0x80, 0x71, 0x53, 0xaa, 0x62, 0x09, + 0x03, 0x09, 0xf8, 0x52, 0x24, 0xde, 0x8e, 0x2e, 0xff, 0xd8, 0xfd, 0x99, + 0x07, 0xb9, 0xb9, 0xd7, 0xf0, 0x26, 0x94, 0x7b, 0x47, 0x5f, 0xff, 0xff, + 0xb3, 0xb8, 0x20, 0xc1, 0xf7, 0x73, 0xb1, 0x93, 0x27, 0x26, 0xea, 0x6f, + 0xe3, 0xaf, 0x86, 0x31, 0xb3, 0xaf, 0xa3, 0x7d, 0x39, 0xd5, 0x0d, 0xbe, + 0xb4, 0xf0, 0x8d, 0x0c, 0x21, 0xb2, 0xb0, 0x84, 0x48, 0xce, 0x1a, 0xc9, + 0xe6, 0x2f, 0xe2, 0xa3, 0xca, 0xd1, 0x15, 0xff, 0x1e, 0xfe, 0x5d, 0xb6, + 0x10, 0x3f, 0x48, 0x2f, 0xff, 0x90, 0x71, 0x71, 0xf4, 0x7f, 0x90, 0xe2, + 0xce, 0xbf, 0xe0, 0xa6, 0x0f, 0xf2, 0xcd, 0x1d, 0x6f, 0xce, 0xbf, 0x99, + 0xfb, 0x85, 0x70, 0x75, 0xff, 0x75, 0x25, 0xd7, 0x92, 0x2c, 0xeb, 0xff, + 0x69, 0x07, 0x79, 0x79, 0x34, 0x87, 0x56, 0x1f, 0xa7, 0x8d, 0xef, 0xda, + 0x5c, 0x06, 0x0e, 0xa9, 0x26, 0xfd, 0x89, 0xd3, 0x1b, 0xf0, 0x45, 0x70, + 0xa1, 0xf1, 0x0d, 0xf0, 0xc7, 0x24, 0x75, 0xff, 0x76, 0x24, 0x82, 0x3f, + 0xee, 0x75, 0xff, 0x44, 0x93, 0xd2, 0x81, 0x01, 0xd7, 0xfd, 0x19, 0xef, + 0xa0, 0x04, 0x6e, 0x75, 0xb9, 0x08, 0xc8, 0xc2, 0x0e, 0x1c, 0x2c, 0xda, + 0xfe, 0x18, 0x67, 0x22, 0x47, 0x5f, 0xff, 0x75, 0xd3, 0xd2, 0xfc, 0x7d, + 0xae, 0xbc, 0x8e, 0xfa, 0x6a, 0xef, 0xfd, 0xaf, 0xbe, 0x41, 0xfe, 0x59, + 0xa3, 0xae, 0x0e, 0x8e, 0xa6, 0xb4, 0x5b, 0xf5, 0x84, 0x50, 0x2f, 0xff, + 0xec, 0xdf, 0x34, 0xe3, 0xd4, 0x8f, 0x77, 0xf7, 0x59, 0xd5, 0x09, 0xd7, + 0x3c, 0x64, 0x62, 0x65, 0x7e, 0xfd, 0x69, 0xd8, 0x3a, 0xfd, 0x9c, 0x64, + 0x61, 0xd4, 0x27, 0x99, 0xf4, 0x9e, 0xff, 0xfc, 0xe3, 0xe7, 0x7e, 0x8c, + 0x7b, 0x4d, 0xe7, 0x4e, 0xbf, 0xe8, 0xf7, 0x71, 0x79, 0xcc, 0x3a, 0xfd, + 0xee, 0xa4, 0x68, 0xeb, 0xd3, 0xb8, 0xf0, 0xf7, 0x34, 0x6d, 0x7f, 0xd0, + 0x0d, 0x07, 0xf7, 0xe4, 0x8e, 0xbd, 0xcd, 0x68, 0xf1, 0x01, 0xdf, 0x31, + 0xdd, 0x86, 0x88, 0x0d, 0x43, 0x53, 0x7f, 0x72, 0x3b, 0x1f, 0x32, 0x48, + 0xa0, 0xe3, 0x15, 0x3a, 0x63, 0x3f, 0x61, 0xa7, 0x40, 0x4f, 0xc7, 0xd1, + 0xe3, 0xde, 0xdb, 0x1d, 0x3a, 0xb1, 0x52, 0xda, 0x4a, 0x14, 0xfa, 0x55, + 0x7b, 0xae, 0xd6, 0x75, 0xf4, 0x03, 0x67, 0x0e, 0xa0, 0x1e, 0x0f, 0x87, + 0xaf, 0x87, 0xc0, 0xfc, 0xeb, 0xf2, 0xda, 0xa6, 0xa9, 0xaa, 0x6a, 0x0e, + 0xbf, 0xff, 0xa5, 0x9a, 0x4e, 0x71, 0x17, 0xf7, 0xdd, 0xc6, 0xfc, 0x75, + 0x62, 0x2e, 0xd0, 0x89, 0xcf, 0x2f, 0xff, 0x37, 0x83, 0xec, 0x19, 0x66, + 0xbe, 0xac, 0xeb, 0xff, 0xd2, 0xcd, 0xe5, 0xf6, 0x00, 0xa3, 0x6d, 0xb6, + 0x55, 0xf9, 0x6d, 0xe2, 0x6d, 0x3a, 0xf4, 0xb0, 0x66, 0x3f, 0xaf, 0xaa, + 0x35, 0x08, 0xf9, 0x78, 0x62, 0x54, 0x2a, 0x29, 0xec, 0x37, 0x46, 0x32, + 0x6b, 0xfe, 0x41, 0x96, 0x9a, 0x93, 0x50, 0xd5, 0x35, 0x07, 0x5f, 0x4d, + 0xac, 0x98, 0xeb, 0xf0, 0x23, 0xd8, 0xd6, 0x75, 0xfe, 0x8c, 0xe3, 0x1d, + 0xd8, 0x68, 0x82, 0x6f, 0xfa, 0x3d, 0x9c, 0x63, 0xbb, 0x0d, 0x17, 0xcd, + 0xf9, 0xc3, 0xd8, 0x54, 0xeb, 0xc3, 0x9a, 0x0a, 0x29, 0xd8, 0x7a, 0xb4, + 0x3a, 0x14, 0xc4, 0x36, 0xc3, 0x42, 0xff, 0xe8, 0xea, 0x2b, 0x9c, 0x9d, + 0x7f, 0xee, 0x75, 0xff, 0x07, 0x98, 0xbc, 0x93, 0x84, 0xea, 0xc4, 0xf6, + 0xd2, 0x33, 0x3e, 0x95, 0x3a, 0x3d, 0xfe, 0xff, 0xbb, 0x3d, 0x46, 0x74, + 0xeb, 0xff, 0x4e, 0xfb, 0xec, 0xe7, 0x85, 0xf6, 0x9d, 0x7f, 0xfd, 0x9e, + 0x81, 0xf6, 0xb3, 0x15, 0x55, 0xe4, 0x75, 0xff, 0xb0, 0x31, 0x28, 0xee, + 0x01, 0xce, 0xbf, 0x9e, 0x5f, 0xc9, 0xc2, 0x75, 0xfd, 0xd4, 0x9f, 0x5a, + 0x73, 0xaf, 0x36, 0xdb, 0x65, 0x5f, 0xbb, 0x8c, 0x7e, 0x14, 0xa1, 0x7f, + 0x7f, 0xff, 0xa6, 0xe4, 0x6d, 0xf8, 0xab, 0xfc, 0xfb, 0x36, 0xbe, 0x66, + 0xfe, 0x3a, 0xa1, 0x1e, 0x3e, 0x4c, 0xfa, 0x6d, 0x7f, 0xf9, 0x38, 0x9e, + 0xff, 0x3c, 0xeb, 0xc1, 0x3a, 0xa7, 0x54, 0xc4, 0xc4, 0x35, 0xa7, 0x00, + 0xec, 0x63, 0x1e, 0xf1, 0x8d, 0xff, 0x97, 0x1b, 0xe8, 0x72, 0x7f, 0xb2, + 0x3a, 0xff, 0xff, 0x27, 0x5c, 0x77, 0x97, 0xd9, 0x40, 0xc9, 0xd7, 0x81, + 0x3a, 0xff, 0xf6, 0x67, 0x43, 0xd8, 0xd6, 0x75, 0x00, 0x75, 0xfe, 0x57, + 0xe4, 0xd2, 0x8e, 0x68, 0xea, 0x9d, 0x31, 0xf9, 0x20, 0x85, 0x81, 0x11, + 0xef, 0xbe, 0x27, 0x7f, 0x3a, 0xfd, 0x92, 0xec, 0x70, 0xea, 0x61, 0xe5, + 0x35, 0x92, 0x5f, 0xef, 0x42, 0x75, 0x58, 0xdc, 0xeb, 0xff, 0xbd, 0xa7, + 0x96, 0xb1, 0x90, 0xb4, 0x3a, 0xff, 0xf6, 0xe3, 0xf1, 0x9d, 0x40, 0x02, + 0x39, 0x23, 0xaa, 0x11, 0xcc, 0x84, 0xbf, 0x99, 0xfd, 0x42, 0xbf, 0x93, + 0x58, 0x1f, 0xb8, 0x75, 0xfb, 0x61, 0x07, 0x36, 0x9d, 0x7f, 0xb9, 0x81, + 0x4f, 0xd9, 0xd6, 0x1e, 0xbb, 0x96, 0xdf, 0xed, 0x0e, 0x6d, 0xeb, 0xc8, + 0xeb, 0xda, 0x96, 0xd3, 0xa9, 0x0f, 0x45, 0xac, 0xce, 0xff, 0xf4, 0x4f, + 0xf7, 0xb1, 0xbf, 0xb2, 0x71, 0x09, 0xd4, 0x89, 0x86, 0x3c, 0x26, 0xc4, + 0x92, 0xff, 0x46, 0x0f, 0x9a, 0x0d, 0xb0, 0xeb, 0xfd, 0xdc, 0xdb, 0xf3, + 0x52, 0x61, 0xd6, 0xff, 0x47, 0xdb, 0xe3, 0x6b, 0xf8, 0x7e, 0x7d, 0xe7, + 0x5c, 0xeb, 0xff, 0x7e, 0xf2, 0xf9, 0x08, 0x1c, 0x59, 0xd4, 0xe7, 0xde, + 0x26, 0x17, 0xec, 0xe3, 0xee, 0xd9, 0xd7, 0xff, 0xfa, 0x7c, 0x6c, 0x70, + 0x3c, 0x4f, 0xe7, 0x0f, 0x60, 0x67, 0x3a, 0xa7, 0x44, 0x5e, 0x8a, 0x2f, + 0x36, 0xdb, 0x65, 0x5f, 0xef, 0xa0, 0x81, 0xcd, 0xfc, 0x52, 0x85, 0xfd, + 0xff, 0xfc, 0xd3, 0xf8, 0xce, 0xa0, 0x43, 0x8d, 0xfc, 0xf6, 0xb2, 0x73, + 0xab, 0xa8, 0xa9, 0xfd, 0x12, 0x91, 0x31, 0x07, 0x87, 0x65, 0x4e, 0xcc, + 0xa9, 0x94, 0xa2, 0x80, 0xa0, 0xa4, 0xa9, 0x9e, 0x46, 0xfc, 0xb8, 0xdb, + 0xbb, 0x1d, 0x08, 0xc2, 0x83, 0x50, 0x98, 0xf4, 0x77, 0x77, 0xfe, 0xc4, + 0x19, 0xdc, 0x7d, 0x8b, 0x3a, 0xff, 0xf7, 0x15, 0xfb, 0xe4, 0xd0, 0xe6, + 0xd4, 0x09, 0xd7, 0xfc, 0x8d, 0x87, 0xb9, 0xed, 0x9c, 0x3a, 0xa1, 0x11, + 0x1d, 0x4d, 0xbe, 0x17, 0xdf, 0xc7, 0x5e, 0xc1, 0x01, 0xd7, 0xd9, 0xe9, + 0xa4, 0x75, 0xff, 0xdb, 0x03, 0x1b, 0x1a, 0x71, 0xfa, 0x0d, 0x1d, 0x5d, + 0x3e, 0xc7, 0x22, 0xbf, 0xf6, 0x7a, 0x39, 0xae, 0xc0, 0xf8, 0xf1, 0x04, + 0x5f, 0xd9, 0xc6, 0x3b, 0xb0, 0xd1, 0x04, 0x28, 0x79, 0x37, 0xa0, 0x28, + 0x75, 0x41, 0xf2, 0x69, 0x2a, 0xf6, 0xd8, 0x59, 0xd7, 0xf3, 0xf7, 0x9c, + 0x46, 0xce, 0xbf, 0x9a, 0xc2, 0xdb, 0x8c, 0x8e, 0xac, 0x3f, 0xa1, 0x1d, + 0xfc, 0xb6, 0xff, 0xfd, 0x01, 0x9a, 0x48, 0x3e, 0x80, 0x4c, 0x29, 0x31, + 0xd5, 0x3a, 0xa9, 0x35, 0x48, 0x7b, 0x08, 0x60, 0x43, 0x38, 0x61, 0x37, + 0xb4, 0xba, 0xfe, 0xee, 0x7b, 0xc8, 0xb3, 0xaf, 0xef, 0x7d, 0xce, 0xbe, + 0xe7, 0x56, 0xe7, 0xb6, 0x25, 0x97, 0xf6, 0x6f, 0xee, 0x72, 0x0e, 0xbf, + 0xfb, 0x42, 0xfe, 0x75, 0xfd, 0x89, 0xf0, 0xea, 0x09, 0xf8, 0xe8, 0xb6, + 0xa1, 0x16, 0xbf, 0xc2, 0x4e, 0xfe, 0xc6, 0x7d, 0xdb, 0xdc, 0x3a, 0xe8, + 0x54, 0xeb, 0x90, 0x4e, 0xb3, 0x67, 0x50, 0x4d, 0x2f, 0xd1, 0x4b, 0xc3, + 0xfc, 0xe7, 0x5f, 0xba, 0xf2, 0xc1, 0x3a, 0xfe, 0x4f, 0x0e, 0x75, 0x0e, + 0xbb, 0x3b, 0xf0, 0xf3, 0xe0, 0x96, 0xe7, 0x6f, 0xe2, 0x3e, 0x30, 0xef, + 0xa4, 0x7e, 0x6c, 0xa9, 0x27, 0x35, 0x85, 0x03, 0x19, 0x45, 0xfd, 0xa4, + 0x08, 0x70, 0x4e, 0xbf, 0xff, 0xbd, 0xdc, 0xd6, 0xb3, 0x3f, 0xe4, 0xf9, + 0xf8, 0xf8, 0xeb, 0xfe, 0xec, 0x73, 0xc3, 0x19, 0xb9, 0xd7, 0xff, 0xfc, + 0x93, 0xc4, 0xb5, 0xce, 0x26, 0xf3, 0x49, 0xf8, 0xbc, 0xdc, 0xeb, 0xfd, + 0x0f, 0x3b, 0xf1, 0xfe, 0x9d, 0x7b, 0xb8, 0x21, 0x46, 0x9f, 0x4d, 0xfc, + 0xd3, 0x58, 0x9c, 0xd2, 0x15, 0xfa, 0x32, 0xfb, 0xff, 0x33, 0xb1, 0x9c, + 0x96, 0xbf, 0x59, 0xd7, 0x26, 0x8e, 0xbf, 0xec, 0x9d, 0xfc, 0x0f, 0xa3, + 0x23, 0xaf, 0xe7, 0xf7, 0xc8, 0x92, 0xa7, 0x5f, 0xdf, 0x57, 0xa6, 0xdf, + 0x73, 0xaa, 0x13, 0x23, 0xc3, 0x55, 0x4f, 0xf8, 0x2a, 0xe7, 0x5e, 0x2f, + 0xbd, 0xcc, 0xe9, 0xd7, 0xb4, 0x8b, 0x3a, 0xd1, 0xc3, 0x6d, 0xe1, 0xbb, + 0xff, 0xba, 0x90, 0x3f, 0x1c, 0x64, 0x8b, 0x3a, 0xf9, 0x26, 0x46, 0xce, + 0xbf, 0xf9, 0x6f, 0xbf, 0xdf, 0x27, 0x23, 0xf6, 0x99, 0xd7, 0xff, 0xef, + 0xe7, 0x18, 0xce, 0xa9, 0x1e, 0xce, 0xff, 0xc3, 0xaf, 0xbd, 0xaf, 0xba, + 0xf8, 0x98, 0x30, 0x50, 0xb0, 0x8b, 0xea, 0x5d, 0xfb, 0x4b, 0xcf, 0x68, + 0xeb, 0xff, 0x91, 0x5c, 0xf2, 0x77, 0x3d, 0x1c, 0x3a, 0xfc, 0xf2, 0x14, + 0x83, 0xaf, 0xe8, 0x71, 0xf6, 0x09, 0xd5, 0x25, 0x47, 0xb9, 0x19, 0x62, + 0x2d, 0xf0, 0x9d, 0x68, 0x42, 0x49, 0x7f, 0x33, 0xa9, 0xb2, 0x8a, 0x9d, + 0x7f, 0xf9, 0x01, 0x1a, 0x5c, 0x27, 0x38, 0x8d, 0x9d, 0x7c, 0xd7, 0xdc, + 0x9c, 0xeb, 0xfd, 0x01, 0xcf, 0x27, 0x7f, 0x3a, 0xcb, 0x83, 0xd7, 0x09, + 0x2d, 0xff, 0xbd, 0xf4, 0x11, 0xf6, 0x01, 0x00, 0x3a, 0xff, 0xff, 0xcb, + 0x71, 0x04, 0x93, 0x5f, 0xaf, 0xa9, 0x1e, 0xef, 0xee, 0xb3, 0xaf, 0xff, + 0x87, 0xff, 0x49, 0x01, 0xd7, 0x4f, 0x3a, 0xce, 0xbb, 0xe3, 0x59, 0xd7, + 0xff, 0xe7, 0x4f, 0x20, 0x70, 0x39, 0xe4, 0x5a, 0x70, 0xeb, 0xff, 0xd0, + 0xc0, 0xe7, 0xdf, 0x27, 0x23, 0xf6, 0x99, 0xd7, 0xb8, 0xfa, 0xc4, 0xc2, + 0x78, 0x9d, 0xd1, 0xb1, 0x51, 0xb7, 0x9d, 0x3c, 0x2f, 0xe3, 0x75, 0xad, + 0xd5, 0x19, 0xa4, 0xa0, 0x3b, 0xa5, 0x07, 0x5f, 0xfe, 0x9c, 0x3d, 0x8e, + 0xe6, 0xe0, 0xcf, 0x68, 0xea, 0x73, 0xe0, 0xfc, 0x56, 0x82, 0xaf, 0x5f, + 0x0c, 0x12, 0x13, 0xef, 0x29, 0x68, 0x61, 0x19, 0x7f, 0x72, 0x27, 0x41, + 0xf1, 0xd7, 0x83, 0xf5, 0x67, 0x5f, 0x86, 0x03, 0x93, 0x1d, 0x7d, 0xaf, + 0xf8, 0xa9, 0xd7, 0xe8, 0xef, 0xa2, 0x47, 0x5f, 0x07, 0xff, 0x6a, 0x0f, + 0xc3, 0x72, 0x60, 0x12, 0x5f, 0x81, 0x8b, 0x8e, 0x9d, 0x7f, 0xff, 0xfb, + 0x27, 0xd4, 0x2a, 0xfa, 0xf4, 0xb1, 0x55, 0x73, 0x7f, 0x72, 0x33, 0x73, + 0xaf, 0xd1, 0xf3, 0x83, 0x23, 0xab, 0x48, 0xa3, 0xfd, 0xee, 0xf3, 0x4f, + 0xb8, 0x75, 0x05, 0x50, 0x76, 0x16, 0x24, 0x23, 0x85, 0x23, 0xd0, 0xc9, + 0xfc, 0x92, 0xf7, 0x3e, 0xe8, 0xeb, 0x34, 0x73, 0xaf, 0xde, 0xf7, 0xb1, + 0xb3, 0xaa, 0x0d, 0xf2, 0x0b, 0x5f, 0xf9, 0xc5, 0x99, 0xc6, 0x3b, 0xb0, + 0xd1, 0x08, 0xdd, 0x29, 0xce, 0xa8, 0x46, 0xd0, 0x17, 0x3f, 0x1f, 0xda, + 0x91, 0x7e, 0xc9, 0xf4, 0x07, 0x3a, 0xff, 0xff, 0xf7, 0x73, 0xfe, 0x2b, + 0xd4, 0xde, 0x3d, 0xff, 0x47, 0x37, 0xf7, 0xef, 0xa3, 0xaf, 0xfe, 0xcd, + 0xfe, 0xf9, 0x07, 0xf9, 0x66, 0x8e, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0xce, 0x2e, 0x18, 0x19, 0xe3, 0x81, 0xc1, 0xcf, 0x69, 0x19, 0x83, + 0xf6, 0x7c, 0xe4, 0x68, 0x5d, 0x5d, 0x62, 0x00, 0x1f, 0x80, 0x5c, 0x30, + 0x33, 0xc7, 0x0e, 0xa8, 0x4d, 0x3b, 0x11, 0xaf, 0xfe, 0xf3, 0x8c, 0xfb, + 0xc8, 0x63, 0x34, 0x75, 0xff, 0xfa, 0x01, 0x34, 0xa2, 0x71, 0x75, 0x74, + 0x31, 0x23, 0xaf, 0xfd, 0xf7, 0x3a, 0xeb, 0x51, 0xb6, 0xdb, 0x3a, 0xff, + 0xfd, 0x8c, 0xec, 0x08, 0x45, 0x27, 0xc1, 0x45, 0x4e, 0xb3, 0xce, 0x89, + 0x69, 0x22, 0x54, 0x93, 0x14, 0x78, 0x75, 0xdf, 0xff, 0xd3, 0x0c, 0x03, + 0x4c, 0xea, 0x72, 0x61, 0x80, 0x68, 0xeb, 0xff, 0xbd, 0xd4, 0xdb, 0xd7, + 0x97, 0x21, 0x53, 0xaf, 0xef, 0xfc, 0x9f, 0x8a, 0xa7, 0x5f, 0xd8, 0xde, + 0x0f, 0xe0, 0x3a, 0xfd, 0x2c, 0xf4, 0x00, 0xeb, 0xa1, 0x73, 0x9e, 0x9e, + 0xe5, 0xb7, 0xff, 0xff, 0x01, 0x6f, 0x2e, 0xba, 0x79, 0x03, 0x81, 0xcf, + 0x22, 0xd3, 0x87, 0x56, 0x91, 0x3b, 0xf9, 0x7d, 0xff, 0xf8, 0x73, 0x59, + 0xd7, 0xd8, 0x67, 0x51, 0x70, 0xc3, 0xaf, 0xd3, 0xae, 0x03, 0x07, 0x54, + 0x97, 0x72, 0xc3, 0x1e, 0x56, 0xe4, 0x53, 0x46, 0xaf, 0xc2, 0x8e, 0xad, + 0xe9, 0x1b, 0xd1, 0x8f, 0xed, 0x24, 0xfa, 0xab, 0x7f, 0xa3, 0x5a, 0x89, + 0xf1, 0xb3, 0xaf, 0xf7, 0x71, 0x79, 0xdf, 0xc4, 0xea, 0x09, 0xf2, 0xf8, + 0xce, 0xfb, 0x38, 0xaa, 0x1d, 0x50, 0xbe, 0x81, 0x93, 0xbe, 0x4f, 0x18, + 0x5f, 0xe4, 0x57, 0x9b, 0x6d, 0xb2, 0xaf, 0xfb, 0x00, 0xfc, 0xcd, 0xb8, + 0x12, 0x94, 0x2f, 0xee, 0x6d, 0xb2, 0xaf, 0x36, 0xdb, 0x65, 0x5f, 0xcf, + 0x38, 0x7b, 0x1a, 0x29, 0x42, 0xfe, 0x85, 0x17, 0x8d, 0xa4, 0x6c, 0x9b, + 0xdf, 0x98, 0x81, 0xfa, 0xb2, 0x94, 0x36, 0x77, 0x9b, 0x6d, 0xb2, 0xaf, + 0x6a, 0x38, 0x52, 0x85, 0xfd, 0xf3, 0x8e, 0xfe, 0x3a, 0xc0, 0x44, 0x52, + 0xf9, 0x65, 0xb2, 0xbb, 0xf8, 0x23, 0x12, 0x76, 0x1d, 0x7e, 0xd7, 0xf3, + 0xec, 0x89, 0xd7, 0xe0, 0xa6, 0xd8, 0x09, 0xd7, 0xd8, 0x38, 0xd6, 0x75, + 0x70, 0xf2, 0x96, 0x51, 0x48, 0x89, 0x8f, 0xae, 0xd7, 0xff, 0x75, 0xe4, + 0x2e, 0xac, 0xc2, 0x93, 0x1d, 0x7f, 0xf6, 0x72, 0x78, 0xdf, 0x48, 0x38, + 0x03, 0xaf, 0xee, 0xe6, 0xdc, 0xf6, 0x8e, 0xa6, 0x22, 0xd4, 0x08, 0x9e, + 0x43, 0xae, 0x27, 0x99, 0xd8, 0x61, 0x8c, 0x36, 0x6e, 0x9f, 0xc7, 0x54, + 0x2a, 0x53, 0xc9, 0x40, 0x42, 0x75, 0x7b, 0x76, 0xa4, 0xd4, 0x1d, 0x7e, + 0x64, 0x76, 0x16, 0x75, 0xcf, 0xe3, 0xaf, 0xd8, 0xd6, 0xe2, 0x0c, 0x37, + 0x62, 0x4d, 0x7f, 0x07, 0x39, 0xb2, 0xb0, 0x9d, 0x7b, 0xa9, 0x31, 0x55, + 0xc3, 0xcc, 0xd1, 0x85, 0xff, 0x3e, 0xfe, 0xc9, 0xbf, 0xe2, 0xa7, 0x59, + 0x88, 0x7b, 0xdf, 0x91, 0x5f, 0xe1, 0xcd, 0xe5, 0xa4, 0x54, 0xeb, 0xe7, + 0x7e, 0x2a, 0x75, 0x7c, 0x3d, 0x49, 0xcc, 0xef, 0xfb, 0x31, 0x80, 0x8c, + 0xde, 0x47, 0x5f, 0x43, 0xaf, 0x69, 0x57, 0xff, 0x75, 0x1c, 0x00, 0x80, + 0x47, 0x74, 0x75, 0xfd, 0xdc, 0x5a, 0xde, 0x47, 0x5e, 0x6d, 0xb6, 0xca, + 0xbf, 0xc3, 0xee, 0xa4, 0x0c, 0xe5, 0x28, 0x5f, 0xde, 0x80, 0x64, 0x91, + 0x19, 0x89, 0x75, 0xe4, 0xc0, 0x3e, 0xc3, 0x3a, 0xd8, 0xc4, 0xd3, 0x57, + 0x19, 0x15, 0xfc, 0x08, 0x04, 0x77, 0x47, 0x5f, 0xe8, 0xfb, 0xce, 0x27, + 0xb4, 0x75, 0x42, 0xbf, 0xe9, 0x31, 0xef, 0x0e, 0x74, 0x7c, 0x98, 0x97, + 0xb1, 0xc2, 0x00, 0xbc, 0x4b, 0x2f, 0xc0, 0xc4, 0xea, 0xa7, 0x5f, 0xff, + 0x63, 0x20, 0x5f, 0xda, 0x0f, 0xef, 0xc9, 0x1d, 0x5b, 0x9f, 0xaa, 0xc9, + 0xef, 0xe8, 0x16, 0x35, 0x4d, 0x4d, 0xab, 0x3a, 0xff, 0xff, 0xe1, 0x75, + 0xc7, 0x18, 0x1e, 0xc6, 0xbf, 0x74, 0x96, 0xba, 0xf2, 0x3a, 0xf7, 0xfe, + 0xd1, 0xd7, 0x99, 0x1a, 0x3a, 0xff, 0xef, 0xb2, 0xce, 0xbf, 0x53, 0x9c, + 0x83, 0xab, 0x0f, 0x7c, 0x03, 0x77, 0xe8, 0xf6, 0xb6, 0xe1, 0xd7, 0xef, + 0xf8, 0xaf, 0x50, 0xea, 0x84, 0xef, 0x42, 0x46, 0xe7, 0x80, 0x70, 0x17, + 0xcf, 0x10, 0xec, 0x94, 0x5f, 0xe1, 0x76, 0xf0, 0x5d, 0x53, 0xaf, 0xfe, + 0xcf, 0x6b, 0xee, 0x96, 0x31, 0xc8, 0x3a, 0xf6, 0xdc, 0x10, 0x9f, 0xaa, + 0xcc, 0x6f, 0xfe, 0x6e, 0x38, 0x2f, 0x3c, 0x72, 0x24, 0x75, 0x21, 0xfb, + 0xf4, 0xd2, 0xff, 0xff, 0x83, 0xd4, 0x6f, 0x36, 0x11, 0x6f, 0xed, 0x7f, + 0x2c, 0xdf, 0xc7, 0x56, 0x22, 0x31, 0xc8, 0x6f, 0xfa, 0x66, 0x75, 0x17, + 0x1c, 0x54, 0xeb, 0xf4, 0xff, 0x3f, 0x89, 0x8e, 0xb4, 0x8e, 0xbd, 0xf4, + 0x66, 0x3a, 0xa4, 0x6b, 0x80, 0x21, 0x58, 0x8b, 0x57, 0x3a, 0xd2, 0xd5, + 0x43, 0xbf, 0xa5, 0x9e, 0x56, 0x9c, 0xa5, 0x6d, 0x86, 0x55, 0x1e, 0x53, + 0x39, 0x15, 0x85, 0xf3, 0x21, 0x86, 0x92, 0xad, 0x66, 0x96, 0x2b, 0xc9, + 0x5e, 0x4b, 0x95, 0x93, 0xd9, 0xc3, 0x37, 0x94, 0xce, 0x08, 0xce, 0xc6, + 0x7d, 0xff, 0x53, 0x8a, 0x5e, 0x9c, 0x34, 0xfe, 0x55, 0x7b, 0x71, 0xee, + 0xfd, 0x86, 0xb5, 0xed, 0xb0, 0x27, 0x5f, 0xff, 0x60, 0xa9, 0xe5, 0x53, + 0x7d, 0x77, 0x00, 0xe7, 0x54, 0x8f, 0xb0, 0x23, 0x97, 0x02, 0x0e, 0xbf, + 0x33, 0x3d, 0xd4, 0x3a, 0xce, 0x86, 0xec, 0x45, 0x6f, 0xff, 0xfb, 0x3a, + 0xff, 0x75, 0x8a, 0xb8, 0x82, 0x06, 0x26, 0xec, 0x1d, 0x68, 0x3a, 0xff, + 0xfd, 0x1c, 0xec, 0x2f, 0x63, 0xf8, 0x18, 0x9b, 0xb0, 0x75, 0xf9, 0x39, + 0x34, 0x77, 0x88, 0xcb, 0x03, 0x28, 0x87, 0xd6, 0xe9, 0xcc, 0x2d, 0x77, + 0xec, 0x3b, 0xec, 0xd1, 0xce, 0xbf, 0xf3, 0x88, 0x3e, 0x07, 0xf7, 0xe4, + 0x8e, 0xbe, 0x41, 0x9e, 0x0e, 0xbd, 0xee, 0x41, 0xd7, 0xfc, 0x30, 0xb4, + 0x1c, 0x5c, 0x1d, 0x72, 0x07, 0x0f, 0x3e, 0x61, 0xba, 0x6b, 0x46, 0xe7, + 0x10, 0x05, 0xbe, 0x9a, 0x9a, 0x64, 0x99, 0x0f, 0x2b, 0xd0, 0x33, 0x9d, + 0x7c, 0x9d, 0x45, 0x9d, 0x6e, 0xa1, 0xbb, 0x98, 0x6e, 0xfe, 0x86, 0x46, + 0xbc, 0x87, 0x5f, 0xf4, 0x7b, 0xae, 0x07, 0xdf, 0x47, 0x50, 0x4f, 0x8c, + 0x4a, 0xef, 0xff, 0xf0, 0xfe, 0xec, 0xd7, 0xee, 0x92, 0x81, 0x66, 0x6f, + 0xe3, 0xaf, 0xfd, 0xc0, 0x7c, 0xea, 0x33, 0xfe, 0x00, 0xeb, 0xd3, 0x7f, + 0xc3, 0xaf, 0xfc, 0xe9, 0xcc, 0xdd, 0x46, 0xdb, 0x6c, 0xea, 0x84, 0x51, + 0x3a, 0x16, 0x87, 0xaf, 0xff, 0x86, 0x25, 0xf3, 0xef, 0x90, 0x7f, 0x96, + 0x68, 0xea, 0xc5, 0x45, 0xac, 0x84, 0x52, 0xc8, 0x7b, 0x18, 0x10, 0x0b, + 0xaf, 0x01, 0xd6, 0x75, 0xd8, 0x03, 0xaa, 0x0d, 0x86, 0x0d, 0xde, 0x7c, + 0x59, 0xd7, 0x0c, 0x84, 0xdc, 0xec, 0x0f, 0xdf, 0xe6, 0xf4, 0x38, 0x11, + 0x73, 0xaf, 0xb4, 0xc6, 0x21, 0xd5, 0x08, 0x80, 0x42, 0xe7, 0x31, 0xbf, + 0x73, 0x43, 0x13, 0x9d, 0x7f, 0xfc, 0xde, 0x33, 0x59, 0xe9, 0xb1, 0x51, + 0xc0, 0x1d, 0x58, 0x7e, 0xe8, 0x4f, 0x7f, 0x3f, 0xba, 0xe2, 0x03, 0xaf, + 0xfc, 0xfe, 0xc9, 0x9e, 0x06, 0x26, 0x3a, 0xff, 0xdd, 0x4c, 0xfb, 0x93, + 0x37, 0x1b, 0x9d, 0x64, 0xe2, 0x2a, 0x3a, 0x57, 0xa3, 0xcb, 0x98, 0xc3, + 0x46, 0x09, 0x52, 0x4c, 0x81, 0x90, 0xc8, 0x01, 0xad, 0xd8, 0x27, 0x5f, + 0xfe, 0xf4, 0x0b, 0x33, 0xdd, 0x4e, 0x01, 0x87, 0x5f, 0x82, 0x9a, 0xea, + 0x1d, 0x7f, 0x20, 0xe7, 0xba, 0x87, 0x5a, 0x30, 0xf4, 0x34, 0x4d, 0x41, + 0x46, 0x96, 0x0a, 0x7f, 0x09, 0x8b, 0xfd, 0x0b, 0xd6, 0x9c, 0x67, 0x3a, + 0xff, 0x81, 0xa9, 0x27, 0x5d, 0x27, 0x3a, 0xfb, 0x58, 0x3e, 0x3a, 0xf6, + 0xc4, 0x70, 0xea, 0x43, 0xf6, 0x73, 0x8f, 0xc8, 0x2f, 0x79, 0xda, 0xce, + 0xbf, 0xde, 0xea, 0x28, 0x07, 0x43, 0xae, 0xfc, 0x4e, 0xbb, 0xee, 0x1d, + 0x41, 0x4e, 0x23, 0xa6, 0xa3, 0x0a, 0x8f, 0x17, 0x7e, 0x3d, 0xb2, 0x65, + 0xf4, 0x5a, 0xfc, 0xa8, 0x12, 0x6d, 0x1d, 0x7d, 0xd4, 0x79, 0x1d, 0x78, + 0x2f, 0x23, 0xaa, 0x0d, 0xde, 0x10, 0x5b, 0xf8, 0x44, 0x18, 0x19, 0x2f, + 0x3f, 0xb4, 0x75, 0xff, 0xc8, 0xc1, 0xc5, 0xc4, 0xc1, 0x89, 0xce, 0xbf, + 0xe6, 0x67, 0xa3, 0x6a, 0x08, 0x0e, 0xbf, 0xff, 0xbf, 0x8f, 0x6b, 0x07, + 0xe7, 0x21, 0x02, 0x2f, 0x23, 0xaf, 0xcc, 0xee, 0xee, 0xd6, 0x75, 0xff, + 0xc8, 0x11, 0xff, 0xda, 0x81, 0x8d, 0x1d, 0x4c, 0x4d, 0x09, 0x10, 0xc4, + 0xe3, 0xf5, 0xad, 0xa5, 0x77, 0xfe, 0x7e, 0x66, 0xdc, 0x0f, 0x05, 0xb3, + 0xaf, 0xff, 0xe4, 0xfc, 0x65, 0x83, 0xe4, 0xd9, 0xcf, 0x0b, 0xc8, 0xea, + 0x02, 0x26, 0x7c, 0x7f, 0x7f, 0xff, 0x0e, 0x6b, 0xff, 0x99, 0xd7, 0x1c, + 0x9a, 0x51, 0xb9, 0xd7, 0xee, 0x31, 0xdd, 0x86, 0x88, 0x1a, 0xfe, 0x79, + 0xc0, 0xe2, 0x12, 0x56, 0x0f, 0xbd, 0x9a, 0xff, 0x0f, 0xb7, 0x64, 0xce, + 0xf7, 0x5e, 0x5f, 0x11, 0xfe, 0x30, 0xc9, 0xbf, 0xee, 0xa6, 0x0e, 0x30, + 0x38, 0x75, 0x2d, 0x39, 0x1f, 0x46, 0x45, 0xb4, 0xea, 0xf7, 0xbf, 0x83, + 0xaf, 0x81, 0xcd, 0x68, 0xeb, 0xfc, 0x0f, 0x24, 0xeb, 0x86, 0x1d, 0x5b, + 0x9f, 0x8b, 0x8e, 0x09, 0x15, 0xf8, 0x2d, 0x5b, 0x85, 0xab, 0x3a, 0xa1, + 0x5b, 0xfe, 0x4a, 0x76, 0x48, 0x55, 0x39, 0x75, 0xc9, 0x23, 0xaf, 0xed, + 0xfc, 0x1c, 0xc5, 0x4e, 0xa0, 0x9e, 0x1e, 0x0a, 0xdf, 0xd9, 0xe8, 0x14, + 0x01, 0xd7, 0xfc, 0x1e, 0x0b, 0xb7, 0xf7, 0x76, 0xce, 0xbc, 0xfc, 0x9c, + 0xd1, 0x82, 0xdf, 0xf9, 0xf9, 0x82, 0x0d, 0x7b, 0x5b, 0x9d, 0x7f, 0xff, + 0xff, 0x67, 0xba, 0xe2, 0xaf, 0xcd, 0x71, 0xdf, 0xdb, 0x70, 0x3f, 0x31, + 0x6e, 0x3b, 0xc8, 0xf1, 0x05, 0xdf, 0xf9, 0xdd, 0x56, 0x38, 0x7e, 0x2a, + 0xd9, 0xe2, 0x0b, 0xbf, 0xfb, 0xa9, 0xd4, 0x81, 0xf7, 0xc5, 0x5b, 0x3c, + 0x41, 0x77, 0xfa, 0x10, 0x7d, 0xf1, 0x56, 0xcf, 0x10, 0x5d, 0xfc, 0xbc, + 0x0f, 0xc5, 0x5b, 0x3c, 0x41, 0x77, 0xff, 0xfc, 0xe2, 0x28, 0xbf, 0x9a, + 0x67, 0x53, 0x88, 0xac, 0xf8, 0xd9, 0xe2, 0x0b, 0xbb, 0x7f, 0x81, 0x4e, + 0x5d, 0x89, 0xfc, 0x53, 0x74, 0x21, 0x3e, 0xa8, 0x55, 0x8f, 0xd3, 0xe1, + 0x94, 0x63, 0x7f, 0x92, 0x15, 0xd7, 0xb5, 0xb9, 0xd7, 0xcf, 0xc0, 0x39, + 0xd7, 0xff, 0x75, 0x3a, 0x90, 0x3e, 0xf8, 0xab, 0x67, 0x88, 0x2e, 0xff, + 0xa6, 0xd3, 0x12, 0x7f, 0x8a, 0xb6, 0x78, 0x82, 0xef, 0xde, 0xd4, 0x2f, + 0xe3, 0x11, 0x3f, 0xf5, 0x4e, 0xff, 0xf7, 0xc6, 0x75, 0x19, 0x1e, 0xd7, + 0xc5, 0x5b, 0x3c, 0x41, 0x77, 0xff, 0xff, 0x08, 0xa2, 0xfe, 0x7f, 0x9f, + 0x34, 0xce, 0xa7, 0x11, 0x59, 0xf1, 0xb3, 0xc4, 0x17, 0x58, 0x99, 0x2e, + 0xe8, 0x8e, 0xbb, 0x7f, 0xdd, 0x4e, 0x22, 0xb3, 0xe3, 0x67, 0x88, 0x2e, + 0xff, 0xf9, 0xdf, 0x79, 0x6b, 0xa8, 0x10, 0xc7, 0x20, 0xab, 0xff, 0x64, + 0xa5, 0xfe, 0xb8, 0x33, 0xec, 0x9e, 0x20, 0xba, 0x62, 0x39, 0x78, 0x8f, + 0xa4, 0xeb, 0xff, 0x31, 0x39, 0xe7, 0x06, 0xbe, 0x36, 0x78, 0x82, 0xef, + 0xee, 0xa7, 0x7a, 0x80, 0x34, 0x01, 0x77, 0xec, 0x07, 0xc5, 0x5b, 0x3c, + 0x41, 0x77, 0x67, 0x98, 0x7e, 0x3d, 0x39, 0xad, 0xd1, 0xd9, 0xa8, 0x5f, + 0xdf, 0xcb, 0xc0, 0xfc, 0x55, 0xb3, 0xc4, 0x17, 0x7f, 0xe6, 0x75, 0x38, + 0x8a, 0xcf, 0x8d, 0x9e, 0x20, 0xbb, 0xb3, 0xe3, 0xa2, 0x2f, 0x47, 0xd7, + 0xfb, 0xf4, 0x5b, 0x8e, 0xf2, 0x3c, 0x41, 0x77, 0xfe, 0xc4, 0xdb, 0x83, + 0x81, 0x79, 0x1e, 0x20, 0xb5, 0x9e, 0x05, 0x05, 0x77, 0xf7, 0x86, 0xe0, + 0x34, 0x18, 0xf9, 0x35, 0x18, 0xaf, 0xa3, 0x1c, 0xfe, 0x16, 0x8d, 0xb7, + 0xdc, 0x08, 0x34, 0x41, 0x6a, 0x22, 0x32, 0xe7, 0x61, 0xd6, 0xd3, 0x19, + 0x38, 0x60, 0xa4, 0xbc, 0xf8, 0xd6, 0xe9, 0x6c, 0x1d, 0x7a, 0x25, 0xb0, + 0x75, 0x41, 0xb7, 0x11, 0x9a, 0x9d, 0x95, 0xc8, 0x12, 0x1d, 0xca, 0x81, + 0x4a, 0x00, 0x17, 0xab, 0xff, 0xb2, 0x43, 0x9e, 0xea, 0x66, 0xfe, 0x3a, + 0xff, 0x47, 0x51, 0xbd, 0xe5, 0xa3, 0xaf, 0xd1, 0xed, 0x75, 0x0e, 0xbf, + 0xed, 0xc7, 0x11, 0x78, 0x20, 0x3a, 0xff, 0xda, 0x9a, 0x5f, 0x86, 0x69, + 0x7e, 0x13, 0xaa, 0x74, 0x6a, 0x48, 0xd3, 0x09, 0xbc, 0x6d, 0x7f, 0xf4, + 0x6f, 0x2f, 0xab, 0xd7, 0xa3, 0x76, 0xce, 0xbf, 0x4b, 0x63, 0x63, 0xf9, + 0xce, 0xb7, 0x50, 0xfe, 0x5d, 0x26, 0xfd, 0xc8, 0xde, 0x5a, 0x3a, 0xa4, + 0x79, 0xdc, 0x26, 0xbf, 0xf7, 0xfa, 0xd9, 0xce, 0x01, 0x69, 0xa3, 0xaf, + 0xfe, 0xdb, 0xb6, 0x34, 0xfd, 0xde, 0x59, 0xe3, 0xa8, 0x08, 0x8a, 0xfa, + 0x85, 0x7f, 0x81, 0xff, 0x86, 0x3d, 0xa3, 0xa8, 0x07, 0xb1, 0xa2, 0x5a, + 0x85, 0x45, 0x59, 0x18, 0x23, 0xc6, 0x09, 0x7f, 0x3c, 0xa3, 0x6b, 0xf4, + 0xeb, 0xff, 0xb3, 0x7f, 0x69, 0x06, 0x00, 0xeb, 0x3a, 0xff, 0xcd, 0x3c, + 0x11, 0xcf, 0xb0, 0x20, 0x3a, 0xa7, 0x44, 0x17, 0xe8, 0x57, 0xdb, 0xea, + 0x37, 0x3a, 0xff, 0xd2, 0xcd, 0xe5, 0xc8, 0xf3, 0xf8, 0xeb, 0xcb, 0x89, + 0x1d, 0x7e, 0xc0, 0xf7, 0xf6, 0xce, 0xaf, 0x88, 0xa5, 0x98, 0x8d, 0xcf, + 0x84, 0x6e, 0xf0, 0x5f, 0xc7, 0x57, 0x0f, 0x65, 0xcf, 0xaf, 0x26, 0xce, + 0x1d, 0x79, 0xf8, 0x03, 0xad, 0xbc, 0x1b, 0x8f, 0x0e, 0xdf, 0x37, 0x9d, + 0x73, 0xaf, 0x95, 0xe2, 0x36, 0x75, 0xfa, 0x77, 0xec, 0x35, 0x9d, 0x4d, + 0x41, 0xe6, 0xe1, 0x1d, 0x42, 0xae, 0x6c, 0x85, 0x7a, 0x46, 0x46, 0xeb, + 0x20, 0x27, 0x16, 0xeb, 0xff, 0xc2, 0x31, 0x3a, 0xfa, 0x9c, 0xe3, 0xc8, + 0xeb, 0xfd, 0x3c, 0xf0, 0x3b, 0xe7, 0x8e, 0xac, 0x3f, 0xc4, 0x48, 0xbf, + 0xfb, 0x83, 0xfe, 0xfe, 0x1c, 0x9d, 0xc4, 0xeb, 0xcf, 0xc9, 0xce, 0xb8, + 0x10, 0x75, 0xf2, 0x42, 0xf0, 0xea, 0x3a, 0xfe, 0x75, 0x7d, 0x1c, 0x01, + 0xd4, 0x13, 0x6e, 0x21, 0x57, 0xff, 0xfa, 0x10, 0x23, 0x1f, 0xb3, 0xd8, + 0xc0, 0xc3, 0x3e, 0xac, 0xeb, 0x81, 0x07, 0x5d, 0x0a, 0x9d, 0x7f, 0xd9, + 0xed, 0x42, 0xfe, 0xe4, 0xc7, 0x5f, 0xed, 0x67, 0x53, 0x5f, 0xce, 0x75, + 0xcd, 0xb6, 0x55, 0xff, 0x0e, 0x6d, 0x79, 0x69, 0x02, 0x75, 0x31, 0x3f, + 0x14, 0x1c, 0xe0, 0xaa, 0xd5, 0xba, 0x40, 0x06, 0x16, 0x98, 0xa8, 0x8b, + 0x68, 0xe9, 0xb3, 0x4f, 0xa3, 0x17, 0x9b, 0x6d, 0xb2, 0xac, 0xb2, 0x94, + 0x2f, 0xef, 0xa6, 0x77, 0xe1, 0x4a, 0x23, 0x77, 0xec, 0x2f, 0x6a, 0x75, + 0x6b, 0x4f, 0x2c, 0x4a, 0xfe, 0xf4, 0x67, 0x72, 0x73, 0xae, 0xc5, 0x9d, + 0x5b, 0x9e, 0x0e, 0x8b, 0x2a, 0x1d, 0x34, 0x4c, 0xa3, 0x5d, 0xc9, 0x52, + 0xca, 0xc6, 0x7f, 0xbc, 0x78, 0x89, 0x2a, 0x43, 0x90, 0xf2, 0x59, 0x4f, + 0x67, 0x37, 0x1e, 0x96, 0xdc, 0x05, 0x81, 0x96, 0x81, 0xa9, 0x64, 0x3e, + 0x86, 0xdf, 0xf2, 0xde, 0xb6, 0xb6, 0xdf, 0xd8, 0x00, 0x27, 0x24, 0x75, + 0xcc, 0xc3, 0xa8, 0x27, 0x82, 0xe5, 0x97, 0x63, 0x67, 0x5d, 0x1e, 0x3a, + 0xa7, 0x35, 0x6c, 0x16, 0xb2, 0xce, 0xac, 0x36, 0x5e, 0x22, 0xbf, 0xd2, + 0x41, 0xc5, 0xff, 0xd3, 0xaf, 0xfd, 0x9e, 0xd7, 0x51, 0x6f, 0x9c, 0x3a, + 0xa0, 0xfb, 0x84, 0xca, 0xfd, 0x9f, 0x30, 0x1e, 0x3a, 0xfb, 0xe7, 0xa3, + 0x69, 0xd7, 0xd8, 0xbc, 0xf1, 0xd7, 0xbc, 0xea, 0x9d, 0x7f, 0xff, 0xe7, + 0x9b, 0xf9, 0x7e, 0xcf, 0x9d, 0x4f, 0x7a, 0x37, 0x89, 0xe3, 0x47, 0x5f, + 0x85, 0xda, 0xe7, 0x98, 0xeb, 0xe9, 0xb5, 0x1e, 0x3a, 0x98, 0x8b, 0xf9, + 0x9c, 0xbf, 0x2b, 0xbf, 0xff, 0xe6, 0xb1, 0x77, 0xdb, 0x12, 0xec, 0x72, + 0x78, 0xf6, 0x9e, 0x47, 0x5e, 0x4d, 0xe6, 0x3a, 0xfd, 0x99, 0x3f, 0xfa, + 0x3a, 0xfb, 0x82, 0x80, 0x3a, 0xf9, 0x18, 0xfc, 0x3a, 0xe8, 0x01, 0xd7, + 0xdf, 0xcf, 0xfa, 0x9d, 0x36, 0xbf, 0x48, 0x29, 0x11, 0x29, 0xd5, 0x5b, + 0x9a, 0xc0, 0x75, 0xf9, 0xe3, 0x7c, 0x61, 0xd7, 0xfd, 0xd7, 0xd7, 0x52, + 0x77, 0x13, 0xaf, 0x9e, 0x7f, 0xb2, 0x3a, 0x9a, 0x4b, 0x94, 0x90, 0xfd, + 0x28, 0x47, 0x04, 0x83, 0x0a, 0x37, 0x25, 0x42, 0x0e, 0x43, 0x6d, 0xcc, + 0x80, 0xd3, 0xa1, 0xdf, 0x42, 0xf3, 0xf2, 0x26, 0xc6, 0x7e, 0x93, 0x6c, + 0x1b, 0xdf, 0xc3, 0xf8, 0x56, 0xf2, 0x3a, 0xf2, 0x4f, 0xf9, 0xd7, 0xe8, + 0x02, 0x6f, 0x87, 0x5c, 0xbd, 0xa7, 0x58, 0x30, 0x6f, 0x84, 0x9a, 0xff, + 0xf4, 0x86, 0x3e, 0x2c, 0x61, 0x5f, 0x24, 0xe7, 0x5f, 0x9d, 0x79, 0xd5, + 0x9d, 0x5b, 0x9f, 0x8f, 0x92, 0xef, 0x7b, 0x90, 0x75, 0xfe, 0xd7, 0xb6, + 0xe0, 0xe0, 0x4e, 0xbf, 0xb3, 0x59, 0x24, 0xe1, 0xd7, 0xbb, 0x1b, 0x4e, + 0xbd, 0xa9, 0x4e, 0x75, 0x61, 0xba, 0xfa, 0x3b, 0x50, 0xa8, 0x5a, 0x45, + 0xb8, 0xb6, 0x90, 0x96, 0x59, 0x1b, 0x8d, 0x89, 0x9f, 0x99, 0x6f, 0x3f, + 0xcf, 0xa7, 0x5e, 0x99, 0x3a, 0x75, 0xfd, 0x1c, 0x79, 0x93, 0xa7, 0x5f, + 0xb4, 0x18, 0x19, 0xdc, 0xf2, 0x34, 0x39, 0x79, 0x70, 0xb3, 0xab, 0x73, + 0xd9, 0x59, 0xf5, 0xff, 0xf0, 0xcb, 0xe6, 0x05, 0x35, 0xbf, 0xbf, 0x7d, + 0x1d, 0x7e, 0xef, 0xe3, 0x1b, 0x4e, 0xbf, 0x85, 0xfd, 0x28, 0x54, 0xea, + 0x83, 0xd5, 0xfa, 0x53, 0x7d, 0x99, 0xbc, 0x8e, 0xbd, 0xa4, 0x98, 0xeb, + 0x2a, 0x26, 0xf7, 0x44, 0x37, 0xff, 0x3c, 0xe3, 0x1b, 0xa0, 0x46, 0x27, + 0x3a, 0xb8, 0x7d, 0x42, 0x4f, 0x7e, 0xf9, 0xd8, 0xe4, 0x8e, 0xaf, 0x8a, + 0xa7, 0xa2, 0x18, 0x18, 0x46, 0xc8, 0x53, 0xbc, 0x32, 0x9b, 0x21, 0xbc, + 0xbd, 0x41, 0xd7, 0xf4, 0xf3, 0x49, 0xa5, 0xc9, 0xce, 0xbe, 0x5e, 0x3f, + 0x4e, 0xb4, 0xe7, 0x5f, 0xbd, 0xd4, 0x5f, 0x0e, 0xa9, 0x1b, 0x8e, 0x08, + 0xde, 0xe8, 0x50, 0xeb, 0xf7, 0x71, 0x25, 0xa3, 0xaf, 0xff, 0xbb, 0x1f, + 0x54, 0xf0, 0xb8, 0x35, 0xa8, 0x01, 0x57, 0xec, 0xf3, 0xfe, 0xd3, 0x3a, + 0xfd, 0xc6, 0x3b, 0xb0, 0xf1, 0x02, 0x5e, 0xd4, 0x6e, 0x75, 0x81, 0x87, + 0x9f, 0xb9, 0x9d, 0xef, 0x24, 0xe7, 0x5e, 0x9d, 0xc4, 0xea, 0x92, 0x6a, + 0x01, 0x26, 0xdd, 0x47, 0x8f, 0x4b, 0x28, 0xf0, 0xe5, 0xfc, 0x2c, 0x75, + 0x7a, 0x87, 0x5d, 0xb1, 0x23, 0xaf, 0xbd, 0x3b, 0x89, 0xd7, 0x85, 0xd5, + 0x3a, 0xff, 0x2b, 0x93, 0xff, 0xed, 0xbe, 0x3a, 0xff, 0x9e, 0x5c, 0x89, + 0xdf, 0x8c, 0x3a, 0xf2, 0xa9, 0xe3, 0xaf, 0x69, 0xfc, 0x75, 0x2a, 0x6d, + 0xf7, 0x1c, 0xbb, 0xe7, 0x4e, 0xbf, 0x97, 0xe4, 0x0f, 0xf0, 0x75, 0xe5, + 0xf9, 0x87, 0x5b, 0xd0, 0x79, 0x38, 0x5b, 0x7f, 0x42, 0xf1, 0x58, 0xd1, + 0xd5, 0x3a, 0x7a, 0x58, 0x32, 0xc2, 0x1e, 0x0d, 0xac, 0xe3, 0xad, 0xe0, + 0x23, 0x16, 0x1f, 0x13, 0x5d, 0xcf, 0xce, 0xbf, 0xc2, 0xed, 0xeb, 0x50, + 0x03, 0xaf, 0x6c, 0xba, 0xa7, 0x5f, 0xf4, 0x2e, 0x59, 0x3e, 0x7e, 0xd3, + 0x3a, 0xf9, 0xfc, 0xd3, 0x9c, 0xea, 0xc4, 0x41, 0x20, 0xfb, 0x9e, 0xde, + 0x6e, 0x3e, 0x9d, 0x79, 0xb6, 0xdb, 0x3d, 0x5f, 0x57, 0x9c, 0x42, 0x5a, + 0xbe, 0xaa, 0x1a, 0xcb, 0xe9, 0x7f, 0x0a, 0x9d, 0x60, 0x1d, 0x58, 0x6c, + 0xdc, 0x8e, 0xa1, 0x3c, 0xd0, 0x8b, 0xf2, 0x16, 0x9d, 0x2d, 0x02, 0x57, + 0x9b, 0x2f, 0xf7, 0xbb, 0x92, 0xea, 0x6d, 0x3a, 0xf9, 0x7c, 0xfe, 0x73, + 0xaf, 0xff, 0x85, 0x15, 0x53, 0x5e, 0xef, 0xef, 0x29, 0x41, 0xd5, 0x07, + 0xeb, 0x84, 0x95, 0x3a, 0x64, 0xb2, 0x5c, 0x56, 0x15, 0x37, 0xd8, 0x17, + 0x91, 0xd7, 0xe7, 0x11, 0x45, 0x9d, 0x72, 0x74, 0xeb, 0xc1, 0x79, 0x1d, + 0x7f, 0x93, 0x98, 0x8b, 0x86, 0xb3, 0xa8, 0x27, 0xc7, 0x82, 0xbd, 0x1b, + 0xbf, 0x22, 0xdc, 0x70, 0xea, 0xf8, 0xc9, 0x2c, 0x6a, 0x86, 0xe0, 0xd6, + 0x4b, 0x01, 0x21, 0xc8, 0xda, 0xd5, 0x59, 0x48, 0xff, 0x9e, 0x5b, 0x80, + 0x0e, 0x04, 0x83, 0xf8, 0x43, 0xec, 0x97, 0x5f, 0xd9, 0xdc, 0x67, 0xf8, + 0x75, 0xf9, 0x3d, 0x1e, 0xd1, 0x57, 0xcc, 0x8f, 0x68, 0xab, 0x9b, 0x6c, + 0xaa, 0x91, 0xef, 0xe1, 0x33, 0x64, 0x37, 0x63, 0x65, 0x28, 0x6b, 0xef, + 0xa6, 0x17, 0x6c, 0xeb, 0xff, 0xef, 0x43, 0x33, 0x07, 0xdd, 0x48, 0x19, + 0xce, 0xa3, 0xab, 0x0f, 0x5b, 0x49, 0x95, 0x32, 0x6f, 0x40, 0x85, 0xd0, + 0x93, 0xb6, 0xf1, 0x7f, 0xf8, 0x63, 0x70, 0x60, 0xc4, 0xb9, 0xc8, 0x3a, + 0xff, 0xde, 0xd6, 0x33, 0xae, 0x3e, 0xd1, 0xd7, 0x90, 0x40, 0x77, 0xc3, + 0x7b, 0x68, 0x5a, 0x2c, 0x36, 0xc2, 0x12, 0xfd, 0x2e, 0xff, 0x1c, 0x3a, + 0xff, 0xe7, 0x5f, 0x23, 0x6a, 0x6d, 0x1f, 0xf4, 0x75, 0x6e, 0x7d, 0xfd, + 0x28, 0xbf, 0x67, 0xeb, 0x8d, 0x1d, 0x47, 0x5d, 0x93, 0x70, 0xd8, 0xe8, + 0x9e, 0xff, 0x93, 0xf6, 0x9f, 0x63, 0xe8, 0xce, 0x75, 0xff, 0x44, 0xf1, + 0xbf, 0x87, 0x27, 0x3a, 0xb1, 0x14, 0xac, 0x2d, 0x43, 0xfb, 0xf3, 0xac, + 0x63, 0x73, 0xaa, 0x64, 0xd3, 0x79, 0x0f, 0x9e, 0x97, 0x5f, 0x67, 0x72, + 0x73, 0xaf, 0x49, 0xf8, 0x75, 0xfa, 0x59, 0xec, 0x09, 0x57, 0xd0, 0x23, + 0x07, 0x54, 0xc7, 0xbf, 0xe1, 0xbf, 0xa4, 0xd7, 0xc0, 0xd2, 0xf8, 0x75, + 0x2a, 0x8d, 0x44, 0x84, 0x07, 0x8c, 0xaf, 0xf8, 0x73, 0xb9, 0xf3, 0xb9, + 0x39, 0xd7, 0xff, 0xff, 0x02, 0x05, 0x8f, 0xe7, 0xdc, 0x1b, 0xf9, 0x17, + 0xae, 0xc7, 0xd1, 0x3a, 0xfe, 0xfd, 0xa6, 0x9c, 0xe6, 0x1d, 0x7d, 0xe5, + 0x73, 0xa7, 0x5f, 0xf8, 0x73, 0xde, 0xfe, 0x7f, 0x63, 0x0e, 0xbf, 0x07, + 0xf7, 0xe4, 0x8e, 0xb6, 0x8e, 0xb9, 0x00, 0x75, 0xdd, 0x43, 0xae, 0xff, + 0x5f, 0x0d, 0x54, 0xc2, 0xb4, 0xe7, 0xd6, 0x03, 0xab, 0x81, 0x07, 0x5c, + 0x08, 0x3a, 0xfd, 0xfc, 0xb0, 0x54, 0x43, 0x54, 0x01, 0x5a, 0x84, 0xdf, + 0x55, 0x22, 0x43, 0xf0, 0x42, 0x4c, 0x52, 0xef, 0xff, 0xb0, 0x5f, 0x7d, + 0x2a, 0xab, 0xfc, 0x62, 0xc0, 0x75, 0xff, 0xde, 0xee, 0x2f, 0xec, 0x03, + 0x37, 0xf1, 0xd7, 0xfb, 0x76, 0x27, 0x3e, 0xc0, 0x4e, 0xbe, 0x02, 0xde, + 0x5f, 0x11, 0x9d, 0xa5, 0x3f, 0x23, 0x5d, 0xff, 0x8e, 0xbf, 0x80, 0xbf, + 0xba, 0xfb, 0x39, 0xd7, 0xf6, 0x90, 0x46, 0x37, 0x3a, 0xec, 0xdc, 0xea, + 0xdc, 0xfd, 0x3c, 0x67, 0xb2, 0x57, 0x7c, 0x0e, 0x27, 0x0e, 0xa8, 0x4c, + 0xa2, 0x49, 0x2f, 0x08, 0xb6, 0xcc, 0xef, 0x7f, 0xbf, 0x8e, 0xb3, 0x9d, + 0x5a, 0x35, 0xbe, 0x1e, 0xbb, 0x1b, 0x3a, 0xff, 0xa3, 0x7c, 0x04, 0x6d, + 0xc9, 0xce, 0xbf, 0x87, 0x3d, 0xa7, 0x01, 0xd5, 0xc3, 0xfb, 0x00, 0xb6, + 0x8e, 0xaf, 0xfa, 0x27, 0xd7, 0x31, 0x91, 0x39, 0xd7, 0xfb, 0x06, 0x7c, + 0x0b, 0xf4, 0xea, 0x98, 0xfa, 0x9b, 0x39, 0xbf, 0xb1, 0x78, 0x14, 0x6c, + 0xeb, 0x97, 0x07, 0x52, 0xcf, 0x05, 0xcb, 0x2f, 0xe1, 0xc9, 0xba, 0x9e, + 0x3a, 0xfb, 0x33, 0xba, 0x3a, 0xb1, 0x1a, 0x4e, 0xcb, 0xe2, 0x1d, 0x82, + 0xcb, 0xcd, 0xb6, 0xd9, 0x57, 0xec, 0x54, 0x7f, 0xd1, 0x4a, 0x17, 0xf7, + 0xca, 0x36, 0xdb, 0x67, 0x5d, 0x80, 0x3a, 0xb0, 0xdd, 0xf8, 0x9a, 0xa1, + 0x12, 0x7e, 0x73, 0xbf, 0xfe, 0x49, 0x3e, 0x96, 0xb7, 0x93, 0xab, 0xd4, + 0x3a, 0xf9, 0x38, 0x0d, 0x1d, 0x7f, 0xda, 0xe4, 0x7f, 0xe1, 0x4d, 0xa7, + 0x5f, 0xf8, 0x73, 0x4c, 0xea, 0x32, 0x04, 0xeb, 0xff, 0xfc, 0xab, 0x6f, + 0xc5, 0x54, 0xd6, 0x48, 0x7f, 0x7d, 0x60, 0x9d, 0x50, 0x8d, 0x8c, 0x3a, + 0x43, 0xbb, 0xe6, 0xdc, 0x64, 0x75, 0xff, 0x7a, 0x37, 0x03, 0xf7, 0xa8, + 0x75, 0xba, 0x75, 0x61, 0xe4, 0x30, 0xe2, 0xfc, 0x39, 0xe8, 0xe1, 0xd7, + 0x9b, 0x6d, 0xb2, 0xaf, 0xce, 0xaf, 0x53, 0xc5, 0x28, 0x5f, 0xd4, 0x1f, + 0xda, 0x22, 0x5e, 0xdb, 0x0b, 0x3a, 0xf7, 0x91, 0xb3, 0xaf, 0x69, 0xf8, + 0x75, 0x6e, 0x6d, 0xfc, 0x39, 0x7b, 0xb0, 0x13, 0xab, 0x11, 0x22, 0x8a, + 0x8e, 0x45, 0x7e, 0xc0, 0x66, 0x4c, 0x75, 0xb5, 0xf1, 0x3a, 0x0e, 0x42, + 0x73, 0xb0, 0xb1, 0x12, 0xdb, 0xbf, 0x90, 0x55, 0x2c, 0x64, 0xa0, 0x9b, + 0xf3, 0x4f, 0xb1, 0x3f, 0xe7, 0x5f, 0xfc, 0x9e, 0x8e, 0x60, 0xf9, 0xdc, + 0x4e, 0xa9, 0x97, 0x08, 0xbb, 0x0f, 0x91, 0x95, 0x0b, 0xf9, 0xc6, 0xd2, + 0xdb, 0xd1, 0xb6, 0x0e, 0xac, 0x5c, 0xe8, 0x49, 0xc7, 0x01, 0x5c, 0xbc, + 0x31, 0xb4, 0xeb, 0xff, 0xb9, 0x0c, 0xe8, 0xbf, 0x86, 0x1b, 0x3a, 0xe6, + 0x9a, 0x1d, 0x72, 0x74, 0xea, 0x9c, 0xd7, 0x70, 0x66, 0xa1, 0x12, 0x4e, + 0xe1, 0x7d, 0xed, 0x7e, 0xd6, 0x75, 0xfe, 0x81, 0x90, 0xa4, 0x6e, 0x75, + 0x43, 0x65, 0x15, 0x28, 0x7a, 0x64, 0x7d, 0x6a, 0xc6, 0x16, 0xc3, 0x5d, + 0xce, 0x51, 0xcf, 0x91, 0xd7, 0x76, 0x52, 0x23, 0xb7, 0x82, 0x13, 0x83, + 0x1b, 0x5e, 0xa1, 0xe1, 0xe9, 0xd0, 0xad, 0xa7, 0x1b, 0x30, 0xae, 0xfa, + 0x43, 0xb0, 0x4d, 0x7e, 0x49, 0xa4, 0x82, 0x75, 0xcd, 0x42, 0x1d, 0x7f, + 0xd3, 0x7b, 0x63, 0x51, 0x37, 0xfc, 0x3a, 0xff, 0x06, 0x05, 0x70, 0x18, + 0x3a, 0xa0, 0xfb, 0xdc, 0xfe, 0xff, 0xec, 0x4e, 0xc0, 0x7b, 0xfc, 0x6f, + 0xa3, 0xaf, 0x05, 0x50, 0x1d, 0x7e, 0x5f, 0x38, 0xfe, 0x3a, 0xbe, 0x1e, + 0x24, 0x0e, 0xdf, 0xfd, 0x33, 0xb3, 0xb1, 0x2f, 0x0e, 0x2c, 0xeb, 0xfb, + 0x98, 0x22, 0xf3, 0x9d, 0x4c, 0x3e, 0xe4, 0x43, 0xbf, 0xfe, 0x45, 0xef, + 0x2d, 0x7c, 0xc1, 0x1c, 0x40, 0x1d, 0x79, 0x3b, 0xf9, 0xd5, 0xf1, 0x53, + 0xa3, 0x54, 0x4d, 0x28, 0x44, 0xf0, 0x83, 0xb0, 0x88, 0x78, 0x48, 0xf8, + 0x87, 0x6a, 0x7d, 0x94, 0x6a, 0x23, 0xc0, 0xfc, 0x68, 0x43, 0x25, 0xab, + 0x8d, 0x09, 0xa4, 0xcc, 0xd1, 0xe3, 0x1a, 0x6a, 0x71, 0x8a, 0x35, 0x23, + 0xa6, 0x89, 0x5a, 0x2b, 0x05, 0x69, 0xe7, 0x6f, 0xe5, 0x4a, 0xe9, 0x0d, + 0x2c, 0xff, 0x2d, 0xfc, 0x32, 0xb2, 0xfa, 0x99, 0x4e, 0x09, 0xde, 0x94, + 0x24, 0x94, 0xb9, 0x36, 0xb8, 0xe0, 0x26, 0xa7, 0x3a, 0xf2, 0x9f, 0xfc, + 0xba, 0x51, 0xcf, 0x6b, 0xc3, 0xf7, 0xb4, 0x0c, 0x80, 0xa5, 0xe8, 0xb4, + 0xe1, 0xe4, 0x35, 0xce, 0xb6, 0xaf, 0x08, 0x4b, 0xd6, 0xa8, 0x97, 0xf9, + 0xe1, 0x4d, 0xb2, 0xc2, 0x5b, 0x96, 0x23, 0xb3, 0x49, 0x94, 0xfb, 0x5a, + 0x6c, 0xec, 0x4b, 0xae, 0xa5, 0x23, 0xc4, 0x9b, 0x96, 0x78, 0x32, 0x17, + 0xe5, 0x00, 0xbc, 0xf1, 0xd7, 0xf9, 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0xb8, + 0xef, 0xf2, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x75, 0xdf, 0xfc, 0xa3, 0xc9, + 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0x94, 0x6a, 0x23, 0xca, 0x89, 0x94, 0x33, + 0x02, 0x52, 0xac, 0x23, 0xd8, 0x50, 0x92, 0x8b, 0x1a, 0xe1, 0x1a, 0xf9, + 0xe2, 0x79, 0x00, 0xef, 0x45, 0x1e, 0x3f, 0xd8, 0x3f, 0xbf, 0xfc, 0xa2, + 0xde, 0x4a, 0x67, 0x18, 0xee, 0xc3, 0x44, 0xb5, 0x7f, 0xcd, 0x1b, 0xa8, + 0xd6, 0xf1, 0xbe, 0xc1, 0xd7, 0xee, 0x31, 0xdd, 0x86, 0x88, 0xde, 0xff, + 0xee, 0xc2, 0x71, 0x1a, 0x6c, 0xec, 0x36, 0x75, 0xff, 0x9e, 0x4a, 0x67, + 0x18, 0xee, 0xc3, 0x44, 0xbf, 0x7f, 0x47, 0xbe, 0xf5, 0xfc, 0x75, 0xfe, + 0xcf, 0xbc, 0x57, 0xbf, 0xe8, 0xeb, 0xef, 0xfa, 0x9c, 0x3a, 0xf4, 0xda, + 0xe1, 0xd6, 0x51, 0xa9, 0x27, 0x59, 0x88, 0x8c, 0x33, 0x5a, 0x3f, 0x52, + 0x84, 0xbb, 0x64, 0xdf, 0xe9, 0x15, 0xff, 0xed, 0xe5, 0xe4, 0x99, 0x40, + 0xa6, 0xd8, 0x09, 0xd7, 0xf9, 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0xaa, 0xee, + 0x4d, 0x83, 0xaf, 0x91, 0x6f, 0xb4, 0xea, 0x54, 0xdd, 0x78, 0x62, 0xf0, + 0xec, 0x36, 0x75, 0xfd, 0xd8, 0xdb, 0xf8, 0x70, 0xeb, 0xf9, 0xfb, 0x30, + 0xc0, 0x4e, 0xbf, 0xfb, 0xdd, 0x8d, 0x0b, 0xfe, 0xd3, 0x4e, 0x1d, 0x7a, + 0x25, 0x87, 0x54, 0x91, 0x78, 0x12, 0xfd, 0xcb, 0x26, 0x47, 0xbf, 0xe5, + 0x70, 0x73, 0x7f, 0x3a, 0xce, 0xbd, 0xb1, 0x1e, 0x3a, 0xff, 0x72, 0x17, + 0xf6, 0x05, 0x87, 0x5f, 0x3f, 0x9f, 0x73, 0xae, 0x0a, 0x1d, 0x7f, 0x67, + 0x18, 0xee, 0xc3, 0x44, 0x81, 0x5f, 0x0f, 0x35, 0x41, 0x5b, 0xf6, 0x9c, + 0x5f, 0x73, 0xae, 0xfe, 0x0e, 0xa9, 0x1f, 0x0e, 0xe4, 0xbc, 0x26, 0xbf, + 0xd2, 0x8e, 0x4f, 0x1c, 0x9c, 0xeb, 0xfd, 0xc9, 0xd7, 0x03, 0x2d, 0x1d, + 0x50, 0x7c, 0xf8, 0x69, 0x7d, 0x93, 0xb8, 0x4e, 0xb9, 0xa1, 0xd3, 0xaf, + 0xff, 0x64, 0xdd, 0x75, 0xfb, 0xb1, 0xef, 0xd6, 0x75, 0x4e, 0xaf, 0x44, + 0x24, 0x59, 0x0d, 0xb5, 0x4f, 0xda, 0xce, 0x26, 0x1e, 0xe9, 0x9b, 0xc3, + 0x3c, 0x61, 0x2f, 0xe2, 0x0d, 0x92, 0x1f, 0xa3, 0x57, 0xe8, 0x11, 0xcf, + 0x1d, 0x7d, 0xce, 0x23, 0x0e, 0xbe, 0x1c, 0x9d, 0x4d, 0x93, 0xc5, 0xfa, + 0x49, 0x7f, 0x94, 0xeb, 0xaf, 0x20, 0x27, 0x52, 0x89, 0xba, 0x72, 0x30, + 0x3d, 0x93, 0xfb, 0xfc, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x59, 0x17, 0xf9, + 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0xb5, 0xef, 0xff, 0x67, 0xd8, 0x9d, 0x4c, + 0x9b, 0xc1, 0x81, 0x3a, 0xff, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x17, 0x25, + 0xfb, 0x8c, 0x77, 0x61, 0xa2, 0xec, 0xbf, 0xf3, 0xc9, 0x4c, 0xe3, 0x1d, + 0xd8, 0x68, 0xa3, 0xac, 0xa6, 0x1f, 0xea, 0xcc, 0xef, 0x86, 0x24, 0xb3, + 0xaf, 0xfc, 0xd2, 0x68, 0x2e, 0x39, 0x2c, 0x4d, 0xa7, 0x5a, 0x47, 0x5f, + 0xb8, 0xc7, 0x76, 0x1a, 0x29, 0x5b, 0xfe, 0x67, 0x52, 0x6e, 0xc4, 0xf8, + 0x75, 0xff, 0xee, 0xc4, 0xf1, 0xd4, 0xda, 0xe1, 0xea, 0x1c, 0xa1, 0xb9, + 0xba, 0x4a, 0x62, 0x31, 0xe6, 0x6c, 0xad, 0xd3, 0x07, 0x78, 0x6b, 0xdf, + 0xf9, 0xd3, 0xd2, 0xfc, 0x2e, 0x20, 0x3a, 0xca, 0x05, 0x3d, 0x4d, 0xc8, + 0x17, 0x1a, 0x77, 0x4a, 0x6a, 0x76, 0x64, 0xd4, 0xa5, 0x01, 0xe4, 0x20, + 0xb7, 0x4e, 0x49, 0xdb, 0xe5, 0x9d, 0x80, 0xfc, 0x4f, 0xf4, 0x99, 0xe8, + 0x5e, 0x6d, 0x8f, 0xf2, 0xff, 0xa4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x47, + 0x17, 0xfc, 0x8a, 0x67, 0x18, 0xee, 0xc3, 0x45, 0x6b, 0x65, 0x1d, 0x11, + 0x3e, 0x45, 0xbf, 0xfc, 0xa2, 0xde, 0x4a, 0x67, 0x18, 0xee, 0xc3, 0x44, + 0xb7, 0x7b, 0xfe, 0x00, 0xeb, 0xb3, 0x73, 0xaf, 0xf0, 0x71, 0x6b, 0x84, + 0xd1, 0xd7, 0xb6, 0xff, 0x23, 0xa9, 0x88, 0x83, 0xdc, 0x75, 0x05, 0xb6, + 0x98, 0xde, 0xe8, 0x64, 0x75, 0xff, 0x66, 0xe3, 0x80, 0x03, 0xc8, 0xeb, + 0x96, 0xc3, 0xaf, 0xf6, 0x26, 0xfa, 0x0e, 0x09, 0xd5, 0x07, 0xfd, 0x23, + 0x7e, 0x0b, 0x5f, 0x0c, 0x6f, 0x23, 0xaf, 0xff, 0xcf, 0xb8, 0x03, 0xd7, + 0x96, 0x68, 0x7f, 0x7f, 0xa7, 0x5f, 0x03, 0x39, 0x31, 0xd4, 0xc4, 0x4d, + 0x74, 0x84, 0x0a, 0xf6, 0x54, 0xeb, 0xf9, 0x38, 0x29, 0xed, 0x1d, 0x7e, + 0xe3, 0x8e, 0x41, 0xd4, 0x68, 0x86, 0xd0, 0xf8, 0x3a, 0x22, 0xe5, 0x77, + 0x40, 0x9d, 0x7f, 0x20, 0x87, 0x10, 0x27, 0x54, 0x1b, 0xe9, 0x0a, 0x5f, + 0x64, 0xd2, 0xc3, 0xaf, 0xfc, 0xf2, 0x53, 0x38, 0xc7, 0x76, 0x1a, 0x26, + 0x0b, 0xcd, 0xa0, 0x0e, 0xbe, 0xd3, 0x88, 0x0e, 0xa9, 0x8d, 0xe0, 0x07, + 0x2f, 0xf7, 0xfb, 0xf1, 0x21, 0x78, 0x75, 0xfb, 0xa9, 0x03, 0x39, 0xd7, + 0xfd, 0x13, 0xf8, 0x63, 0xff, 0x68, 0xeb, 0x7b, 0xa8, 0x92, 0xd1, 0x9e, + 0xc9, 0x35, 0xf6, 0xec, 0x45, 0x4e, 0xac, 0x3d, 0xcf, 0x1c, 0xdf, 0xee, + 0x27, 0xb1, 0x71, 0xd3, 0xaf, 0xf6, 0x93, 0xa8, 0xbc, 0x54, 0xeb, 0xff, + 0xcf, 0x3f, 0x52, 0x07, 0x26, 0x4e, 0x21, 0xd5, 0x88, 0xaa, 0xf1, 0x8b, + 0x66, 0x57, 0x33, 0x0e, 0xbb, 0xf0, 0x15, 0x48, 0x6b, 0x38, 0x2b, 0x7f, + 0xb0, 0x23, 0x9e, 0xee, 0x1d, 0x73, 0x49, 0x87, 0x8c, 0x2a, 0xfe, 0x9f, + 0xee, 0xcb, 0x88, 0x0e, 0xbf, 0xb3, 0xde, 0x8e, 0x68, 0xeb, 0xf9, 0xc4, + 0x13, 0x83, 0xc7, 0x54, 0x22, 0x2c, 0x4c, 0xb6, 0x4b, 0x2c, 0xa4, 0x2f, + 0x70, 0x4e, 0x7e, 0x18, 0x4d, 0x64, 0x32, 0x19, 0x09, 0x0d, 0xdf, 0xb8, + 0x40, 0xb2, 0x17, 0x84, 0x30, 0xc6, 0x21, 0xa8, 0x65, 0xf9, 0x73, 0x69, + 0x03, 0x66, 0x1f, 0x61, 0x65, 0x79, 0x7f, 0xf0, 0xab, 0xff, 0x3c, 0x94, + 0xce, 0x31, 0xdd, 0x86, 0x89, 0x8e, 0xfa, 0x39, 0x1b, 0x07, 0x59, 0x44, + 0x44, 0x52, 0xc7, 0x7a, 0x95, 0x7d, 0x13, 0xc7, 0x0e, 0xbf, 0x64, 0x4c, + 0x8b, 0x3a, 0x90, 0xf1, 0xf8, 0x43, 0x7f, 0x05, 0x71, 0x9e, 0xd1, 0xd7, + 0xfb, 0xb1, 0xc9, 0xfe, 0xfe, 0x03, 0xae, 0x7d, 0x1d, 0x7d, 0xf3, 0xd9, + 0xd3, 0xad, 0x1d, 0x37, 0x1a, 0x15, 0xbd, 0x03, 0x39, 0xd7, 0xff, 0xff, + 0xd2, 0xd7, 0x73, 0xf6, 0xf5, 0xdc, 0x66, 0x6b, 0xe6, 0x6f, 0x2d, 0x20, + 0xa1, 0xd7, 0x9d, 0xd8, 0x68, 0xac, 0x6f, 0x9f, 0xec, 0x2a, 0x75, 0x30, + 0xf2, 0xb8, 0x4f, 0x7f, 0xed, 0x9c, 0xf0, 0xe7, 0xf0, 0x3e, 0x3a, 0x95, + 0x4d, 0xb1, 0x84, 0xdb, 0x8d, 0xf2, 0x19, 0x5e, 0x22, 0xbf, 0xf8, 0x7c, + 0xaf, 0xf0, 0x38, 0xc8, 0xe1, 0xd7, 0xfb, 0x93, 0xfb, 0x4f, 0xbb, 0x0e, + 0xa8, 0x3f, 0x87, 0x43, 0xbf, 0x6c, 0x7b, 0x37, 0x98, 0xeb, 0xff, 0xff, + 0xfc, 0xfe, 0xf6, 0x77, 0x4f, 0x24, 0x1f, 0x4b, 0x39, 0x9a, 0xce, 0xbc, + 0xe3, 0x12, 0x3a, 0xa1, 0x16, 0xda, 0x2c, 0xbf, 0xbf, 0xd9, 0x67, 0x51, + 0xa6, 0x75, 0xfd, 0x9a, 0xde, 0x51, 0xd3, 0xae, 0x8d, 0xa7, 0x57, 0x4f, + 0x10, 0x4b, 0x6f, 0xf4, 0xcf, 0x89, 0x2f, 0xab, 0x3a, 0x82, 0x7a, 0xa8, + 0x43, 0x7f, 0xd1, 0xbc, 0xa6, 0x93, 0xf2, 0x73, 0xaa, 0x13, 0x2a, 0xc8, + 0x67, 0x21, 0x0d, 0xe8, 0x97, 0x8e, 0xbf, 0xf6, 0x07, 0x89, 0xfc, 0xe0, + 0xd4, 0x8e, 0xbe, 0x5b, 0xef, 0xe3, 0xaf, 0xfe, 0x9e, 0x3d, 0xf3, 0xeb, + 0x3e, 0xec, 0x7d, 0xd1, 0xd7, 0xfd, 0xc8, 0xd3, 0xf0, 0x62, 0x47, 0x57, + 0x11, 0x0f, 0xb5, 0x46, 0xf4, 0x9e, 0x73, 0xaf, 0x7c, 0x9d, 0x67, 0x5c, + 0x1f, 0x1d, 0x4d, 0x24, 0xc7, 0xf2, 0x15, 0x3b, 0x92, 0xa0, 0xe0, 0x8f, + 0xdf, 0xf8, 0x5c, 0x3d, 0x8d, 0xbd, 0x71, 0x3a, 0xff, 0xff, 0xdf, 0xcf, + 0x8c, 0xf8, 0x3f, 0xec, 0x7c, 0xcd, 0xe5, 0x9f, 0x88, 0x34, 0x75, 0xff, + 0xe9, 0xf3, 0x7f, 0x69, 0x06, 0x00, 0xeb, 0x3a, 0xff, 0x6e, 0x38, 0x1e, + 0xbb, 0x67, 0x56, 0x1f, 0xe3, 0xa4, 0xd0, 0x53, 0x50, 0x13, 0xdd, 0x43, + 0xce, 0xfe, 0x9e, 0x69, 0x34, 0xb9, 0x39, 0xd7, 0xc2, 0x39, 0xe3, 0xaf, + 0xc8, 0xd7, 0xce, 0x21, 0xd4, 0xd5, 0x1f, 0xec, 0x1a, 0xf4, 0x7e, 0xfe, + 0x9f, 0xee, 0xcb, 0x88, 0x0e, 0xbe, 0x6b, 0x8d, 0x09, 0xd7, 0xfe, 0xeb, + 0xaf, 0xdd, 0x8f, 0x7e, 0xb3, 0xab, 0x0f, 0x8a, 0x62, 0x3b, 0xff, 0xb3, + 0x15, 0x5c, 0x27, 0x38, 0x8d, 0x9d, 0x7f, 0xc9, 0x24, 0xef, 0xeb, 0x5a, + 0x1d, 0x50, 0x99, 0x8e, 0x42, 0x53, 0x84, 0x5e, 0x43, 0xbd, 0xd4, 0x52, + 0x19, 0x57, 0x53, 0x90, 0xc8, 0xb3, 0x23, 0xdb, 0x64, 0x32, 0xb9, 0x0d, + 0x6e, 0xc6, 0x98, 0xe6, 0x62, 0x37, 0xa8, 0xd7, 0xfd, 0x1d, 0x16, 0xcc, + 0x2c, 0xbe, 0xc6, 0xc9, 0x79, 0xa3, 0x6c, 0xb5, 0x47, 0x5d, 0x21, 0x3a, + 0xfe, 0xe7, 0x20, 0x38, 0xb3, 0xaf, 0xa7, 0xe4, 0x4e, 0x75, 0xdf, 0x40, + 0x75, 0xee, 0xa2, 0xce, 0xb4, 0xc7, 0x53, 0x9a, 0xcf, 0xc6, 0xef, 0xce, + 0x33, 0xff, 0xa3, 0xaf, 0xfa, 0x03, 0xdc, 0x0f, 0x1d, 0x87, 0x52, 0x26, + 0x26, 0xe5, 0x80, 0x23, 0x14, 0x4d, 0x10, 0xf8, 0xa2, 0xdd, 0x3a, 0xf6, + 0xbe, 0xe8, 0xeb, 0xed, 0xe7, 0x85, 0x4e, 0xa9, 0xcf, 0x48, 0x22, 0x1f, + 0x8f, 0x5d, 0xe8, 0x3a, 0xff, 0x6f, 0xc8, 0x49, 0x3e, 0x8e, 0xbe, 0xc1, + 0x89, 0x1d, 0x58, 0x7a, 0x2b, 0x32, 0xbf, 0xd8, 0x0d, 0x67, 0x93, 0x87, + 0x5f, 0x7f, 0xec, 0xd1, 0xd7, 0xd1, 0xc7, 0x13, 0xaf, 0xf3, 0xf2, 0x40, + 0x4d, 0xf4, 0x75, 0xf6, 0xb5, 0x00, 0x3a, 0xa1, 0x1c, 0xf8, 0x42, 0x86, + 0x3d, 0x22, 0xfc, 0x7d, 0xb3, 0x3b, 0xf9, 0x04, 0x73, 0x6b, 0x9d, 0x7a, + 0x5f, 0x7c, 0x75, 0xf4, 0x81, 0xfc, 0x8e, 0xbe, 0xe7, 0xd8, 0x01, 0xd5, + 0x07, 0x8c, 0x84, 0x77, 0xf9, 0x27, 0x75, 0x80, 0x10, 0x75, 0xc8, 0x13, + 0xaf, 0xf9, 0x19, 0xdc, 0x98, 0x60, 0x27, 0x5f, 0x4b, 0xd9, 0xf4, 0xeb, + 0xcc, 0x80, 0x1d, 0x7b, 0x90, 0xb3, 0xa9, 0xcf, 0x67, 0xf2, 0x36, 0xc6, + 0xef, 0xa7, 0xfb, 0x93, 0x1d, 0x7a, 0x39, 0x39, 0xd5, 0x07, 0x82, 0x84, + 0xb7, 0xa0, 0x64, 0x75, 0xf7, 0x85, 0x36, 0x0e, 0xa0, 0xaa, 0x54, 0xdc, + 0xae, 0x66, 0x4e, 0x10, 0x2c, 0xcb, 0xa2, 0xa3, 0x09, 0x0d, 0x38, 0xf8, + 0x83, 0xf1, 0xab, 0xfd, 0xd7, 0x96, 0xc6, 0xc7, 0xf3, 0x9d, 0x77, 0x76, + 0x4e, 0xbf, 0xf4, 0x66, 0xbe, 0x42, 0x07, 0xec, 0x8e, 0xbf, 0x91, 0xbd, + 0x4f, 0x8d, 0x9d, 0x42, 0x7d, 0xfe, 0x40, 0xbf, 0x40, 0x7d, 0x8c, 0x3a, + 0xfb, 0xb0, 0x2c, 0x3a, 0xa4, 0x7c, 0xfa, 0x21, 0xf1, 0x35, 0xf3, 0x8b, + 0xcc, 0x75, 0xf9, 0x3c, 0x39, 0x23, 0xaf, 0xa1, 0xb8, 0x98, 0xeb, 0xbe, + 0xac, 0xeb, 0xfb, 0xc2, 0xe0, 0xc1, 0x3a, 0xfc, 0x2e, 0x0c, 0x13, 0xad, + 0xff, 0xc3, 0xce, 0xf1, 0x55, 0x4e, 0x8f, 0x85, 0x48, 0x10, 0x97, 0xa4, + 0x42, 0xcd, 0x7f, 0xa1, 0xb0, 0xfe, 0xfc, 0x91, 0xd7, 0xf2, 0x73, 0x7d, + 0x44, 0x8e, 0xb6, 0xd3, 0xab, 0x87, 0xe7, 0xd3, 0x4d, 0x82, 0xdb, 0xc2, + 0x8a, 0x9d, 0x7d, 0x81, 0x4d, 0xa7, 0x5d, 0x0b, 0xc3, 0x7a, 0xe3, 0x77, + 0xfd, 0x8d, 0xbe, 0xfd, 0x8f, 0xa2, 0x75, 0xb4, 0x75, 0x21, 0xfa, 0x70, + 0xa9, 0xce, 0xae, 0x04, 0x15, 0x73, 0x6d, 0x95, 0x48, 0x6b, 0x5b, 0x15, + 0xbf, 0xcf, 0x21, 0xcf, 0x75, 0x0a, 0x50, 0xd0, 0xde, 0x7d, 0xf4, 0x75, + 0xb4, 0x75, 0xf7, 0xde, 0xbf, 0x8e, 0xa0, 0x9e, 0x7e, 0xe3, 0x9e, 0x10, + 0xbd, 0x03, 0x31, 0xd7, 0x0c, 0x1d, 0x69, 0x8e, 0xa9, 0x8f, 0x03, 0x83, + 0x6e, 0x29, 0x7f, 0xf2, 0xa8, 0x2c, 0xd4, 0x2d, 0xf7, 0xf1, 0xd7, 0x81, + 0x9b, 0x07, 0x52, 0xa7, 0xc5, 0xc4, 0x4b, 0xe5, 0xeb, 0xf5, 0x9d, 0x65, + 0x4e, 0xb6, 0xc9, 0xd7, 0x71, 0x53, 0xaa, 0x0f, 0x79, 0x08, 0xff, 0x11, + 0xfa, 0x27, 0x7f, 0xfd, 0xdc, 0x96, 0xa3, 0xd2, 0xc6, 0xb7, 0x10, 0x1d, + 0x7f, 0xe9, 0x27, 0xbb, 0x9b, 0xfb, 0xf8, 0x3a, 0xec, 0xd1, 0xd5, 0x07, + 0xa9, 0x23, 0xfa, 0xd2, 0x31, 0x7d, 0x0a, 0x4b, 0x00, 0xeb, 0xf2, 0x42, + 0xe1, 0x67, 0x5b, 0x0e, 0xa4, 0x3e, 0xc7, 0x28, 0xd0, 0x86, 0xc9, 0x2d, + 0x42, 0xb2, 0xdc, 0x70, 0x48, 0x48, 0xf6, 0x10, 0x2f, 0x1b, 0x75, 0xed, + 0x44, 0xc7, 0x5f, 0xd8, 0x1c, 0xda, 0x9c, 0x3a, 0x8e, 0xb2, 0xce, 0xaf, + 0x17, 0x5b, 0x42, 0xaf, 0xc0, 0x4e, 0x22, 0xa7, 0x5c, 0xea, 0x9d, 0x53, + 0x23, 0x09, 0x63, 0x9d, 0x47, 0x01, 0x10, 0x93, 0xdd, 0x9c, 0x3a, 0xef, + 0x41, 0xd7, 0xe8, 0xee, 0x6d, 0x73, 0xa9, 0x67, 0xa2, 0xe2, 0xa0, 0x15, + 0xbf, 0x93, 0xd9, 0xd7, 0x54, 0xeb, 0xfb, 0xbf, 0xbc, 0xfd, 0x43, 0xaf, + 0x36, 0xdb, 0x65, 0x5f, 0xf0, 0x62, 0x7f, 0xb9, 0xd7, 0xdc, 0xa5, 0x0b, + 0xfb, 0xb2, 0x73, 0xaf, 0x4a, 0x16, 0x75, 0x05, 0x19, 0x2c, 0x4d, 0x44, + 0xb9, 0x85, 0xaf, 0x42, 0xd0, 0xea, 0xc3, 0xd7, 0x61, 0xed, 0xf2, 0x73, + 0x60, 0x27, 0x5f, 0xbb, 0x1b, 0xbb, 0x59, 0xd7, 0xff, 0xd1, 0xed, 0x07, + 0x3c, 0x9d, 0xff, 0x37, 0xf1, 0xd5, 0xd3, 0xfa, 0xf1, 0x55, 0xb8, 0x75, + 0xfe, 0xcc, 0x67, 0xdd, 0xbd, 0xc3, 0xaf, 0xfc, 0x90, 0x3e, 0x1c, 0xf4, + 0x36, 0x75, 0xef, 0x73, 0xf3, 0xad, 0xa3, 0xa8, 0x4d, 0x6f, 0xe3, 0xb7, + 0xff, 0xec, 0x0c, 0x66, 0xff, 0x7c, 0x83, 0xfc, 0xb3, 0x47, 0x5c, 0xb0, + 0x1d, 0x73, 0x89, 0xd5, 0xd3, 0x54, 0xe2, 0xd7, 0xe5, 0xa7, 0x80, 0xe7, + 0x54, 0xea, 0x95, 0x32, 0x13, 0xcd, 0x64, 0x53, 0x08, 0x70, 0xd5, 0xda, + 0x04, 0x87, 0xd0, 0x80, 0xfc, 0x82, 0xfb, 0xbe, 0x49, 0xce, 0xbf, 0xcc, + 0x4d, 0x0e, 0x6d, 0x73, 0xaf, 0xa2, 0x77, 0x91, 0xd7, 0xde, 0xd7, 0x50, + 0xeb, 0xf8, 0x5f, 0xd3, 0xe3, 0x67, 0x51, 0xd4, 0x26, 0xdf, 0xc5, 0xb5, + 0x07, 0xf1, 0x8b, 0x17, 0xec, 0x9c, 0x73, 0x73, 0xab, 0x13, 0x34, 0xdc, + 0x8b, 0x86, 0x5d, 0x84, 0xc8, 0x90, 0x5e, 0x14, 0x6b, 0x3a, 0xf8, 0x3b, + 0x2e, 0xa9, 0xd5, 0x07, 0x85, 0x83, 0xb7, 0xbb, 0x01, 0x3a, 0xee, 0x68, + 0xea, 0x39, 0x0b, 0x6b, 0xfd, 0x03, 0x27, 0x5e, 0x04, 0xeb, 0xef, 0x2d, + 0x7c, 0x3a, 0xff, 0xe0, 0x40, 0xb1, 0xfc, 0x0f, 0xa3, 0x23, 0xaf, 0x49, + 0x3a, 0x75, 0xf7, 0x87, 0x24, 0x75, 0xfb, 0x3f, 0x69, 0xe9, 0xce, 0xbf, + 0xfc, 0x9a, 0xee, 0x04, 0x73, 0x68, 0xe6, 0x8e, 0xa9, 0x26, 0x88, 0xa9, + 0x86, 0xe4, 0x53, 0x22, 0x70, 0x6c, 0x48, 0x3c, 0x57, 0x4d, 0x53, 0x71, + 0xd0, 0xd2, 0x2a, 0x88, 0xca, 0x27, 0x85, 0x3c, 0x8c, 0x43, 0x1a, 0x6e, + 0x4a, 0xaa, 0x56, 0x12, 0x8c, 0x3b, 0xde, 0x1d, 0xe9, 0x19, 0x3c, 0xd0, + 0xbd, 0xe4, 0x38, 0xd6, 0xf7, 0xd9, 0x77, 0xaf, 0x18, 0xd0, 0x21, 0x36, + 0xd3, 0x2e, 0x18, 0xd3, 0x35, 0x29, 0xd7, 0xd1, 0xe0, 0xed, 0x84, 0x8b, + 0x64, 0x1b, 0x26, 0x3f, 0x63, 0x5c, 0xbf, 0xe5, 0x3c, 0x99, 0xb1, 0xaf, + 0xe0, 0xeb, 0xff, 0xfe, 0xfe, 0x14, 0xf6, 0x93, 0xae, 0x9e, 0xce, 0x01, + 0x6f, 0x23, 0xa9, 0x45, 0x4d, 0x73, 0xc7, 0x92, 0x13, 0xcb, 0xf7, 0x18, + 0xee, 0xc3, 0x45, 0x6f, 0x7f, 0xe7, 0x92, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, + 0x38, 0x59, 0x4c, 0x3f, 0xd5, 0x99, 0xdc, 0xd2, 0x09, 0xd6, 0xe9, 0xd6, + 0xd1, 0xd5, 0xf9, 0xa0, 0xd9, 0x10, 0xbe, 0x63, 0xbb, 0x0d, 0x16, 0x8d, + 0xff, 0xec, 0x0f, 0x5d, 0x59, 0xa6, 0x4d, 0x7e, 0xb3, 0xab, 0x87, 0xf5, + 0xd2, 0xdb, 0xe6, 0x38, 0x80, 0xeb, 0xfe, 0x9b, 0x1a, 0xf5, 0xce, 0x3f, + 0x8e, 0xbf, 0xa1, 0xc7, 0xf0, 0xe1, 0xd7, 0xff, 0x0e, 0x6d, 0xd6, 0x77, + 0x07, 0xe8, 0x4e, 0xbf, 0xd9, 0xc0, 0x64, 0xdf, 0x74, 0x75, 0x95, 0x3a, + 0xff, 0xb2, 0x27, 0xc9, 0xb8, 0x9a, 0x3a, 0x90, 0xf2, 0x66, 0x11, 0xbf, + 0xff, 0x4f, 0x1e, 0x80, 0xf2, 0x3a, 0xfa, 0x1c, 0x01, 0xd7, 0xfe, 0x8d, + 0xdd, 0xaf, 0xa2, 0xed, 0x73, 0x9d, 0x7f, 0xe8, 0xe0, 0x31, 0x33, 0x9e, + 0xfc, 0xea, 0x84, 0x6a, 0x75, 0x4f, 0x48, 0x96, 0xc0, 0xa7, 0xd0, 0x88, + 0xb3, 0x3f, 0x6a, 0x1e, 0xd7, 0xfb, 0xbd, 0xfd, 0x55, 0xc6, 0x8e, 0xbf, + 0xff, 0x26, 0x87, 0x36, 0xbf, 0x87, 0x35, 0xd7, 0x98, 0xeb, 0xf4, 0x7b, + 0x5f, 0x7a, 0x75, 0x62, 0x2c, 0xa6, 0x35, 0x15, 0x4b, 0xec, 0x03, 0xf4, + 0xeb, 0xbb, 0xa3, 0xac, 0xa3, 0x41, 0x73, 0x25, 0xab, 0x3a, 0xc8, 0x4f, + 0xb0, 0x8a, 0x62, 0x05, 0x9e, 0x76, 0x50, 0x9f, 0xa1, 0xf5, 0xb2, 0x5f, + 0xf4, 0x82, 0xff, 0xff, 0xdd, 0x80, 0x2d, 0xe5, 0xf3, 0xdd, 0xc5, 0xe3, + 0x23, 0xb0, 0xb3, 0xaf, 0xe4, 0x9f, 0xe3, 0x88, 0x0e, 0xbe, 0x63, 0xbb, + 0x0d, 0x16, 0xd5, 0xff, 0xfd, 0x0f, 0xe8, 0xec, 0x69, 0x12, 0x49, 0xcc, + 0x09, 0xd7, 0xf7, 0x61, 0x70, 0x81, 0x3a, 0x91, 0x34, 0x89, 0x9b, 0x38, + 0x5d, 0xa2, 0xdf, 0x2b, 0x5f, 0xfb, 0xa8, 0x17, 0x90, 0x7a, 0x8b, 0x3a, + 0xff, 0xb3, 0x19, 0xb3, 0xff, 0x53, 0x87, 0x5f, 0x46, 0xdc, 0x43, 0xae, + 0xf0, 0x0e, 0xbf, 0xe8, 0x94, 0x72, 0x78, 0xe4, 0xe7, 0x5f, 0xff, 0xbf, + 0x14, 0xda, 0x9e, 0xec, 0x7b, 0x51, 0xb6, 0x0e, 0xb9, 0xc2, 0x75, 0xff, + 0x47, 0x3e, 0x6a, 0x3a, 0xe8, 0x75, 0xfe, 0xea, 0x3c, 0xbc, 0x93, 0x9d, + 0x7e, 0x0c, 0x60, 0xa1, 0xd5, 0x8a, 0x8b, 0x58, 0x97, 0x31, 0xef, 0x0e, + 0xd6, 0x42, 0x22, 0xda, 0x39, 0xf2, 0xbb, 0x62, 0xbb, 0x27, 0x1f, 0x4c, + 0xaf, 0xe5, 0x5f, 0x81, 0xfc, 0x4e, 0xbf, 0x87, 0x65, 0x39, 0x8a, 0x9d, + 0x7e, 0x49, 0xd7, 0x0c, 0x3a, 0xfc, 0xfb, 0xcb, 0xee, 0x8e, 0xbf, 0xf2, + 0x4d, 0xad, 0xae, 0x33, 0xfe, 0x13, 0xac, 0xa2, 0xa8, 0xf0, 0x12, 0xef, + 0x17, 0xed, 0x27, 0xfa, 0x55, 0x4a, 0x27, 0xc8, 0x08, 0xe3, 0xee, 0x5f, + 0x4e, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x5c, 0xb7, 0xf3, 0x87, 0xb0, 0x33, + 0x9d, 0x65, 0x02, 0x7e, 0xb8, 0x2d, 0xd3, 0x3b, 0xf7, 0x18, 0xee, 0xc3, + 0x45, 0xdb, 0x7f, 0xc9, 0x29, 0x20, 0x82, 0x24, 0x75, 0xf2, 0x71, 0xc0, + 0x75, 0x94, 0xc4, 0x44, 0xb9, 0x9e, 0x8d, 0xaa, 0x1d, 0xf1, 0x9c, 0xe5, + 0x32, 0x9f, 0xba, 0x0c, 0x70, 0xea, 0xd2, 0xcd, 0xd2, 0xbc, 0x4a, 0x6b, + 0x85, 0xbf, 0x67, 0x3c, 0x46, 0x78, 0x37, 0x50, 0xa0, 0xf4, 0x2f, 0xaf, + 0xf2, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x53, 0xdf, 0x85, 0x4e, 0x6b, 0x47, + 0x5d, 0x3a, 0xce, 0xbf, 0x6e, 0xb7, 0x71, 0x3a, 0x82, 0x6f, 0x7f, 0x17, + 0xb7, 0x8e, 0xbf, 0xe8, 0x79, 0xfe, 0x6f, 0xa8, 0x09, 0xd4, 0x87, 0x96, + 0x22, 0x17, 0xcc, 0x77, 0x61, 0xa2, 0xb9, 0xbf, 0xca, 0x67, 0x18, 0xee, + 0xc3, 0x45, 0x9d, 0x79, 0xde, 0x47, 0x5f, 0xc9, 0xac, 0x17, 0x6c, 0xea, + 0xe2, 0x2c, 0x7a, 0x5a, 0x27, 0xfe, 0x1a, 0xbf, 0xfd, 0xe8, 0xd7, 0xcf, + 0xf5, 0xe8, 0x9a, 0x64, 0x3a, 0xfe, 0x45, 0xcf, 0xff, 0x24, 0x75, 0xfc, + 0xeb, 0xc9, 0x9c, 0x07, 0x5f, 0xe8, 0xef, 0xc5, 0xb5, 0x6d, 0x0f, 0x1d, + 0x58, 0x8e, 0x7e, 0xa7, 0x09, 0x7e, 0xd2, 0xcb, 0xf7, 0x33, 0xc8, 0xb3, + 0xaf, 0x9c, 0x60, 0x27, 0x5f, 0xa6, 0x85, 0xc7, 0xd3, 0xae, 0x92, 0xce, + 0xac, 0x37, 0xe2, 0x53, 0x7f, 0xfb, 0xa9, 0xf3, 0xae, 0x9e, 0x8c, 0x0a, + 0x1d, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0x90, 0xaf, 0xfd, 0x8b, 0xc7, 0xe4, + 0xff, 0x37, 0x59, 0xd7, 0xfc, 0x9b, 0xeb, 0xc3, 0x0b, 0xd1, 0xd6, 0x52, + 0x48, 0xf4, 0xc4, 0x8e, 0x99, 0x81, 0x06, 0xe4, 0xe9, 0xd7, 0xfe, 0x7f, + 0xb3, 0x0a, 0x78, 0x60, 0x07, 0x54, 0x91, 0x2d, 0xba, 0x1f, 0x85, 0x6f, + 0xfe, 0xea, 0x2f, 0x35, 0xf3, 0x79, 0x67, 0x8e, 0xbe, 0x97, 0x7e, 0xe8, + 0xea, 0x83, 0xea, 0xc4, 0x6b, 0xe6, 0xaf, 0xb0, 0xb3, 0xaf, 0xee, 0xeb, + 0x59, 0xc9, 0xce, 0xba, 0x1b, 0x3a, 0xb0, 0xf1, 0x10, 0xba, 0xf2, 0xf6, + 0xc8, 0xeb, 0xff, 0xdd, 0x80, 0x2d, 0xe5, 0xaf, 0x66, 0x2c, 0xeb, 0x29, + 0x3a, 0xf3, 0xb0, 0x5b, 0x72, 0x1a, 0x29, 0x19, 0x1f, 0x0f, 0x56, 0x4d, + 0xd5, 0xe7, 0x8e, 0xa4, 0x61, 0x37, 0xa2, 0x0f, 0x35, 0x7e, 0x41, 0xf4, + 0x7a, 0xff, 0xf6, 0x6e, 0xa0, 0x7f, 0x7e, 0x4b, 0xad, 0xb9, 0xd7, 0xff, + 0x29, 0xd7, 0xd0, 0xe7, 0xbd, 0x00, 0x3a, 0xff, 0xf2, 0x8b, 0x79, 0x29, + 0x9c, 0x63, 0xbb, 0x0d, 0x13, 0xe5, 0x31, 0x91, 0xa6, 0x87, 0xed, 0x73, + 0xdb, 0x7c, 0x86, 0x92, 0xd3, 0x7a, 0x87, 0x72, 0x6e, 0x75, 0xff, 0xf4, + 0xa7, 0x68, 0xa1, 0xab, 0x9d, 0x9c, 0xf9, 0xf3, 0xbb, 0x27, 0x54, 0x8f, + 0xe8, 0x02, 0xd7, 0xff, 0x86, 0x7e, 0xc2, 0x7b, 0x48, 0x3b, 0xc8, 0xeb, + 0xfb, 0xfe, 0x01, 0x3b, 0x07, 0x5f, 0xb3, 0x99, 0x93, 0x1d, 0x65, 0x3a, + 0x8b, 0xe7, 0x22, 0xd2, 0x4f, 0xd2, 0xdb, 0xf7, 0x18, 0xee, 0xc3, 0x45, + 0x65, 0x7f, 0xe7, 0x92, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x37, 0x59, 0x4c, + 0x3f, 0xd5, 0x99, 0xd3, 0x11, 0xd4, 0x90, 0xc2, 0xbe, 0x63, 0xbb, 0x0d, + 0x12, 0xb5, 0xff, 0xf7, 0x27, 0x18, 0xe3, 0x84, 0x5f, 0x91, 0xb4, 0xea, + 0xe1, 0xfe, 0x7e, 0x5b, 0x7e, 0x18, 0x0b, 0xf4, 0xeb, 0xfd, 0x08, 0x31, + 0x28, 0xd8, 0x3a, 0xfc, 0xa2, 0xde, 0x4a, 0x61, 0xfd, 0x21, 0x1e, 0x89, + 0x6f, 0xfd, 0xec, 0x53, 0x38, 0x93, 0xba, 0xce, 0xbf, 0xfc, 0xd4, 0x35, + 0x4d, 0x0d, 0x63, 0xc9, 0x33, 0x98, 0x75, 0xff, 0x93, 0x5f, 0xac, 0x53, + 0x6f, 0xee, 0x75, 0xfd, 0x02, 0xec, 0x76, 0xb3, 0xaa, 0x47, 0xda, 0xb4, + 0x0b, 0x83, 0xc3, 0xaf, 0xdc, 0x63, 0xbb, 0x0d, 0x12, 0xe5, 0xff, 0x23, + 0xcb, 0xc3, 0x0b, 0xd1, 0xd7, 0xe9, 0x6c, 0xa7, 0x5c, 0xeb, 0xd1, 0xb3, + 0x07, 0x5e, 0x41, 0x83, 0xaa, 0x47, 0xbe, 0x12, 0x9d, 0xa3, 0xb7, 0xff, + 0xe7, 0xf2, 0x7f, 0x21, 0x49, 0x47, 0x87, 0xf9, 0x1d, 0x7f, 0x4b, 0xb8, + 0x38, 0xc3, 0xaf, 0x4b, 0xbe, 0x3a, 0xee, 0xc2, 0x1e, 0x3f, 0x4a, 0xef, + 0xfe, 0x14, 0x06, 0xb9, 0x09, 0x27, 0xd1, 0xd5, 0x87, 0xda, 0x85, 0x97, + 0xf7, 0x11, 0x62, 0xf2, 0x3a, 0xf3, 0xc9, 0x46, 0xa6, 0xad, 0x1a, 0x21, + 0x85, 0x22, 0x2c, 0x16, 0xe9, 0x9b, 0xc2, 0x57, 0x46, 0x3e, 0x8c, 0x23, + 0xf2, 0x0b, 0xff, 0x7e, 0xb5, 0x35, 0x03, 0xec, 0xe1, 0xd7, 0xfc, 0x1c, + 0x52, 0x38, 0x9d, 0xfc, 0xeb, 0x28, 0x8b, 0x94, 0x4b, 0x97, 0x09, 0xa8, + 0x53, 0x7e, 0x7f, 0x7f, 0xf2, 0x8f, 0x25, 0x33, 0x8c, 0x77, 0x61, 0xa2, + 0x3b, 0xbf, 0xef, 0x77, 0x24, 0xa3, 0x8e, 0x8e, 0xbf, 0x9a, 0x43, 0x0c, + 0xc1, 0x3a, 0xef, 0xfa, 0x75, 0xfc, 0xd0, 0x1c, 0xeb, 0xf8, 0xeb, 0xff, + 0xfb, 0xd2, 0x40, 0xf5, 0x36, 0xfc, 0xc0, 0xf1, 0x3f, 0x61, 0xd7, 0xfb, + 0x1b, 0xd4, 0x0f, 0xb4, 0x75, 0xfc, 0x01, 0xcd, 0xfd, 0x87, 0x5f, 0x9d, + 0x5e, 0xe0, 0x0e, 0xbf, 0x84, 0x0f, 0xc7, 0xfa, 0x75, 0x42, 0x20, 0x38, + 0x58, 0xe4, 0xf7, 0xfe, 0x4e, 0x7c, 0xd0, 0xe2, 0xe1, 0x87, 0x5f, 0xfa, + 0x07, 0xff, 0x23, 0xed, 0x79, 0x1d, 0x7f, 0xe1, 0xfe, 0x5f, 0x31, 0x06, + 0x16, 0x75, 0xf3, 0x1d, 0xd8, 0x68, 0xa8, 0x6f, 0xfb, 0x3b, 0x82, 0xfc, + 0xe2, 0x1d, 0x4a, 0xa6, 0x38, 0xc3, 0xe4, 0x3e, 0xe1, 0xf6, 0x8b, 0x6f, + 0x35, 0xbc, 0x1d, 0x74, 0xb0, 0xeb, 0xfe, 0x97, 0x93, 0x8e, 0xc4, 0x13, + 0xaf, 0xa4, 0x0d, 0x61, 0xd7, 0xff, 0x9d, 0x79, 0xc1, 0xc4, 0xda, 0x9c, + 0x73, 0xaf, 0xfe, 0xe8, 0xe4, 0xde, 0xee, 0x71, 0x34, 0x75, 0xfb, 0x71, + 0x45, 0xa1, 0xd7, 0xe8, 0x69, 0x4f, 0x8d, 0x9d, 0x50, 0x8d, 0xcc, 0x47, + 0x44, 0x3e, 0x13, 0x5f, 0xe8, 0xf3, 0xf7, 0xe0, 0x60, 0xeb, 0xff, 0x67, + 0xb5, 0xcc, 0x9b, 0xa8, 0xa9, 0xd7, 0xfe, 0x1c, 0x57, 0x16, 0x9b, 0x30, + 0xb3, 0xaf, 0xfb, 0xe3, 0x8e, 0x6c, 0x7c, 0xef, 0xe7, 0x52, 0x22, 0xf5, + 0xcf, 0xff, 0x3f, 0xbf, 0xd2, 0x8e, 0x4f, 0x1c, 0x9c, 0xeb, 0xff, 0x6b, + 0x07, 0xda, 0xc9, 0x27, 0x4e, 0xbf, 0xb5, 0x9b, 0x46, 0x37, 0x3a, 0xb4, + 0x7d, 0x5e, 0x3c, 0xbf, 0xfe, 0x80, 0x60, 0xfc, 0x7f, 0x7c, 0xee, 0x01, + 0xce, 0xb8, 0x67, 0x3a, 0xa1, 0x32, 0x6c, 0x84, 0xf2, 0x11, 0x0a, 0x85, + 0xfd, 0xb5, 0xd7, 0xd6, 0xdc, 0xeb, 0xff, 0xfc, 0x91, 0xe7, 0xea, 0x9a, + 0xee, 0x0f, 0xbe, 0x02, 0x5a, 0x3a, 0x91, 0x12, 0x22, 0x5f, 0x7b, 0x5f, + 0xf0, 0xea, 0xc3, 0x7c, 0x84, 0x37, 0xdd, 0xf6, 0x4e, 0x75, 0xfb, 0x27, + 0x71, 0xda, 0x75, 0xff, 0xff, 0xfe, 0x89, 0x7c, 0xf7, 0x52, 0x35, 0xf3, + 0x3f, 0x64, 0x6d, 0xf9, 0x9c, 0xe6, 0x6d, 0xfd, 0xfa, 0x75, 0xf7, 0x45, + 0xf6, 0x0e, 0xac, 0x4c, 0x14, 0x48, 0xb4, 0x51, 0xe8, 0x4c, 0x5f, 0xff, + 0xf7, 0xee, 0xd6, 0x93, 0xf5, 0xd3, 0xd1, 0xd4, 0xf6, 0xb0, 0x27, 0x59, + 0x46, 0x83, 0x27, 0x65, 0xab, 0x2e, 0x69, 0x0b, 0xc1, 0x7c, 0xeb, 0xe1, + 0x85, 0x96, 0x46, 0x94, 0xaa, 0x5b, 0x07, 0x77, 0x15, 0x43, 0x6e, 0x43, + 0xf5, 0x67, 0x5d, 0x87, 0x80, 0xc6, 0xab, 0xa8, 0xc3, 0xbd, 0x19, 0x26, + 0xca, 0x0d, 0xf3, 0x1d, 0xd8, 0x68, 0xaa, 0x2f, 0xf7, 0x23, 0x6e, 0xf2, + 0xcf, 0x1d, 0x5c, 0x3e, 0x2f, 0xcb, 0x6f, 0xfc, 0xf2, 0x53, 0x38, 0xc7, + 0x76, 0x1a, 0x26, 0xbb, 0xe8, 0xe4, 0x78, 0xeb, 0x9f, 0xc7, 0x50, 0x4d, + 0xaa, 0xc8, 0x2c, 0xa6, 0x23, 0x0d, 0x64, 0x6e, 0xff, 0x7e, 0xe3, 0x1d, + 0xd8, 0x68, 0xab, 0x2f, 0xfa, 0x25, 0x1c, 0x9e, 0x39, 0x39, 0xd6, 0x53, + 0x0f, 0xb0, 0x4c, 0xef, 0xfb, 0xb1, 0xbf, 0xa3, 0xae, 0xd6, 0x75, 0xff, + 0xc0, 0xc1, 0x52, 0x40, 0xd4, 0xee, 0x27, 0x52, 0x87, 0xff, 0x07, 0x77, + 0xff, 0x28, 0xf2, 0x53, 0x38, 0xc7, 0x76, 0x1a, 0x24, 0x4b, 0xf7, 0x18, + 0xee, 0xc3, 0x45, 0xa5, 0x7f, 0xe7, 0x92, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, + 0x3e, 0xd9, 0x4c, 0x3f, 0xd5, 0x99, 0xdf, 0xfe, 0x51, 0x6f, 0x25, 0x33, + 0x8c, 0x77, 0x61, 0xa2, 0x84, 0xbf, 0xfb, 0x1b, 0x53, 0xca, 0xbe, 0x93, + 0xd0, 0x75, 0xfb, 0xdf, 0xb1, 0xf4, 0x75, 0xf2, 0x4f, 0x1c, 0x3a, 0x96, + 0x79, 0x3d, 0x28, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x51, 0xf7, 0xfd, 0x12, + 0x8e, 0x4f, 0x1c, 0x9c, 0xeb, 0xff, 0xff, 0xfd, 0xf5, 0x39, 0x34, 0x77, + 0x99, 0xd7, 0xfb, 0xac, 0x55, 0xc4, 0x10, 0x31, 0x37, 0x60, 0xeb, 0xf3, + 0xe9, 0x3d, 0x07, 0x5f, 0xf4, 0x4d, 0x03, 0x13, 0x76, 0x0e, 0xa8, 0x47, + 0x62, 0xb0, 0x90, 0x12, 0x5b, 0xff, 0xfb, 0x03, 0xd8, 0xfa, 0xa7, 0x85, + 0xc1, 0xad, 0x40, 0x0a, 0xbc, 0xf2, 0x52, 0x15, 0x05, 0x61, 0x10, 0x99, + 0xfa, 0x32, 0x5d, 0x93, 0x4b, 0xff, 0xb3, 0xaa, 0x79, 0x57, 0xd2, 0x7a, + 0x0e, 0xb2, 0x93, 0xab, 0x40, 0x5c, 0xa9, 0x8f, 0x32, 0x54, 0x37, 0x06, + 0x73, 0xce, 0x77, 0x49, 0x4f, 0x14, 0x55, 0xa5, 0x08, 0xb2, 0x52, 0xce, + 0xf0, 0xa1, 0x48, 0x53, 0x4c, 0x45, 0xd8, 0x67, 0x00, 0xa3, 0xd2, 0xe5, + 0xef, 0xf2, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x11, 0x5f, 0xd9, 0xc6, 0x3b, + 0xb0, 0xd1, 0x15, 0xdf, 0xf3, 0x5a, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x5c, + 0x52, 0x88, 0x80, 0x73, 0x8b, 0xff, 0xc0, 0x81, 0x62, 0x8f, 0xe0, 0x7d, + 0x19, 0x1d, 0x7c, 0xa4, 0xf3, 0x35, 0x9d, 0x64, 0xdc, 0xfc, 0xc0, 0x97, + 0x7d, 0x9d, 0x7f, 0x1d, 0x7f, 0xb1, 0x38, 0x00, 0x7f, 0xa3, 0xac, 0xd0, + 0x13, 0xd3, 0xd1, 0x05, 0xff, 0xfd, 0xed, 0x27, 0x5d, 0x24, 0x83, 0xef, + 0xfb, 0xcc, 0x3a, 0xfd, 0xc6, 0x3b, 0xb0, 0xd1, 0x4f, 0x5f, 0xe5, 0xa0, + 0x7f, 0x7e, 0x48, 0xeb, 0x96, 0x87, 0x54, 0x1e, 0x43, 0x0c, 0xef, 0xff, + 0xf4, 0xa3, 0xda, 0xfd, 0x6c, 0x40, 0x46, 0x75, 0x3f, 0x61, 0xd7, 0xff, + 0xf7, 0x39, 0xff, 0x39, 0x03, 0x8a, 0xa7, 0x7b, 0x9f, 0x4e, 0xbf, 0xf9, + 0x25, 0x82, 0x08, 0x5a, 0x72, 0x47, 0x5f, 0xe9, 0x47, 0x27, 0x8e, 0x4e, + 0x75, 0xf7, 0xc1, 0x79, 0x1d, 0x7e, 0x7c, 0xea, 0x2c, 0xea, 0xd1, 0xe3, + 0xed, 0x22, 0xa8, 0x44, 0xfe, 0x3d, 0xdf, 0xf9, 0x06, 0x17, 0x12, 0x1c, + 0x59, 0xd7, 0xfd, 0x02, 0xcc, 0xdb, 0x9e, 0xd1, 0xd7, 0xe7, 0x9e, 0x39, + 0xf9, 0xd4, 0xd2, 0x56, 0xf3, 0x05, 0x78, 0xb2, 0xc7, 0xbd, 0xc8, 0x51, + 0x85, 0xd7, 0x46, 0x1c, 0x1a, 0x21, 0xda, 0x75, 0xb2, 0x71, 0x7f, 0xf9, + 0xe4, 0xa0, 0x45, 0xdb, 0xd6, 0xa0, 0x07, 0x5f, 0xfe, 0x00, 0x3f, 0xd2, + 0x9f, 0x45, 0xd6, 0x30, 0x75, 0xff, 0xc3, 0x80, 0x71, 0x02, 0x8b, 0x45, + 0x9d, 0x5c, 0x44, 0x77, 0x93, 0x2f, 0xff, 0xf2, 0x08, 0x07, 0x3d, 0xdc, + 0x53, 0xaf, 0xde, 0xa4, 0xc7, 0x52, 0x89, 0xff, 0x06, 0x14, 0x89, 0x0d, + 0x8d, 0x11, 0xdb, 0x0e, 0xbf, 0x0c, 0x7e, 0xd3, 0xd1, 0xd7, 0xf2, 0xbc, + 0x70, 0xb8, 0x9d, 0x41, 0x3e, 0x6c, 0x0f, 0x72, 0xbb, 0xff, 0x90, 0x3c, + 0x7d, 0xd4, 0xe7, 0x22, 0x73, 0xa9, 0x43, 0xf3, 0xe9, 0x6d, 0xc1, 0x83, + 0xaf, 0xff, 0xdd, 0x8e, 0x64, 0x91, 0xfd, 0x81, 0x4f, 0xd8, 0x55, 0xfa, + 0x24, 0x0f, 0xe4, 0x75, 0xf3, 0x1d, 0xd8, 0x68, 0xac, 0xea, 0x63, 0xd5, + 0xe1, 0x45, 0xf7, 0x91, 0x7a, 0x3a, 0xf2, 0xba, 0x54, 0xeb, 0xfa, 0x75, + 0xc0, 0xcb, 0x47, 0x5f, 0x7b, 0x5f, 0x74, 0x75, 0x9c, 0xea, 0xc3, 0x67, + 0xa2, 0x4b, 0xd1, 0x3a, 0x1d, 0x7e, 0xf0, 0x3e, 0x8c, 0x8e, 0xbf, 0xfe, + 0x85, 0xfb, 0x30, 0x7d, 0xae, 0xe0, 0x1c, 0xeb, 0xdf, 0xbe, 0x8e, 0xbf, + 0xec, 0x92, 0x7e, 0xd6, 0xd5, 0x81, 0x67, 0x59, 0x0e, 0xbf, 0xbb, 0x82, + 0x2f, 0xe3, 0xb4, 0x4f, 0xbf, 0x64, 0xd3, 0xfe, 0x03, 0xaf, 0xef, 0x47, + 0x01, 0x13, 0x1d, 0x65, 0x21, 0x59, 0x50, 0x45, 0x72, 0x15, 0x1b, 0x91, + 0xa1, 0x0f, 0x07, 0x96, 0xc1, 0xd2, 0x07, 0x1b, 0x01, 0x48, 0xa6, 0x68, + 0x73, 0xca, 0x1f, 0x4e, 0x36, 0x0a, 0xaf, 0xfd, 0xd4, 0xf3, 0xf2, 0x78, + 0x40, 0x9d, 0x7f, 0xef, 0x7e, 0xbc, 0x67, 0x37, 0x76, 0xce, 0xbf, 0xdc, + 0x85, 0x70, 0x51, 0x53, 0xaf, 0xff, 0x43, 0x7f, 0x56, 0x39, 0xbf, 0xa3, + 0x1b, 0x3a, 0xfd, 0xe4, 0x1c, 0x59, 0xd7, 0xd2, 0x71, 0x53, 0x13, 0x21, + 0xdc, 0xf7, 0x88, 0x3f, 0x4c, 0xb6, 0x13, 0x2f, 0xfc, 0xf2, 0x53, 0x38, + 0xc7, 0x76, 0x1a, 0x24, 0x5b, 0xff, 0xf7, 0xbb, 0x82, 0xa7, 0x9d, 0xf7, + 0xd2, 0xaa, 0xb9, 0xd7, 0xfe, 0x7f, 0x29, 0x09, 0xc4, 0xf7, 0xe7, 0x52, + 0x88, 0xdf, 0x84, 0xa7, 0x57, 0xbf, 0xb3, 0x8c, 0x77, 0x61, 0xa2, 0xc9, + 0xbf, 0xfd, 0xed, 0x7d, 0xd2, 0x99, 0x3a, 0x0c, 0xb4, 0x75, 0x28, 0x88, + 0x5c, 0x38, 0xbf, 0xba, 0x9c, 0x89, 0x68, 0xeb, 0xf9, 0x7e, 0x4e, 0xba, + 0xce, 0xbf, 0xfc, 0x9e, 0xee, 0x7b, 0x06, 0x3d, 0x01, 0x3a, 0xa0, 0xfc, + 0x9c, 0xb2, 0xff, 0x9d, 0x3d, 0xff, 0x1f, 0x4a, 0x31, 0x17, 0xdd, 0x84, + 0xf5, 0xfd, 0x9c, 0x63, 0xbb, 0x0d, 0x16, 0xc5, 0xff, 0xfc, 0xd0, 0xef, + 0xc1, 0xce, 0x7b, 0x5d, 0x9b, 0xe7, 0xce, 0xec, 0x9d, 0x7b, 0x9f, 0xf4, + 0xeb, 0xbc, 0xa4, 0x22, 0x1f, 0x8d, 0x54, 0xa2, 0x3b, 0x92, 0x17, 0xf7, + 0xb3, 0x58, 0x75, 0xf3, 0x1d, 0xd8, 0x68, 0xb6, 0xef, 0xb5, 0x3b, 0xf0, + 0xea, 0xe1, 0xe7, 0xf8, 0xb6, 0xfe, 0x4e, 0xf9, 0x01, 0xf9, 0xd7, 0xfd, + 0x12, 0x8e, 0x4f, 0x1c, 0x9c, 0xeb, 0x29, 0x24, 0x78, 0xe3, 0x4c, 0xc4, + 0x42, 0x5b, 0x7f, 0xfb, 0x04, 0x0a, 0x2d, 0xc3, 0x98, 0x2a, 0x9d, 0x79, + 0xa5, 0xd0, 0x9d, 0x7a, 0x7e, 0xa1, 0xd7, 0xfe, 0x69, 0x34, 0x9a, 0x3f, + 0xbb, 0x83, 0x00, 0x3a, 0xfe, 0x81, 0x90, 0x7f, 0x59, 0xd7, 0xfd, 0x9c, + 0xe4, 0x49, 0xf7, 0x6c, 0xeb, 0xe6, 0x3b, 0xb0, 0xd1, 0x78, 0x5f, 0xf9, + 0xfd, 0x1b, 0x79, 0xcc, 0xdf, 0x47, 0x57, 0x0f, 0xb4, 0x4b, 0x6f, 0xbd, + 0xb3, 0x9d, 0x3a, 0xfc, 0xb8, 0x19, 0x39, 0xd7, 0xf4, 0x0f, 0xb6, 0xbb, + 0x0e, 0xbf, 0xa5, 0x1b, 0x63, 0x9b, 0x9d, 0x52, 0x3d, 0xcc, 0x2d, 0xbf, + 0xd1, 0xe7, 0xef, 0xc0, 0xc1, 0xd7, 0xfe, 0xfa, 0xbd, 0xe5, 0xec, 0x1f, + 0x68, 0xeb, 0xb1, 0x53, 0xaa, 0x0f, 0x5f, 0x10, 0x6f, 0x92, 0x7c, 0x59, + 0xd7, 0xec, 0x10, 0x6c, 0x41, 0xd7, 0xe8, 0xfb, 0xfb, 0xe8, 0xeb, 0xff, + 0x97, 0x0c, 0xf9, 0x83, 0xfc, 0xb3, 0x47, 0x5f, 0xff, 0xf9, 0xd3, 0xce, + 0xb7, 0x10, 0x33, 0xa9, 0xc9, 0x7d, 0x96, 0x09, 0xd7, 0xf4, 0x6f, 0xbc, + 0x9f, 0x73, 0xab, 0x11, 0xbd, 0xd4, 0x5f, 0xda, 0xaf, 0xfe, 0xce, 0xf5, + 0xe4, 0xb4, 0x8e, 0x48, 0xeb, 0xa0, 0x07, 0x54, 0x8f, 0x5f, 0xc8, 0x54, + 0xd0, 0x5c, 0xe4, 0x69, 0x10, 0x35, 0x31, 0xc9, 0xd2, 0xc2, 0x5b, 0x90, + 0xa6, 0xdc, 0x85, 0x09, 0x26, 0x84, 0x0a, 0xc8, 0x7b, 0x08, 0xa7, 0x20, + 0x01, 0x08, 0x94, 0x6a, 0x30, 0x7f, 0x42, 0x1e, 0xff, 0x6e, 0xa6, 0x01, + 0xf9, 0xa3, 0xaf, 0xf0, 0x14, 0x9a, 0x50, 0x3e, 0x3a, 0x94, 0x4d, 0xae, + 0x23, 0x03, 0xe1, 0xa5, 0xe4, 0xcd, 0xce, 0xbe, 0x63, 0xbb, 0x0d, 0x17, + 0xa5, 0xff, 0x93, 0xdd, 0x17, 0x90, 0x1c, 0x07, 0x57, 0x0f, 0xa5, 0x65, + 0xb7, 0x96, 0x9e, 0x3a, 0xff, 0x9f, 0xd2, 0x85, 0x7c, 0x93, 0x9d, 0x4b, + 0x3d, 0x41, 0x1b, 0xbf, 0x62, 0xfa, 0xe1, 0x3a, 0x82, 0x9a, 0x0e, 0x42, + 0x13, 0xeb, 0xb6, 0xc1, 0x0d, 0xff, 0xfe, 0xdb, 0x82, 0xa0, 0x70, 0x3d, + 0xc5, 0xad, 0xe5, 0x82, 0x75, 0xfe, 0x53, 0xd9, 0x34, 0x9c, 0x27, 0x52, + 0x22, 0x53, 0xac, 0x14, 0xa2, 0x3f, 0x72, 0x1b, 0x75, 0x0d, 0xe3, 0x0c, + 0xf0, 0xbf, 0x94, 0x25, 0xb2, 0x77, 0xc9, 0x91, 0x90, 0xa4, 0xb4, 0xd9, + 0xa3, 0xfc, 0xe4, 0x68, 0xcb, 0x85, 0xa7, 0x61, 0xc2, 0x08, 0xd1, 0x46, + 0x31, 0x9d, 0x21, 0xff, 0x3d, 0x2e, 0xdc, 0xa7, 0x5b, 0xbf, 0xe9, 0xd7, + 0xff, 0x7f, 0x13, 0x0e, 0x6d, 0x75, 0xad, 0x0e, 0xbe, 0xce, 0xbf, 0x8e, + 0xbf, 0xd8, 0x9c, 0x00, 0x3f, 0xd1, 0xd6, 0x68, 0x2a, 0x89, 0x81, 0x45, + 0xd1, 0x05, 0xf7, 0xa3, 0x79, 0xce, 0xbf, 0xef, 0x6b, 0x37, 0x97, 0x7f, + 0x54, 0xea, 0x43, 0xdf, 0x12, 0x3b, 0xe8, 0xdb, 0x12, 0x3a, 0xff, 0x7e, + 0xfc, 0x90, 0xfe, 0xe7, 0x5e, 0x77, 0x61, 0xa2, 0x23, 0xbe, 0x55, 0x8f, + 0xc3, 0xa9, 0x87, 0x92, 0x84, 0xf7, 0xe6, 0x97, 0xb4, 0xe0, 0x3a, 0xb8, + 0x79, 0x8b, 0x21, 0xbf, 0xfe, 0xef, 0xfa, 0xd6, 0x2c, 0x73, 0x6f, 0xc8, + 0x6a, 0x0e, 0xbf, 0xe8, 0x9f, 0x99, 0xef, 0x27, 0x8e, 0xbc, 0x31, 0xb9, + 0xd5, 0x23, 0xd3, 0x09, 0xc5, 0xff, 0x67, 0x33, 0x58, 0xe3, 0x39, 0xd7, + 0xb0, 0x2b, 0x3a, 0xff, 0xff, 0x75, 0xd3, 0xd1, 0xd1, 0xcf, 0x75, 0x3b, + 0x88, 0xd9, 0xd7, 0xff, 0xff, 0xbd, 0xe4, 0x5f, 0x13, 0x37, 0x1f, 0xfd, + 0x1d, 0xf9, 0xb5, 0x3d, 0x34, 0x1d, 0x50, 0x8d, 0x9c, 0x5d, 0xbf, 0xce, + 0xbc, 0xe4, 0xa1, 0x67, 0x5d, 0x3a, 0xca, 0xb9, 0xb6, 0xca, 0xbf, 0xf2, + 0x8c, 0xea, 0x4d, 0xd8, 0x9d, 0x40, 0x1a, 0xf6, 0xc5, 0xef, 0xb6, 0xc7, + 0xa0, 0xea, 0x91, 0xfe, 0x22, 0xd5, 0xfd, 0x8e, 0xbc, 0xdf, 0xc7, 0x5f, + 0xf7, 0xf1, 0xdc, 0x9a, 0x4f, 0x39, 0xd7, 0xf2, 0x9a, 0x4e, 0x38, 0x0e, + 0xac, 0x3e, 0x77, 0x3a, 0xb3, 0x59, 0xd7, 0xfd, 0x19, 0xbc, 0x3c, 0x9e, + 0x47, 0x53, 0x54, 0x79, 0x21, 0x13, 0xbf, 0x0e, 0x75, 0xfc, 0x75, 0xef, + 0x9a, 0x61, 0xd4, 0xd6, 0x78, 0x7d, 0x25, 0xbf, 0xa1, 0x5c, 0x14, 0x54, + 0xeb, 0xfb, 0x3d, 0xb1, 0xec, 0xe9, 0xd5, 0x88, 0x80, 0x12, 0x5d, 0x16, + 0x5f, 0xff, 0xcc, 0x53, 0x8e, 0x29, 0xe5, 0x39, 0x1e, 0x17, 0x01, 0xd4, + 0xd5, 0xaf, 0xfb, 0xb4, 0xa1, 0x5f, 0x10, 0x99, 0x91, 0x00, 0x48, 0xb2, + 0x19, 0x0c, 0x22, 0xde, 0x15, 0x68, 0x45, 0x31, 0xb7, 0x21, 0xe9, 0xd2, + 0x17, 0x86, 0xe0, 0x08, 0x46, 0x12, 0x7a, 0x69, 0xf4, 0x3a, 0xb6, 0x97, + 0x5d, 0xb1, 0xd3, 0xaf, 0xdc, 0x63, 0xbb, 0x0d, 0x11, 0x75, 0xfb, 0xc0, + 0xfa, 0x32, 0x2a, 0xfd, 0xaf, 0x76, 0x00, 0x75, 0xf9, 0xe7, 0x8e, 0x7e, + 0x75, 0x94, 0x9d, 0x18, 0x98, 0x32, 0xe6, 0x7f, 0x94, 0xec, 0x93, 0xd2, + 0x8a, 0x8f, 0xa5, 0x1f, 0x55, 0xff, 0xcb, 0x79, 0x29, 0x9c, 0x63, 0xbb, + 0x0d, 0x13, 0x35, 0xfc, 0xd1, 0x34, 0x76, 0x86, 0xa3, 0xc7, 0x5e, 0xde, + 0x34, 0x75, 0xe6, 0x22, 0xce, 0xbe, 0x69, 0x79, 0xc4, 0xeb, 0xb6, 0x5a, + 0xa3, 0xae, 0xcf, 0xce, 0xbf, 0xfd, 0xd8, 0x5b, 0xfb, 0x37, 0x02, 0xfe, + 0xf4, 0xeb, 0xe4, 0x9f, 0xf1, 0x3a, 0xfd, 0x93, 0xe0, 0x26, 0x3a, 0xbe, + 0x1e, 0x57, 0x88, 0xaf, 0xf7, 0xcc, 0x17, 0xe0, 0x36, 0x4e, 0xbf, 0xff, + 0x2d, 0xfb, 0x9b, 0x83, 0xad, 0xbf, 0x66, 0xef, 0xe7, 0x5f, 0xd9, 0xa8, + 0xfa, 0x30, 0x75, 0x05, 0x17, 0x78, 0x6d, 0xd5, 0x9b, 0xb5, 0x87, 0x5d, + 0xb1, 0xe3, 0xac, 0xd3, 0x3a, 0xc0, 0x83, 0x5b, 0xf8, 0xcd, 0xff, 0xff, + 0x90, 0x61, 0x83, 0x0b, 0xf9, 0x1c, 0xe2, 0x6d, 0xe3, 0xb8, 0x0e, 0xa6, + 0xa9, 0x55, 0x63, 0x07, 0x90, 0x5a, 0x68, 0x4b, 0x76, 0x1b, 0xee, 0x5e, + 0x04, 0x2f, 0x13, 0xdf, 0xcd, 0xc0, 0x8e, 0x78, 0xeb, 0xe7, 0xea, 0x4c, + 0x75, 0xf7, 0x66, 0x80, 0x9d, 0x58, 0x7d, 0xcc, 0x2b, 0x72, 0x1b, 0xfc, + 0xc4, 0xc1, 0x0f, 0x60, 0xea, 0x3a, 0xf9, 0xfd, 0x20, 0x1d, 0x7f, 0xda, + 0x46, 0x3e, 0x73, 0x3c, 0x75, 0xfe, 0x7e, 0x24, 0x35, 0xa2, 0xce, 0xae, + 0xa2, 0x2b, 0xc4, 0x3b, 0x4d, 0xaf, 0xff, 0x7c, 0xeb, 0xa7, 0x81, 0xf8, + 0x8b, 0xc8, 0xeb, 0xcd, 0x4d, 0xaa, 0x68, 0x1d, 0x58, 0x9b, 0x5b, 0x0c, + 0x12, 0x12, 0x8b, 0x32, 0x14, 0xab, 0xff, 0xff, 0xff, 0xff, 0xcd, 0x4d, + 0xa1, 0x8d, 0x4d, 0xa4, 0xd1, 0xda, 0x3b, 0x1a, 0x70, 0xd1, 0x9a, 0x5c, + 0x9f, 0x63, 0x3f, 0x0b, 0x52, 0x8d, 0x9d, 0xfe, 0xf5, 0xa5, 0x10, 0xd2, + 0x6b, 0x68, 0xbd, 0xf3, 0xe7, 0x76, 0x4e, 0xbf, 0xff, 0x03, 0x79, 0x77, + 0xf8, 0xe2, 0x9d, 0x46, 0x3f, 0x0e, 0xbf, 0xfb, 0x76, 0xe3, 0xc1, 0x46, + 0xbd, 0x42, 0xce, 0xbe, 0x41, 0xf6, 0x8e, 0xbf, 0xff, 0xe5, 0xa7, 0x3b, + 0xfe, 0xa5, 0x1b, 0x79, 0x03, 0xee, 0xe4, 0x8e, 0xa9, 0x22, 0x21, 0x08, + 0x2f, 0xfc, 0x9e, 0x46, 0x20, 0x7d, 0x8c, 0x3a, 0xb1, 0x32, 0xef, 0x43, + 0x43, 0x60, 0x8a, 0xfb, 0xdb, 0x39, 0xd3, 0xaf, 0xff, 0xf3, 0x8b, 0x07, + 0x03, 0xdf, 0xfe, 0x76, 0x25, 0xc8, 0x9c, 0xea, 0xc4, 0x43, 0x7e, 0x49, + 0x7f, 0xff, 0x9d, 0x51, 0xc0, 0x7f, 0xaf, 0x92, 0x4e, 0xc3, 0x05, 0xce, + 0xbe, 0xf2, 0x75, 0x0e, 0xbf, 0xe7, 0xe4, 0xbe, 0x63, 0x03, 0x87, 0x53, + 0x49, 0x71, 0x36, 0x23, 0x2c, 0xc8, 0xe1, 0xbb, 0x0b, 0xe7, 0x23, 0x16, + 0x1f, 0xc8, 0x2d, 0xc3, 0xaf, 0xef, 0x62, 0xf7, 0xc5, 0x9d, 0x6e, 0xe1, + 0xbd, 0x41, 0x0b, 0xfd, 0xf8, 0x5e, 0x5a, 0x49, 0x1d, 0x7e, 0x67, 0xe3, + 0xed, 0x1d, 0x7f, 0xe1, 0x86, 0x2a, 0xf9, 0xc4, 0x01, 0xd7, 0xf6, 0xb1, + 0x39, 0xc7, 0x3a, 0xa7, 0x3e, 0x70, 0x1e, 0x5f, 0xff, 0x20, 0xcf, 0x9a, + 0x47, 0xea, 0x8d, 0xb6, 0xd9, 0x55, 0x07, 0xea, 0x12, 0x3b, 0xfb, 0x7c, + 0xef, 0xfb, 0x80, 0xeb, 0xf7, 0x62, 0x7e, 0xfe, 0x75, 0x61, 0xec, 0xf8, + 0xc2, 0xff, 0x87, 0x21, 0x57, 0xf3, 0xaa, 0x75, 0xfd, 0xbc, 0xb4, 0x0f, + 0xe6, 0x3a, 0xff, 0xa7, 0xc0, 0x07, 0xf7, 0xe4, 0x8e, 0xbf, 0x9d, 0xc3, + 0xb7, 0x02, 0x75, 0xe7, 0x76, 0x1a, 0x2c, 0xfb, 0xf8, 0x0e, 0x32, 0x45, + 0x9d, 0x53, 0xa2, 0xe4, 0x27, 0x4c, 0x2d, 0x01, 0x3d, 0xfe, 0xef, 0xb4, + 0xfb, 0xfd, 0x59, 0xd7, 0xfd, 0xd8, 0x92, 0x7a, 0x3d, 0xa3, 0xaa, 0x0f, + 0xb5, 0x0d, 0xaf, 0xff, 0x73, 0xaf, 0xf3, 0x36, 0x8e, 0x6b, 0x04, 0xeb, + 0xfe, 0x84, 0x0e, 0x2d, 0xbc, 0xe9, 0xd7, 0xff, 0x6b, 0xc9, 0x33, 0x6e, + 0x18, 0xdf, 0x47, 0x52, 0x23, 0x1d, 0xd2, 0xbf, 0x37, 0xbc, 0xdb, 0x6d, + 0x95, 0x7f, 0xe7, 0x96, 0x87, 0x18, 0x1c, 0xe1, 0x4a, 0x17, 0xf7, 0xed, + 0x8f, 0xd7, 0x81, 0x3a, 0xff, 0x7b, 0xb9, 0xb7, 0xe4, 0x96, 0x75, 0x61, + 0xf1, 0x7e, 0x57, 0x7f, 0xed, 0xe4, 0x3f, 0x83, 0xe3, 0x16, 0x03, 0xae, + 0x85, 0x4e, 0xbf, 0xe0, 0xc0, 0xc0, 0x25, 0xd4, 0x3a, 0xa1, 0x11, 0xf3, + 0xa1, 0xa0, 0xb5, 0xfe, 0xea, 0x04, 0x5d, 0xe6, 0x3a, 0xff, 0x07, 0xbf, + 0xb8, 0x36, 0x70, 0xea, 0x83, 0xe7, 0x43, 0x1b, 0xfd, 0x1f, 0x3d, 0x9a, + 0xd4, 0x1d, 0x7f, 0x07, 0xe8, 0x7f, 0xf6, 0x8e, 0xb2, 0x70, 0xf9, 0x04, + 0xce, 0xf4, 0x0a, 0xa7, 0x54, 0x97, 0xec, 0x82, 0x4b, 0x86, 0x6c, 0x8c, + 0x13, 0x77, 0xa4, 0x21, 0x98, 0xdf, 0x90, 0xea, 0x5c, 0x2a, 0xfb, 0x0e, + 0x70, 0x27, 0x0c, 0x2b, 0xb5, 0x0b, 0x1f, 0x42, 0x5b, 0x6c, 0x21, 0x3e, + 0x93, 0x5c, 0x0d, 0x1d, 0x7f, 0xdf, 0xfb, 0x43, 0x93, 0x42, 0xce, 0xbe, + 0x03, 0xb7, 0xe3, 0xaf, 0xf3, 0xb7, 0xd4, 0x8e, 0x41, 0xd4, 0x14, 0x51, + 0x2a, 0x2c, 0x87, 0x3c, 0x22, 0xbf, 0xf7, 0x13, 0x52, 0xfb, 0xd8, 0x18, + 0x3a, 0xfb, 0x89, 0x0b, 0x3a, 0xff, 0xfd, 0xe5, 0x7f, 0x8c, 0x0f, 0x73, + 0x5b, 0xca, 0x3a, 0x75, 0x71, 0x16, 0xab, 0x3e, 0x12, 0x0b, 0x9e, 0x47, + 0x5f, 0xff, 0xff, 0xc2, 0xed, 0xfb, 0x3a, 0x39, 0xef, 0xc0, 0xb7, 0x93, + 0x86, 0x05, 0xf8, 0xf2, 0x3a, 0xff, 0x67, 0x7b, 0xff, 0x9c, 0x4e, 0xbf, + 0xe6, 0x67, 0x58, 0xfc, 0x79, 0x1d, 0x79, 0x26, 0xd1, 0xd5, 0x07, 0xa6, + 0xb3, 0x7b, 0x20, 0x53, 0x40, 0x98, 0x57, 0x90, 0x85, 0x5c, 0x21, 0x6f, + 0xef, 0x89, 0xd7, 0x5a, 0x1d, 0x7b, 0x6e, 0x04, 0xeb, 0x72, 0x73, 0xca, + 0x98, 0xb6, 0xff, 0xd8, 0xde, 0xc7, 0x33, 0x60, 0x7f, 0x6c, 0xea, 0x85, + 0x4e, 0xfd, 0x8d, 0xbd, 0xe1, 0x30, 0x25, 0x57, 0xff, 0xff, 0xc0, 0xd6, + 0x60, 0xab, 0xf7, 0x83, 0x19, 0xd5, 0x34, 0x39, 0x3a, 0xf1, 0x67, 0x5f, + 0xbe, 0xc0, 0xfd, 0x59, 0xd5, 0x88, 0xa8, 0xf3, 0xf5, 0xfb, 0x6b, 0xf6, + 0x3e, 0x9d, 0x7f, 0xfd, 0xfe, 0xf2, 0xd0, 0x7b, 0x1c, 0x0b, 0xbb, 0x67, + 0x56, 0x22, 0x79, 0x08, 0x84, 0xaa, 0xf6, 0xa2, 0x73, 0xaf, 0xfa, 0x31, + 0x9d, 0x4d, 0xaf, 0xc3, 0xae, 0xce, 0x9d, 0x42, 0x79, 0xbb, 0x27, 0x15, + 0x24, 0x5d, 0x68, 0xb7, 0xcd, 0x37, 0xbb, 0xfb, 0x67, 0x5e, 0x07, 0xec, + 0x3a, 0xf7, 0xb3, 0xe9, 0xd7, 0xf4, 0x6f, 0xaf, 0x9c, 0x83, 0xaf, 0x07, + 0xf6, 0x1d, 0x7c, 0x11, 0x89, 0x1d, 0x48, 0x6f, 0x5c, 0x76, 0x82, 0x8e, + 0x3d, 0xc7, 0x90, 0x75, 0x63, 0xbd, 0x6c, 0xbf, 0xc9, 0x33, 0x8a, 0x6f, + 0xa3, 0xae, 0xc6, 0x1d, 0x7f, 0x71, 0x36, 0xe0, 0xe8, 0xeb, 0xfb, 0x7f, + 0x67, 0x7f, 0x6b, 0x3a, 0xfe, 0xe6, 0x77, 0xbf, 0xf8, 0xeb, 0xf7, 0x46, + 0x33, 0x86, 0x5f, 0xd9, 0xc9, 0xff, 0x70, 0x9a, 0x20, 0xd5, 0x0d, 0x2d, + 0xb9, 0x3a, 0x27, 0xe4, 0xa7, 0x7c, 0x3d, 0xcd, 0xce, 0xa8, 0x4c, 0x71, + 0x21, 0xa2, 0xe5, 0x57, 0xe7, 0x62, 0x2e, 0x0e, 0xbf, 0xa5, 0xd1, 0x7d, + 0xfc, 0x75, 0x30, 0xf4, 0x84, 0x96, 0xfb, 0xe8, 0xbc, 0xe7, 0x56, 0x1e, + 0x26, 0x88, 0x6f, 0xd1, 0xef, 0x8b, 0x6c, 0xeb, 0xfd, 0x24, 0x5c, 0x77, + 0xe8, 0x4e, 0xbf, 0xfd, 0x18, 0x3b, 0xfb, 0x38, 0x93, 0xba, 0xce, 0xbf, + 0x3b, 0x7e, 0xce, 0xe8, 0xff, 0x3c, 0x69, 0x5f, 0x15, 0xaf, 0xb5, 0x66, + 0x50, 0x2b, 0x28, 0xd2, 0x72, 0x19, 0x3c, 0x21, 0x18, 0x53, 0x5e, 0xd6, + 0x48, 0xeb, 0xf2, 0x03, 0xb0, 0x13, 0xaf, 0xc9, 0xbc, 0x90, 0x4e, 0xbc, + 0x9d, 0xc3, 0xae, 0x85, 0xe1, 0xe0, 0x30, 0x9a, 0xfe, 0x6f, 0x17, 0x1c, + 0x54, 0xeb, 0xe0, 0xeb, 0xb0, 0x75, 0xf8, 0x78, 0xdb, 0xce, 0x75, 0x41, + 0xfb, 0xe1, 0x73, 0x90, 0xdd, 0xf8, 0x9d, 0x50, 0x9b, 0x36, 0x0d, 0xa3, + 0x37, 0x21, 0x47, 0xa2, 0xcb, 0xdd, 0xc1, 0x3a, 0xf3, 0xfa, 0x0e, 0xbf, + 0xd3, 0x44, 0xeb, 0x79, 0xa0, 0xeb, 0xff, 0xe7, 0x57, 0xd1, 0xc0, 0x72, + 0x3c, 0x2e, 0x03, 0xaf, 0xe1, 0xc0, 0x60, 0xc8, 0xeb, 0xff, 0xe5, 0x7e, + 0x7d, 0x17, 0xf6, 0x93, 0x7e, 0xa3, 0x67, 0x58, 0x70, 0xff, 0xdc, 0xaa, + 0xb1, 0x35, 0xae, 0x0d, 0x38, 0xd0, 0x9a, 0x7f, 0x0c, 0xdb, 0xb5, 0xb4, + 0xeb, 0xe4, 0x17, 0x09, 0xd7, 0xfe, 0x5e, 0x7b, 0x5f, 0x74, 0xf2, 0xc3, + 0xaf, 0xda, 0x8e, 0x7a, 0x0e, 0x50, 0xdf, 0xd0, 0x51, 0x2b, 0xa5, 0xeb, + 0xf7, 0xd9, 0x9d, 0xf8, 0x75, 0xf7, 0x71, 0x36, 0x9d, 0x7f, 0x69, 0x39, + 0x9f, 0xf0, 0xeb, 0xff, 0xfd, 0x13, 0x7c, 0x46, 0x7f, 0xcd, 0x7f, 0xf1, + 0x69, 0xee, 0xa1, 0xd5, 0x89, 0xd7, 0xa4, 0x2b, 0x56, 0x47, 0xd2, 0x9f, + 0x11, 0x6c, 0x16, 0xdc, 0xb6, 0x81, 0xa2, 0xfc, 0xbe, 0xd7, 0x33, 0x0e, + 0xbf, 0xfa, 0x5e, 0xfe, 0x52, 0x5f, 0xbd, 0x0b, 0x3a, 0xff, 0x7b, 0x51, + 0x3e, 0x68, 0x27, 0x5d, 0xdc, 0x3a, 0xff, 0xfb, 0xb0, 0x1c, 0x67, 0xcc, + 0x1c, 0x0f, 0x60, 0xeb, 0xff, 0x93, 0x07, 0x33, 0x5f, 0x25, 0xa5, 0x9d, + 0x7f, 0xe7, 0x8d, 0xe5, 0xf3, 0x5b, 0x86, 0x0e, 0xa0, 0xa7, 0x01, 0xb9, + 0x02, 0x23, 0x35, 0x99, 0xcc, 0x2b, 0xa4, 0xef, 0x21, 0xde, 0x56, 0x38, + 0x75, 0xfc, 0x18, 0x07, 0x33, 0x73, 0xa9, 0x43, 0xc9, 0x58, 0xe5, 0xfe, + 0x85, 0xe2, 0x72, 0x69, 0x1d, 0x72, 0x4c, 0x75, 0xfe, 0xe4, 0x2a, 0x11, + 0x8d, 0xce, 0xbf, 0xfd, 0xe8, 0xe8, 0xbc, 0xf1, 0xce, 0x3c, 0x8e, 0xbd, + 0xe4, 0x9c, 0xeb, 0xf0, 0x1f, 0x78, 0x98, 0xeb, 0xc3, 0x0c, 0x3a, 0xff, + 0xe0, 0xa4, 0xdd, 0x8e, 0x6f, 0x28, 0xe1, 0xd7, 0xff, 0x90, 0x5f, 0x7d, + 0x6b, 0x38, 0x1e, 0xe1, 0xd5, 0xf1, 0x37, 0xc9, 0x0b, 0x21, 0x9a, 0xd2, + 0x1c, 0x70, 0x4a, 0x34, 0x35, 0xb0, 0x8b, 0x68, 0x3a, 0xf7, 0x53, 0xc7, + 0x5b, 0x6e, 0x1a, 0xaf, 0xa1, 0xf5, 0x0b, 0xaa, 0x01, 0x5e, 0xc8, 0xe9, + 0xd2, 0x16, 0x5d, 0x23, 0x78, 0xeb, 0x81, 0x09, 0xeb, 0xcb, 0x7f, 0xa7, + 0x5f, 0xf6, 0x0c, 0x87, 0x17, 0x0c, 0x3a, 0xfd, 0xd4, 0xdb, 0x81, 0x3a, + 0xff, 0xc1, 0x81, 0xc1, 0xfe, 0x59, 0xa3, 0xaf, 0xce, 0xb4, 0xd8, 0xc3, + 0xaf, 0x7a, 0x37, 0x3a, 0xb0, 0xf1, 0x1c, 0xa2, 0xf4, 0x24, 0xc7, 0x5e, + 0x16, 0xab, 0x60, 0xeb, 0xf6, 0x4e, 0xb8, 0xd1, 0xd7, 0xff, 0xfe, 0x8e, + 0xa2, 0xd4, 0x9a, 0x4f, 0xcf, 0xbd, 0x4d, 0xf4, 0xc4, 0x9c, 0xea, 0x9d, + 0x3f, 0x00, 0x8e, 0xaa, 0x6a, 0x85, 0x13, 0x42, 0x03, 0xa4, 0x02, 0x37, + 0xa2, 0x3d, 0x82, 0x7b, 0xef, 0x8f, 0x26, 0xa0, 0xeb, 0xff, 0xb3, 0x6e, + 0x07, 0x07, 0xf9, 0x66, 0x8e, 0xbf, 0x72, 0x3b, 0xf4, 0x27, 0x57, 0x0f, + 0xb5, 0xd1, 0x2f, 0xa1, 0x27, 0x83, 0xaf, 0x9b, 0x7c, 0xd1, 0xd7, 0xf0, + 0x60, 0x03, 0x9b, 0x9d, 0x7f, 0xd2, 0x5b, 0xcb, 0xda, 0x85, 0x4e, 0xa8, + 0x44, 0x36, 0x10, 0xb9, 0x65, 0xed, 0x20, 0x9d, 0x7e, 0x16, 0x7c, 0xd6, + 0xe7, 0x56, 0x1e, 0x23, 0x8d, 0x53, 0x5a, 0x7d, 0xaf, 0x09, 0x50, 0x10, + 0x8c, 0x29, 0xbf, 0x71, 0xba, 0x79, 0x1d, 0x79, 0x3a, 0x87, 0x56, 0xe6, + 0xc7, 0xc2, 0xf7, 0xdf, 0x7f, 0x7d, 0x1d, 0x7f, 0xc8, 0xac, 0x06, 0x36, + 0xe7, 0x4e, 0xbf, 0xee, 0xa3, 0x7b, 0xcb, 0x58, 0xc3, 0xaf, 0xef, 0xf5, + 0x13, 0x7f, 0xc3, 0xaf, 0x7f, 0x9b, 0x9d, 0x5d, 0x3c, 0xdf, 0x18, 0x5f, + 0xe9, 0x7e, 0x33, 0xe9, 0x37, 0x3a, 0xf8, 0x00, 0xcd, 0xce, 0xbf, 0xb6, + 0x3d, 0x8e, 0x2c, 0x3a, 0xff, 0xbf, 0x79, 0x07, 0x30, 0x1a, 0x3a, 0xff, + 0x01, 0x37, 0xde, 0x59, 0xe3, 0xab, 0xa7, 0xd9, 0xa3, 0x8b, 0xf6, 0xfa, + 0x5a, 0x35, 0x9d, 0x7f, 0xfe, 0xcd, 0x7c, 0xeb, 0xa7, 0x81, 0xf8, 0x8b, + 0xc8, 0xea, 0x84, 0x40, 0x09, 0x5d, 0xfc, 0xf3, 0x81, 0xc4, 0x27, 0x54, + 0xea, 0xb0, 0x82, 0x72, 0xc8, 0x43, 0xcc, 0x45, 0xc3, 0x5e, 0x91, 0x7a, + 0x13, 0x5b, 0x61, 0x45, 0xb2, 0x43, 0x7f, 0xbe, 0xc3, 0x36, 0x73, 0x90, + 0x75, 0xff, 0x07, 0x3f, 0xe4, 0xec, 0x49, 0xce, 0xbf, 0xa3, 0xa9, 0xc8, + 0x59, 0xd5, 0xd4, 0x4e, 0x39, 0xb7, 0x8e, 0xea, 0x17, 0x11, 0xf2, 0x57, + 0x33, 0xc6, 0x65, 0x74, 0xdf, 0x9d, 0x65, 0x9d, 0x5b, 0x9a, 0x86, 0x98, + 0xc5, 0xff, 0xd1, 0xcc, 0xda, 0xf2, 0x06, 0x60, 0x4e, 0xbf, 0x9f, 0x79, + 0x0c, 0x04, 0xeb, 0xfe, 0x8d, 0xe4, 0x82, 0xb7, 0xf1, 0xd4, 0xe7, 0xc6, + 0x25, 0x97, 0xe7, 0x96, 0x4f, 0x07, 0x5f, 0xfd, 0x1a, 0xd6, 0x2f, 0xc3, + 0x0b, 0xd1, 0xd7, 0xff, 0x24, 0x68, 0x5e, 0x5f, 0x35, 0x9c, 0x3a, 0xff, + 0xff, 0x26, 0xa7, 0xc6, 0xf0, 0x7f, 0xd8, 0x85, 0x30, 0x5f, 0x87, 0x5f, + 0xed, 0xe5, 0xa9, 0xa5, 0x13, 0x9d, 0x41, 0x4d, 0x11, 0x84, 0xc2, 0x85, + 0xe4, 0x3f, 0xd8, 0xef, 0xff, 0xfd, 0xd4, 0xdf, 0xd9, 0xbf, 0xb9, 0xc8, + 0xf0, 0x3e, 0x8c, 0xbb, 0x87, 0x5e, 0x0b, 0x89, 0xd7, 0xb9, 0x1b, 0x4e, + 0xbb, 0xfe, 0x1d, 0x41, 0x3c, 0xee, 0x0d, 0x68, 0x76, 0xff, 0xd2, 0x81, + 0xf7, 0x13, 0x6e, 0x04, 0xeb, 0xff, 0x3f, 0xb5, 0xfc, 0xbe, 0x85, 0x3c, + 0x75, 0xff, 0x9f, 0xac, 0x47, 0xf9, 0xa7, 0xe9, 0xd7, 0xf7, 0x5c, 0x77, + 0x92, 0x1d, 0x7f, 0xfe, 0xd0, 0xfc, 0xeb, 0xa7, 0x81, 0xf8, 0x8b, 0xc8, + 0xeb, 0xfd, 0xd4, 0x57, 0x67, 0xfe, 0x2a, 0x75, 0xff, 0x43, 0x6b, 0xec, + 0x20, 0xce, 0x75, 0xff, 0xf0, 0xe6, 0xb1, 0x70, 0xcc, 0xf2, 0x73, 0x0e, + 0xb6, 0x31, 0x17, 0x9e, 0x39, 0xda, 0x71, 0x7f, 0x4f, 0x9c, 0x46, 0x41, + 0xd7, 0xc2, 0x18, 0x59, 0xd7, 0xff, 0xdf, 0x8f, 0xb5, 0xd4, 0x98, 0x61, + 0x6f, 0x23, 0xaf, 0xb0, 0x7f, 0x73, 0xa9, 0x67, 0xdf, 0xb5, 0x3e, 0xfe, + 0x70, 0x60, 0x5e, 0x47, 0x54, 0x23, 0x7b, 0x21, 0x1e, 0x84, 0x94, 0x89, + 0x9e, 0x76, 0x30, 0xaa, 0x85, 0xef, 0xd9, 0xc9, 0x83, 0x0a, 0x6c, 0x8d, + 0x91, 0x89, 0x69, 0x0b, 0xd9, 0x8b, 0xd6, 0x7d, 0xd4, 0x17, 0x3e, 0x01, + 0x60, 0xc6, 0x23, 0xe8, 0xdc, 0xef, 0xfe, 0xc1, 0x06, 0x67, 0x35, 0xe8, + 0xc3, 0xaf, 0xfb, 0x7f, 0x67, 0x12, 0x77, 0x59, 0xd6, 0xc0, 0x1f, 0xc8, + 0xa0, 0x5e, 0x69, 0xc9, 0x0e, 0xbe, 0x81, 0x79, 0x1d, 0x7e, 0xc6, 0xb7, + 0x10, 0x7c, 0x37, 0xdc, 0x1f, 0xbf, 0xb6, 0xf5, 0x23, 0x9a, 0x3a, 0xff, + 0xdd, 0x45, 0x87, 0x26, 0x8c, 0xe1, 0xd7, 0xa5, 0x1b, 0x9d, 0x7d, 0x00, + 0x75, 0x9d, 0x70, 0xcb, 0x0f, 0xe6, 0x63, 0xd1, 0x1c, 0xbe, 0xd2, 0x7a, + 0x0e, 0xa8, 0x3d, 0x97, 0x39, 0xbe, 0x67, 0x52, 0x63, 0xaf, 0xff, 0xc3, + 0x8a, 0xaa, 0x81, 0xea, 0x4d, 0xd4, 0xdf, 0xc7, 0x54, 0x1f, 0xce, 0x11, + 0x5e, 0x63, 0xf0, 0xeb, 0xf6, 0x99, 0x1c, 0x54, 0xea, 0xe9, 0xe1, 0x80, + 0x6e, 0xfe, 0x96, 0x20, 0x7a, 0x87, 0x5e, 0x7e, 0x2a, 0x75, 0x61, 0xe3, + 0xb9, 0x5d, 0xff, 0xd9, 0xbf, 0xb4, 0x83, 0x00, 0x75, 0x9d, 0x7a, 0x4b, + 0xe9, 0xd5, 0x39, 0xef, 0x79, 0x0a, 0xf9, 0x15, 0x46, 0xce, 0xac, 0x3c, + 0x51, 0x23, 0xbb, 0xe6, 0x1d, 0x7d, 0xa1, 0x85, 0x9d, 0x50, 0x6d, 0xf7, + 0x17, 0xbd, 0xd9, 0x2c, 0xeb, 0xba, 0x87, 0x56, 0x1b, 0x1f, 0x0e, 0x54, + 0x2e, 0x4b, 0x49, 0x93, 0x10, 0x55, 0x8c, 0x03, 0xb0, 0x99, 0x76, 0x31, + 0x69, 0xd4, 0x30, 0xff, 0x57, 0xd9, 0x52, 0xbc, 0x15, 0xb0, 0xeb, 0x74, + 0xeb, 0x00, 0xeb, 0xb5, 0x23, 0xa8, 0x06, 0xdb, 0x42, 0x1f, 0x88, 0x5f, + 0xd3, 0xcd, 0x26, 0x97, 0x27, 0x3a, 0xf3, 0xe7, 0x0e, 0xbc, 0x39, 0xe3, + 0xab, 0xa6, 0xd0, 0x46, 0xae, 0xf0, 0x9d, 0x7a, 0x37, 0xd1, 0xd7, 0xc8, + 0x32, 0xc3, 0xaf, 0x4e, 0xe2, 0x75, 0x04, 0xf5, 0x96, 0x39, 0xe1, 0xfb, + 0xf6, 0x7b, 0xa9, 0xe3, 0xaf, 0xcf, 0xbe, 0x6f, 0xe3, 0xac, 0xaf, 0x4f, + 0x3b, 0xc4, 0xd7, 0x27, 0x0e, 0xbf, 0xa7, 0xf9, 0x3b, 0xbf, 0x4e, 0xa6, + 0xa9, 0x3d, 0xf8, 0x69, 0x91, 0x06, 0x35, 0xa3, 0xef, 0x4a, 0x5c, 0x56, + 0xff, 0xb0, 0x21, 0x4d, 0xf3, 0x7f, 0x1d, 0x7c, 0xc1, 0x89, 0x1d, 0x5d, + 0x3d, 0x97, 0x39, 0xbf, 0xd1, 0x9e, 0x8e, 0xb8, 0x4e, 0xa9, 0xcf, 0x44, + 0x24, 0x37, 0xff, 0x06, 0x03, 0xc8, 0xf2, 0x31, 0x02, 0x75, 0xf4, 0xd1, + 0xb1, 0x23, 0xaf, 0xef, 0x30, 0x21, 0x5f, 0x0e, 0xbf, 0xe9, 0xb5, 0xb5, + 0xc6, 0x7f, 0xc2, 0x75, 0xf6, 0x7b, 0x16, 0x75, 0xc2, 0xa9, 0xd6, 0xd3, + 0x9b, 0x6f, 0xc8, 0x2f, 0xee, 0xff, 0x3c, 0xdd, 0x43, 0xaf, 0x84, 0x73, + 0xc7, 0x54, 0x27, 0x42, 0x12, 0x3c, 0x42, 0x54, 0x95, 0x0b, 0xa6, 0x73, + 0xe9, 0x3f, 0x8c, 0x2f, 0xef, 0x93, 0x47, 0x87, 0x69, 0xd7, 0xff, 0x86, + 0x36, 0xf2, 0x39, 0x89, 0xd8, 0x09, 0xd7, 0x85, 0xd6, 0x75, 0x49, 0x12, + 0x78, 0x62, 0x89, 0x16, 0x51, 0xaa, 0x7c, 0x7a, 0x66, 0xac, 0xf1, 0xa3, + 0x8e, 0x35, 0x21, 0xb8, 0x95, 0xa1, 0x3c, 0x3b, 0xe5, 0x1c, 0xc0, 0x67, + 0x26, 0xb2, 0x90, 0xd0, 0xac, 0x75, 0x4c, 0x96, 0xd3, 0xbc, 0xa4, 0x74, + 0x8c, 0x4e, 0x69, 0x75, 0x3c, 0x8f, 0x81, 0x71, 0xd3, 0xf6, 0x7d, 0x35, + 0xe5, 0x34, 0x82, 0x53, 0xab, 0x4e, 0x11, 0x03, 0x38, 0xd3, 0xa9, 0xf6, + 0x2f, 0x4e, 0xee, 0xff, 0x09, 0xf6, 0xd4, 0xb6, 0x65, 0x07, 0x7d, 0x95, + 0x63, 0xb1, 0x18, 0x25, 0x28, 0xf9, 0x47, 0x1d, 0xbc, 0x7f, 0x6b, 0xff, + 0xca, 0x2d, 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x4d, 0x97, 0xf9, 0x4c, + 0xe3, 0x1d, 0xd8, 0x68, 0xab, 0x6f, 0xf4, 0xa5, 0xff, 0x86, 0x24, 0x75, + 0xf6, 0x75, 0xfc, 0x75, 0x9a, 0x18, 0x7a, 0x62, 0x67, 0x7f, 0xd8, 0x38, + 0xb8, 0x97, 0xfc, 0x3a, 0xff, 0x73, 0x19, 0x00, 0xfa, 0xb3, 0xaf, 0xf7, + 0x62, 0x7e, 0x46, 0x04, 0xeb, 0xff, 0xf4, 0x4f, 0x1c, 0x85, 0xc4, 0x7b, + 0xa8, 0x05, 0x9d, 0x50, 0x88, 0x5e, 0x99, 0x53, 0x13, 0x12, 0xe1, 0xbf, + 0x61, 0x73, 0x7e, 0x8e, 0x2f, 0xa1, 0x3a, 0xf0, 0x70, 0x4e, 0xbc, 0xee, + 0xc3, 0x45, 0x69, 0x7e, 0x57, 0x7d, 0x7f, 0xb9, 0xd4, 0xc3, 0xd3, 0x42, + 0x7b, 0xff, 0xc9, 0xe9, 0x43, 0x3a, 0x9e, 0xd3, 0xee, 0x75, 0x70, 0xfa, + 0xb6, 0x90, 0xdf, 0xfe, 0xea, 0x2e, 0x19, 0x8b, 0xc1, 0xf6, 0xc9, 0xd7, + 0xff, 0xcc, 0x8e, 0x60, 0x1d, 0x6f, 0x28, 0x46, 0x1d, 0x7f, 0xfd, 0x2d, + 0x60, 0xc2, 0xdf, 0x3d, 0xe8, 0x59, 0xd7, 0x7b, 0xd0, 0x89, 0x87, 0x4c, + 0xbf, 0xff, 0xfd, 0x1b, 0x53, 0xda, 0xc5, 0x59, 0xd4, 0xf6, 0x4c, 0x30, + 0xb9, 0xf1, 0xb3, 0xaf, 0xf4, 0x79, 0xfb, 0xf0, 0x30, 0x75, 0xf4, 0xbc, + 0x93, 0x9d, 0x7e, 0xfb, 0xe1, 0x80, 0x1d, 0x5b, 0x9e, 0x56, 0xd2, 0x2b, + 0xfc, 0xf2, 0xf2, 0x4f, 0xd4, 0x3a, 0xa0, 0xf5, 0xd0, 0x96, 0xfd, 0x9d, + 0x4c, 0x59, 0xd7, 0xe4, 0x02, 0xd3, 0x87, 0x5f, 0xfc, 0x2e, 0x8c, 0xeb, + 0xff, 0x3f, 0x10, 0xea, 0x9d, 0x11, 0xc1, 0x25, 0xe9, 0x35, 0xfe, 0x94, + 0x72, 0x78, 0xe4, 0xe7, 0x5f, 0x4b, 0x98, 0xb3, 0xaf, 0x67, 0x00, 0x75, + 0xfa, 0x6c, 0x0a, 0xda, 0xce, 0xbf, 0x86, 0x1b, 0xde, 0x5a, 0x3a, 0xb7, + 0x44, 0xaa, 0x10, 0xcc, 0x37, 0xb0, 0x57, 0x50, 0x98, 0x56, 0x43, 0x26, + 0xff, 0xff, 0xfe, 0xc4, 0x66, 0x7a, 0x07, 0xda, 0xf9, 0x08, 0x1c, 0x5f, + 0xce, 0x42, 0x49, 0xf4, 0x75, 0xfd, 0x9e, 0x71, 0x07, 0xe7, 0x5f, 0xdd, + 0xf8, 0x93, 0xb8, 0x9d, 0x7f, 0xa1, 0x7a, 0x08, 0xbb, 0x67, 0x5f, 0x38, + 0x1c, 0x27, 0x54, 0x91, 0x59, 0x85, 0x82, 0x5d, 0xa3, 0x2b, 0x28, 0xd2, + 0x64, 0x37, 0xc4, 0x67, 0x93, 0x9b, 0x04, 0x9f, 0x21, 0xae, 0xc2, 0x44, + 0x87, 0x17, 0x0b, 0x56, 0xf5, 0xd8, 0x6a, 0x3c, 0x2b, 0x86, 0x33, 0xbd, + 0x13, 0xfa, 0x33, 0x3b, 0xf7, 0x18, 0xee, 0xc3, 0x45, 0x81, 0x7e, 0x76, + 0x7d, 0xec, 0xc7, 0x59, 0x4c, 0x3d, 0xdd, 0x19, 0xdf, 0xb8, 0xc7, 0x76, + 0x1a, 0x27, 0x5b, 0xff, 0xfd, 0xd8, 0x9c, 0x38, 0xb5, 0x35, 0xac, 0xea, + 0x6b, 0xf9, 0xce, 0xbf, 0x28, 0xb7, 0x92, 0x98, 0x89, 0x79, 0x8c, 0xef, + 0x2b, 0x0b, 0x3a, 0xf9, 0xd9, 0xf5, 0x67, 0x5e, 0x96, 0x94, 0x54, 0xdf, + 0xed, 0x1c, 0xbf, 0x71, 0x8e, 0xec, 0x34, 0x5b, 0x37, 0xf7, 0x9f, 0xbf, + 0x03, 0x07, 0x5f, 0xff, 0xd2, 0x53, 0x50, 0x98, 0x14, 0xcd, 0x67, 0x86, + 0x0e, 0xa8, 0x44, 0x2b, 0x97, 0x5f, 0xf8, 0x11, 0xa5, 0x3a, 0x8c, 0x7e, + 0x1d, 0x7f, 0xd1, 0x28, 0xe4, 0xf1, 0xc9, 0xce, 0xb2, 0x98, 0x9a, 0x82, + 0xe1, 0x70, 0xe4, 0x22, 0x7d, 0x7f, 0xe1, 0x51, 0x7f, 0xa7, 0x85, 0xf6, + 0x0e, 0xbf, 0xfb, 0xfd, 0x29, 0x9c, 0x7d, 0x75, 0xe4, 0x75, 0xce, 0x0c, + 0x44, 0x30, 0x10, 0x6e, 0xdd, 0x87, 0x5f, 0x31, 0xdd, 0x86, 0x8b, 0x9a, + 0xcb, 0x3a, 0xb8, 0x6f, 0x5b, 0x2d, 0xbf, 0xdc, 0x1c, 0xdc, 0x09, 0x23, + 0xae, 0x99, 0x67, 0x51, 0xd6, 0x52, 0x11, 0x93, 0x8a, 0x88, 0x44, 0xd9, + 0x96, 0xc8, 0xbd, 0xfb, 0x8c, 0x77, 0x61, 0xa2, 0xef, 0xbf, 0xd2, 0x53, + 0x5c, 0xe2, 0x36, 0x75, 0x94, 0xc3, 0xe8, 0x73, 0x3b, 0xe5, 0x15, 0x08, + 0x0e, 0xa8, 0x7d, 0xac, 0xfc, 0xbc, 0xa6, 0x46, 0x1b, 0xee, 0xae, 0x94, + 0x90, 0x1e, 0x46, 0x9a, 0xb8, 0x5f, 0xbc, 0x20, 0x41, 0x1c, 0x38, 0xc3, + 0x37, 0x50, 0xf6, 0xf4, 0x2e, 0xbe, 0x93, 0xdf, 0xf9, 0xb7, 0x19, 0xf4, + 0x83, 0xbc, 0x8e, 0xbf, 0xfb, 0x27, 0xc6, 0xfb, 0x9a, 0xc4, 0x13, 0xae, + 0x45, 0x3a, 0x88, 0x11, 0x3f, 0xbf, 0x6b, 0x4b, 0x79, 0x1d, 0x7f, 0xff, + 0xff, 0xee, 0xa7, 0x52, 0x07, 0xc2, 0xea, 0xe7, 0xbf, 0xf2, 0x7b, 0x5d, + 0x4e, 0x44, 0xef, 0xc6, 0x1d, 0x76, 0xa0, 0xeb, 0xff, 0xb7, 0x67, 0xef, + 0xbf, 0xb3, 0x05, 0x53, 0xaf, 0x0b, 0xa9, 0x09, 0x8d, 0x30, 0x9f, 0x50, + 0x98, 0xf0, 0xad, 0xef, 0xdd, 0x67, 0x5f, 0xb3, 0x63, 0xd0, 0xa9, 0xd6, + 0xd8, 0x3a, 0xa7, 0x37, 0xb8, 0x55, 0x5c, 0x3f, 0xa1, 0x59, 0xbf, 0xf6, + 0x9d, 0x5e, 0xa4, 0x0f, 0xf0, 0x75, 0xff, 0xba, 0xfe, 0x7e, 0xef, 0x2c, + 0xf1, 0xd5, 0x87, 0xf6, 0x87, 0xb7, 0x38, 0x0e, 0xbf, 0xff, 0xfc, 0x2e, + 0xd8, 0xe7, 0xbd, 0x93, 0xc0, 0xba, 0xba, 0x5c, 0x60, 0x84, 0xeb, 0xd9, + 0xf7, 0x47, 0x56, 0x22, 0x9b, 0x82, 0xbb, 0x0e, 0x97, 0xfb, 0xb8, 0x14, + 0xdb, 0xcc, 0x3a, 0xf3, 0xbb, 0x0d, 0x12, 0xbd, 0xfe, 0x55, 0xc4, 0x1e, + 0xce, 0x9d, 0x4c, 0x3d, 0x94, 0x27, 0xbf, 0xdb, 0x8b, 0xaa, 0xfe, 0x91, + 0xd7, 0xff, 0x77, 0x24, 0xce, 0xa0, 0x60, 0x7c, 0x75, 0x21, 0xfa, 0xf8, + 0xce, 0xa4, 0x9a, 0x1f, 0x21, 0x18, 0x30, 0x96, 0xbf, 0xff, 0xfe, 0xe3, + 0x8f, 0xd8, 0x06, 0x4b, 0xb1, 0xb4, 0x30, 0xa6, 0x0f, 0xf2, 0xcd, 0x1d, + 0x74, 0xa7, 0x3a, 0xff, 0xff, 0x3e, 0xfa, 0xce, 0x7b, 0xcf, 0x3f, 0xd5, + 0x87, 0xa8, 0xa9, 0xd7, 0xfd, 0x89, 0xb4, 0x63, 0x39, 0x23, 0xaf, 0xff, + 0xde, 0x96, 0x35, 0xb8, 0x83, 0x7f, 0x72, 0x31, 0xb3, 0x9b, 0x36, 0xf7, + 0xed, 0xfd, 0xd8, 0x01, 0xd4, 0xe8, 0x91, 0xfd, 0xa6, 0xff, 0xf4, 0xc3, + 0x1e, 0xd7, 0xb7, 0x62, 0x0c, 0xe7, 0x5f, 0xf3, 0xb6, 0x1e, 0xc4, 0xf8, + 0xd9, 0xd4, 0x88, 0x85, 0x14, 0xbb, 0xff, 0xf6, 0x20, 0x31, 0x69, 0xed, + 0x42, 0xdf, 0x7f, 0x1d, 0x7f, 0xd0, 0xbf, 0x64, 0xd2, 0x4f, 0x1d, 0x52, + 0x44, 0x5f, 0x94, 0xef, 0xbf, 0x7e, 0x48, 0xeb, 0xf8, 0x62, 0x70, 0x3f, + 0x8e, 0xbf, 0xce, 0x1f, 0xbb, 0x10, 0x32, 0x3a, 0xd0, 0xc3, 0xe2, 0x59, + 0x65, 0xff, 0xfe, 0x4f, 0x3a, 0xdc, 0x41, 0xd6, 0xdc, 0x67, 0x62, 0x4e, + 0x75, 0x05, 0x30, 0xb4, 0x84, 0x23, 0x93, 0xdf, 0xf7, 0xe0, 0x5b, 0xcb, + 0x5c, 0x09, 0xd7, 0xff, 0xfb, 0x10, 0x7d, 0x83, 0xf0, 0x5c, 0x30, 0x33, + 0xc7, 0x0e, 0xb6, 0x79, 0x12, 0xfb, 0x4e, 0xaf, 0xfb, 0x70, 0x67, 0x33, + 0x3d, 0xa3, 0xa8, 0x2a, 0xc1, 0xf2, 0x15, 0x9d, 0x8c, 0xb8, 0x61, 0x97, + 0xf4, 0xaa, 0xff, 0xd9, 0xde, 0xbc, 0x81, 0xcc, 0xdc, 0xeb, 0xfe, 0xcd, + 0xf4, 0x18, 0x71, 0x9c, 0xeb, 0xfe, 0x79, 0x6b, 0xb1, 0xcf, 0xa1, 0x3a, + 0xa4, 0x8b, 0x0c, 0x3e, 0xf1, 0xc5, 0xff, 0xde, 0x4d, 0xa9, 0xe9, 0xa5, + 0x03, 0xe3, 0xaf, 0xff, 0x3e, 0x4b, 0xb8, 0x83, 0x80, 0xd9, 0xc3, 0xaf, + 0x3c, 0x94, 0x86, 0x52, 0x5c, 0xa1, 0x38, 0x18, 0x63, 0x64, 0x6e, 0xbc, + 0x3a, 0x5b, 0xf8, 0x05, 0xc6, 0x32, 0xdd, 0x4b, 0xaf, 0xf4, 0x61, 0x9f, + 0x4b, 0xf6, 0x11, 0x6f, 0xff, 0x67, 0x54, 0x1c, 0x0a, 0x0f, 0xb3, 0xa7, + 0x5e, 0xf4, 0x04, 0xab, 0xff, 0xdd, 0x74, 0xf4, 0x49, 0x39, 0x3f, 0xe0, + 0x2a, 0xff, 0x3b, 0x14, 0x0f, 0x1a, 0x6a, 0x41, 0xf2, 0xe8, 0x6e, 0xca, + 0x05, 0x9c, 0x78, 0xc8, 0xd2, 0x17, 0x4b, 0x18, 0xf4, 0x38, 0x36, 0xc2, + 0xb2, 0xff, 0xf2, 0x8b, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x13, 0x0d, + 0xff, 0xfd, 0x9b, 0x5c, 0x3d, 0x85, 0x3d, 0xdc, 0x0f, 0xfe, 0xd1, 0xd7, + 0xff, 0xb8, 0xe0, 0x51, 0x5f, 0x49, 0xb8, 0xd4, 0x8e, 0xbb, 0x14, 0x14, + 0x55, 0xfd, 0x5e, 0xb9, 0x7b, 0x4e, 0xbf, 0xf9, 0xa1, 0x9b, 0xcb, 0xf7, + 0xf0, 0xc4, 0x8e, 0xbf, 0x35, 0x6d, 0x5b, 0x51, 0xb2, 0xd5, 0x1d, 0x7e, + 0xc5, 0xfc, 0xdd, 0xac, 0xeb, 0xfa, 0x17, 0x80, 0x8d, 0xa7, 0x50, 0x4f, + 0x6b, 0xa5, 0xb7, 0xfb, 0x98, 0xc8, 0x07, 0xd5, 0x9d, 0x7e, 0xec, 0x05, + 0x15, 0x3a, 0x90, 0xff, 0x78, 0x45, 0xb0, 0x69, 0x7f, 0xa1, 0xe7, 0xf2, + 0xaf, 0xc3, 0xaf, 0xcf, 0xc9, 0x3a, 0xce, 0xa1, 0x3d, 0x9f, 0xcc, 0xef, + 0xf6, 0xa3, 0x04, 0x3d, 0x83, 0xaf, 0xe8, 0xc1, 0x0f, 0x60, 0xeb, 0xdf, + 0xf2, 0x6f, 0x87, 0xb5, 0xa3, 0x0b, 0xff, 0xdc, 0x4f, 0xf1, 0x5c, 0xf7, + 0xf1, 0xb8, 0x4e, 0xbf, 0xff, 0x27, 0x3a, 0xff, 0x03, 0x92, 0xec, 0x6d, + 0x0c, 0x1d, 0x7f, 0xcd, 0xfd, 0xec, 0x33, 0xa9, 0x31, 0xd7, 0xdf, 0xaf, + 0x02, 0x75, 0xb3, 0x73, 0xde, 0xd8, 0x3c, 0xbf, 0xa3, 0x91, 0x2d, 0x61, + 0xd4, 0xc4, 0xe3, 0xf8, 0x71, 0xd4, 0xc1, 0x85, 0xaf, 0x8a, 0xef, 0xff, + 0x43, 0x35, 0xff, 0x93, 0xa8, 0xaf, 0x50, 0xeb, 0xf9, 0x71, 0x83, 0xed, + 0x93, 0xad, 0xa3, 0xaf, 0xd1, 0x83, 0xed, 0x93, 0xaf, 0x69, 0xf7, 0xf8, + 0x7c, 0xd3, 0x17, 0x2c, 0x42, 0xee, 0xa2, 0xd1, 0xe9, 0xe8, 0x58, 0x5f, + 0xde, 0x85, 0xed, 0x04, 0x8e, 0xbb, 0xc8, 0x75, 0x48, 0xf1, 0x15, 0x2f, + 0xbf, 0xff, 0xcd, 0xec, 0x7b, 0x3b, 0xf0, 0x72, 0x74, 0xc1, 0xde, 0x5a, + 0x3a, 0xfc, 0xdf, 0xb3, 0xac, 0x3a, 0xc3, 0x88, 0x8e, 0x76, 0x6b, 0xff, + 0xde, 0x17, 0x07, 0x71, 0x03, 0xff, 0xb4, 0x75, 0xff, 0x44, 0xff, 0x65, + 0xdf, 0xde, 0x73, 0xaa, 0x11, 0x0d, 0xc4, 0x9b, 0xff, 0xb3, 0x79, 0x7c, + 0xeb, 0xb2, 0x04, 0x27, 0x5f, 0x24, 0x6f, 0xa3, 0xaf, 0xdf, 0x7c, 0x30, + 0x03, 0xab, 0xc7, 0x93, 0xb4, 0x86, 0xfb, 0xde, 0xc6, 0xce, 0xbf, 0xfd, + 0x1e, 0x04, 0x4b, 0x37, 0xf4, 0xff, 0xb6, 0x75, 0xed, 0x38, 0x0e, 0xa8, + 0x45, 0x76, 0x12, 0x21, 0x17, 0x93, 0x6f, 0xff, 0xba, 0x9a, 0x89, 0x7c, + 0xce, 0xa7, 0x3a, 0xe7, 0x5f, 0xce, 0x0e, 0x71, 0x38, 0x75, 0xef, 0x7c, + 0xc3, 0xa8, 0x07, 0x93, 0xf4, 0xb2, 0xfb, 0xbf, 0xef, 0xe3, 0xaf, 0xed, + 0x22, 0xab, 0x7f, 0x1d, 0x7f, 0xff, 0xee, 0x66, 0xd8, 0x1f, 0x7c, 0xfa, + 0x31, 0xd7, 0x4f, 0x47, 0xb4, 0x75, 0xfc, 0x39, 0xaf, 0x8c, 0x69, 0x1d, + 0x5b, 0xa3, 0x37, 0x85, 0xbb, 0x5b, 0xaf, 0xbe, 0x6d, 0xd8, 0x9c, 0xea, + 0x0a, 0x69, 0xd9, 0x0f, 0x15, 0x4c, 0xec, 0xd6, 0x75, 0xf9, 0x7c, 0xc0, + 0xf8, 0xeb, 0xbd, 0x87, 0x5f, 0xfe, 0x69, 0x8c, 0x2d, 0xd3, 0xaf, 0xee, + 0xc1, 0xd5, 0x07, 0xbf, 0xf8, 0xad, 0xfe, 0xea, 0x4c, 0xec, 0xd4, 0x8e, + 0xbf, 0x87, 0xce, 0xb4, 0xf1, 0xd7, 0xfe, 0x4f, 0x7f, 0xc7, 0xd7, 0xc5, + 0xf8, 0xea, 0x83, 0xec, 0x72, 0xbb, 0xfe, 0xc4, 0xc5, 0x8e, 0x4e, 0xe7, + 0x5f, 0xa3, 0xda, 0x07, 0xe7, 0x53, 0x54, 0x9e, 0xbc, 0x09, 0xe4, 0x21, + 0x98, 0x45, 0xd8, 0x4f, 0x89, 0x07, 0x8d, 0x6f, 0xff, 0xdd, 0x1c, 0xf7, + 0x53, 0x37, 0xf6, 0x6d, 0x8d, 0x1d, 0x7f, 0xf3, 0x8f, 0x61, 0x02, 0x9a, + 0xc9, 0x1d, 0x7a, 0x01, 0xf4, 0xeb, 0xfb, 0x36, 0xf5, 0x01, 0x31, 0xd5, + 0x88, 0xe1, 0x75, 0x51, 0x40, 0xd0, 0xed, 0xef, 0xa1, 0xc3, 0xaf, 0x34, + 0xf4, 0xd2, 0x3a, 0x9c, 0xf0, 0x74, 0x3b, 0x7d, 0xf1, 0x7f, 0x18, 0x75, + 0xec, 0x60, 0x4e, 0xbf, 0x9d, 0xb8, 0xf6, 0x4e, 0x75, 0x61, 0xe4, 0x08, + 0xdd, 0xfb, 0x76, 0xe6, 0xd4, 0x1d, 0x65, 0x1a, 0xa6, 0x7b, 0xbb, 0x48, + 0x61, 0xa9, 0x24, 0x44, 0x62, 0xc1, 0x84, 0x56, 0x4a, 0x0b, 0x64, 0x68, + 0x7b, 0xbb, 0xcd, 0x0b, 0x1e, 0x42, 0xb1, 0x64, 0x5d, 0x8c, 0xf1, 0xce, + 0x81, 0x09, 0x81, 0x8d, 0xcb, 0x52, 0x83, 0x7d, 0x1a, 0x97, 0xef, 0x6d, + 0x90, 0xec, 0xb7, 0x7d, 0x20, 0xbf, 0xfe, 0xe2, 0x6f, 0x2d, 0x27, 0xbb, + 0x1c, 0xf4, 0x1d, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0xab, 0xaf, 0x72, 0x16, + 0x75, 0xfe, 0x8e, 0x7a, 0x06, 0x00, 0x75, 0xff, 0x49, 0x4c, 0xe3, 0x1d, + 0xd8, 0x68, 0x8f, 0x2f, 0xfa, 0x25, 0x1c, 0x9e, 0x39, 0x39, 0xd7, 0xfe, + 0x8f, 0x27, 0xed, 0x3c, 0x94, 0xf3, 0x1d, 0x7f, 0xdb, 0xb1, 0x35, 0xd4, + 0xf2, 0x1d, 0x65, 0x02, 0x9e, 0x3e, 0x27, 0xf0, 0xcf, 0xa3, 0x6e, 0x60, + 0x28, 0xba, 0x39, 0xf2, 0x25, 0xfb, 0x8c, 0x77, 0x61, 0xa2, 0xc1, 0xbc, + 0xac, 0x4e, 0x75, 0xff, 0xfc, 0x3f, 0xbc, 0xeb, 0xcd, 0x9f, 0xf9, 0x9c, + 0x97, 0xd9, 0x1d, 0x7e, 0xc1, 0xcf, 0x68, 0xeb, 0xfd, 0xc7, 0x5f, 0xde, + 0x3e, 0xe7, 0x59, 0x4c, 0x4c, 0x31, 0x53, 0x36, 0x0e, 0xbb, 0x17, 0xd2, + 0x5b, 0xfc, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x59, 0x57, 0xee, 0x31, 0xdd, + 0x86, 0x8b, 0x4e, 0xff, 0x9c, 0x3d, 0x79, 0xba, 0x8b, 0x3a, 0xca, 0x61, + 0xf5, 0xac, 0xce, 0xfc, 0xd1, 0xda, 0x9b, 0x54, 0xd5, 0x35, 0x67, 0x5f, + 0xf3, 0x4b, 0xa8, 0xd8, 0x5d, 0xd8, 0x75, 0xf9, 0xa3, 0xb4, 0x35, 0x90, + 0x75, 0xfe, 0xfa, 0xbc, 0xf6, 0x93, 0x47, 0x59, 0x0e, 0xa6, 0x91, 0xe1, + 0xec, 0x9a, 0x5f, 0xff, 0xc9, 0xd7, 0x1f, 0x4b, 0x39, 0x90, 0x23, 0x9e, + 0x3a, 0xfd, 0xb5, 0xc3, 0x8b, 0x3a, 0xf9, 0x71, 0xbe, 0x8e, 0xbf, 0xf9, + 0x31, 0xc1, 0x12, 0xe4, 0x60, 0x9d, 0x7c, 0x9b, 0x7b, 0xb4, 0xea, 0x92, + 0x60, 0x78, 0xab, 0x31, 0x40, 0x91, 0x68, 0xfe, 0xff, 0x2f, 0xea, 0xc0, + 0xb4, 0x01, 0xd7, 0xef, 0x9c, 0xe7, 0xfd, 0x3a, 0xfc, 0x8a, 0xc0, 0xb0, + 0xea, 0xd1, 0xe8, 0xf8, 0xae, 0xa1, 0x15, 0x19, 0x08, 0x6b, 0xff, 0xe1, + 0x67, 0x53, 0xa9, 0xc8, 0x99, 0xbc, 0xe9, 0xd7, 0xfe, 0x5a, 0xde, 0x5b, + 0x3f, 0xf5, 0x38, 0x75, 0xf9, 0xf5, 0xe8, 0x09, 0xd5, 0x07, 0xd1, 0xfa, + 0x15, 0xfe, 0x7e, 0x49, 0xfc, 0xec, 0x3a, 0xa1, 0x30, 0xae, 0xc2, 0xdf, + 0xf2, 0x2b, 0xe8, 0xfb, 0x1d, 0x3a, 0xf9, 0x8e, 0xec, 0x34, 0x5b, 0x97, + 0xd3, 0x40, 0x70, 0xeb, 0xff, 0x67, 0x30, 0x7e, 0x77, 0x37, 0x6c, 0xeb, + 0xf0, 0x81, 0xf7, 0xd1, 0xd5, 0x07, 0xce, 0xe8, 0x15, 0xba, 0x3d, 0xf8, + 0x44, 0xe5, 0xba, 0x84, 0x45, 0xfe, 0x71, 0x04, 0xc3, 0x0b, 0x3a, 0xf2, + 0xc5, 0x0e, 0xb0, 0x9d, 0x7f, 0xdd, 0xfd, 0xf5, 0x98, 0x2a, 0x9d, 0x7e, + 0xd3, 0xee, 0xe1, 0x3a, 0xc8, 0x13, 0xdf, 0xf1, 0xc5, 0x42, 0x2b, 0xf0, + 0x6b, 0xad, 0xd7, 0xfd, 0x0e, 0x3d, 0xcc, 0x16, 0x1d, 0x7f, 0xbd, 0xe4, + 0x9d, 0x70, 0x27, 0x54, 0x8f, 0x9b, 0x0d, 0x2f, 0xfa, 0x07, 0xf5, 0xc6, + 0xbc, 0x87, 0x5e, 0x8c, 0xe1, 0xd7, 0xfb, 0xb1, 0x24, 0xd9, 0xc5, 0x9d, + 0x41, 0x3c, 0xed, 0x0d, 0x5f, 0xbe, 0x6f, 0xa4, 0x54, 0xeb, 0x3c, 0xe7, + 0x9b, 0xb9, 0x15, 0xff, 0xd2, 0xce, 0xa7, 0x03, 0xd8, 0x16, 0x1d, 0x7f, + 0xb7, 0x94, 0x0f, 0xb0, 0x07, 0x5f, 0x68, 0x09, 0xe3, 0xa9, 0xd1, 0x7d, + 0xa2, 0x9f, 0xd0, 0xbe, 0x99, 0x5f, 0x9f, 0x9e, 0xce, 0x9d, 0x7f, 0xe4, + 0x04, 0x48, 0x3d, 0x81, 0x61, 0xd5, 0x23, 0xe2, 0xf1, 0x35, 0xfd, 0xe9, + 0x67, 0x33, 0x47, 0x51, 0xd7, 0xbf, 0x7f, 0x1d, 0x77, 0xf0, 0x75, 0x48, + 0xd9, 0x78, 0x72, 0x8e, 0xbe, 0xdd, 0x89, 0xc3, 0xaf, 0x42, 0xd4, 0xc4, + 0x44, 0xee, 0x78, 0xb2, 0x1f, 0x05, 0x54, 0x26, 0x4d, 0x84, 0x49, 0x0b, + 0x5b, 0xc3, 0xed, 0x93, 0xaf, 0x7c, 0x6a, 0xda, 0xb3, 0xaf, 0xfa, 0x4a, + 0x67, 0x18, 0xee, 0xc3, 0x45, 0x0f, 0x48, 0x88, 0xb9, 0x87, 0x9c, 0xa2, + 0xfc, 0x08, 0x66, 0x2c, 0xeb, 0xe8, 0x9b, 0x02, 0x75, 0x70, 0xf1, 0xf4, + 0x4d, 0x7f, 0xd9, 0x01, 0xec, 0x6c, 0x44, 0xc7, 0x5f, 0xe0, 0x27, 0x7b, + 0x80, 0x73, 0xa9, 0x67, 0xd6, 0x03, 0xaa, 0x84, 0x57, 0xbc, 0x23, 0x6f, + 0xfc, 0xe1, 0x80, 0xf5, 0x05, 0x16, 0x75, 0xff, 0xb6, 0xbf, 0x34, 0xfd, + 0xd4, 0x4e, 0x75, 0xfe, 0xd7, 0xec, 0xcf, 0x0c, 0x1d, 0x4b, 0x45, 0x6f, + 0x4e, 0xfc, 0x81, 0x7f, 0xf7, 0xf2, 0xeb, 0xf3, 0x7f, 0x42, 0x4e, 0x75, + 0xfe, 0x94, 0x72, 0x78, 0xe4, 0xe7, 0x5f, 0x9f, 0x5b, 0x73, 0x47, 0x54, + 0x1e, 0xe0, 0x0d, 0x2f, 0xc9, 0xed, 0x3a, 0x1d, 0x7f, 0xdc, 0x07, 0x1c, + 0x7d, 0x80, 0x3a, 0x80, 0x7b, 0x9f, 0x92, 0xde, 0xfb, 0xc9, 0x1d, 0x7f, + 0x7d, 0xf7, 0xf1, 0x93, 0x9d, 0x52, 0x3c, 0xe9, 0x87, 0xaf, 0xfe, 0x60, + 0xc7, 0x87, 0x36, 0xe7, 0x24, 0x75, 0xff, 0x7e, 0x2a, 0xfd, 0xef, 0x7f, + 0xd1, 0xd7, 0xfd, 0xf6, 0x01, 0x34, 0xa3, 0x93, 0x9d, 0x7f, 0x0b, 0xfb, + 0xec, 0x30, 0xea, 0x59, 0xf4, 0x89, 0xe5, 0xf0, 0x82, 0x70, 0x1d, 0x58, + 0x78, 0x68, 0x43, 0x7f, 0xb5, 0xf3, 0xdf, 0x03, 0x82, 0x75, 0x80, 0x75, + 0x93, 0x73, 0xc6, 0xe1, 0xb5, 0xf9, 0xf7, 0xd7, 0x90, 0xea, 0x85, 0x40, + 0xb8, 0x46, 0x88, 0x7d, 0x87, 0x50, 0xb3, 0x68, 0xa2, 0xfc, 0xff, 0xab, + 0x1f, 0x4e, 0xbf, 0x34, 0xb3, 0x91, 0xa3, 0xaa, 0x63, 0xd4, 0x12, 0xab, + 0xfe, 0x7d, 0x44, 0xdb, 0xcb, 0x36, 0x9d, 0x7f, 0xfe, 0x0f, 0x63, 0xea, + 0x9e, 0x17, 0x06, 0xb5, 0x00, 0x2a, 0xe0, 0xe1, 0xd7, 0xe9, 0xe2, 0x77, + 0xd1, 0xd5, 0x88, 0x94, 0x45, 0x77, 0x15, 0xb8, 0x1f, 0x9d, 0x7f, 0x38, + 0x26, 0x18, 0x09, 0xd7, 0xfc, 0x39, 0x38, 0x7b, 0x83, 0xe3, 0xaa, 0x0f, + 0xeb, 0xa2, 0xe2, 0x59, 0x4d, 0x43, 0x67, 0x12, 0xd5, 0xa1, 0xb5, 0x33, + 0xc6, 0x89, 0xce, 0x23, 0x2c, 0x94, 0x3c, 0x83, 0x19, 0x86, 0x46, 0x5a, + 0xaa, 0x13, 0x21, 0xc1, 0xbc, 0x25, 0x10, 0x86, 0x68, 0xe4, 0x39, 0x1e, + 0x3a, 0xe1, 0x7d, 0xd8, 0xc9, 0x5e, 0x1a, 0x60, 0x30, 0x18, 0x51, 0x69, + 0xf7, 0xd2, 0x9d, 0xbf, 0x85, 0x76, 0xd2, 0x2d, 0x98, 0x67, 0xfd, 0x85, + 0x3d, 0xff, 0xf9, 0x8a, 0x03, 0x99, 0xbb, 0x3a, 0x9e, 0xd3, 0xee, 0x75, + 0x28, 0xa8, 0x7b, 0xf8, 0xf1, 0xaf, 0xa3, 0x92, 0x59, 0xd7, 0xdb, 0xe9, + 0xda, 0xce, 0xbc, 0xfc, 0x54, 0xeb, 0x29, 0x39, 0xf1, 0x21, 0x0b, 0x64, + 0xb7, 0xf9, 0x4c, 0xe3, 0x1d, 0xd8, 0x68, 0xbc, 0xea, 0x1d, 0x6d, 0x64, + 0x9c, 0x03, 0x18, 0x16, 0x53, 0xe9, 0xf7, 0x96, 0x81, 0xc8, 0xe0, 0x96, + 0xa7, 0xd8, 0x55, 0x0d, 0x6b, 0x9f, 0xa8, 0x47, 0xed, 0x37, 0xbf, 0xca, + 0x67, 0x18, 0xee, 0xc3, 0x45, 0x2d, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0xb0, + 0xaf, 0xff, 0xd1, 0x82, 0x18, 0xec, 0x6f, 0xec, 0x17, 0x59, 0xd6, 0xd1, + 0xd7, 0xf7, 0xfc, 0x49, 0xdd, 0x67, 0x59, 0x4c, 0x46, 0x12, 0xcc, 0xf4, + 0xa3, 0xb2, 0x21, 0x7f, 0x94, 0xce, 0x31, 0xdd, 0x86, 0x8b, 0x2e, 0xee, + 0x2a, 0x75, 0xf2, 0x8a, 0xb4, 0x4d, 0x41, 0xd4, 0x55, 0xe5, 0x3e, 0xac, + 0xea, 0x61, 0xeb, 0xe8, 0xbb, 0xf0, 0xaa, 0x14, 0x4f, 0x69, 0xba, 0xe8, + 0xe9, 0xd6, 0x01, 0xd7, 0x2b, 0x39, 0xd6, 0xe4, 0x8d, 0x46, 0x08, 0x53, + 0x0f, 0x8d, 0xcf, 0x6e, 0x40, 0x1d, 0x7f, 0xcf, 0xb8, 0xe6, 0xfe, 0x85, + 0x4e, 0xbf, 0xd3, 0xef, 0xa8, 0x0f, 0x90, 0xeb, 0xf4, 0x66, 0xd8, 0xd1, + 0xd6, 0x87, 0x3d, 0xb6, 0xcd, 0x29, 0xd1, 0x76, 0x30, 0x94, 0xbe, 0x79, + 0x48, 0x27, 0x5f, 0xcf, 0xc8, 0xf3, 0xf4, 0xeb, 0xcd, 0xb6, 0xd9, 0x57, + 0xfd, 0x12, 0xdf, 0xdc, 0x8c, 0xdc, 0xa5, 0x0b, 0xfb, 0xfe, 0xfd, 0xf7, + 0xcf, 0x26, 0xed, 0x9d, 0x74, 0x68, 0xea, 0x0a, 0x60, 0x9d, 0x21, 0x14, + 0xad, 0x24, 0xed, 0x3b, 0xb9, 0xa2, 0x6a, 0x0e, 0xbf, 0x91, 0xf4, 0x0d, + 0x7e, 0x75, 0xff, 0xc9, 0x27, 0xd3, 0x8f, 0xec, 0xcd, 0x15, 0x7f, 0xff, + 0x75, 0x3d, 0xdc, 0xd0, 0xe2, 0xff, 0xd7, 0x5e, 0x47, 0x5f, 0xe8, 0x97, + 0x9f, 0xae, 0x13, 0xaa, 0x11, 0x9b, 0x88, 0x5c, 0x5a, 0xb4, 0x8e, 0xb4, + 0x8e, 0xb4, 0x8e, 0xa8, 0x36, 0x0a, 0x88, 0x20, 0x85, 0xfd, 0xfe, 0xba, + 0xf2, 0xc3, 0xaf, 0xff, 0xb4, 0x8c, 0xc1, 0xe4, 0x0e, 0x07, 0x15, 0x3a, + 0x96, 0x7f, 0x3e, 0x2d, 0xb6, 0xe7, 0x59, 0x53, 0xad, 0xf9, 0xd4, 0x26, + 0x8b, 0x42, 0x35, 0x87, 0xeb, 0xa2, 0x2f, 0x19, 0xdd, 0xa5, 0x4e, 0xb6, + 0x1d, 0x77, 0xe0, 0x83, 0x4c, 0x11, 0x7b, 0x92, 0x0e, 0xbf, 0x86, 0x16, + 0x31, 0x87, 0x5d, 0x28, 0x3a, 0xa7, 0x3f, 0xf0, 0x96, 0xcc, 0x29, 0xf9, + 0x4d, 0xff, 0xff, 0xf7, 0x63, 0xda, 0x4d, 0x6a, 0x3d, 0xd4, 0x8e, 0x01, + 0x6f, 0x29, 0x79, 0x53, 0xae, 0x4d, 0xce, 0xba, 0x16, 0x75, 0xff, 0xfa, + 0x07, 0xf9, 0x4a, 0x3d, 0xdc, 0x5f, 0xd8, 0x01, 0xd7, 0xff, 0xc8, 0x3f, + 0xcb, 0x35, 0xc8, 0x49, 0x3e, 0x8a, 0xa9, 0x22, 0x8f, 0xca, 0xd7, 0x31, + 0x48, 0x5f, 0xff, 0x9e, 0x10, 0xb2, 0x21, 0x0c, 0x34, 0x32, 0x32, 0xa5, + 0x53, 0x18, 0x41, 0xc8, 0x7d, 0x3a, 0xf0, 0xc6, 0x37, 0xa8, 0x69, 0xf8, + 0xff, 0x6b, 0xee, 0xc8, 0xb7, 0xd8, 0x5c, 0x5f, 0xfe, 0x51, 0x6f, 0x25, + 0x33, 0x8c, 0x77, 0x61, 0xa2, 0x8c, 0xbf, 0x6d, 0x8e, 0x40, 0x0e, 0xbf, + 0x0b, 0x82, 0x3e, 0x9d, 0x7f, 0xe4, 0xde, 0x5a, 0x1c, 0xf7, 0x7f, 0x3a, + 0xff, 0x93, 0x9d, 0xcc, 0x19, 0x68, 0xeb, 0x6f, 0x23, 0xf5, 0x61, 0xfd, + 0xff, 0x9e, 0x4c, 0xea, 0x2e, 0x38, 0xa9, 0xd6, 0x52, 0x13, 0x2b, 0xe9, + 0x47, 0xa1, 0x38, 0xd9, 0x4d, 0x49, 0x99, 0xeb, 0xc8, 0xc0, 0x56, 0x8c, + 0xf4, 0x8d, 0xcd, 0x46, 0x0d, 0xe8, 0xe0, 0xaf, 0xfe, 0x51, 0xe4, 0xa6, + 0x71, 0x8e, 0xec, 0x34, 0x47, 0x37, 0xff, 0x94, 0x5b, 0xc9, 0x4c, 0xe3, + 0x1d, 0xd8, 0x68, 0x9c, 0xaf, 0xf2, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, 0x66, + 0x5f, 0xf4, 0xb4, 0xeb, 0x53, 0xbe, 0x01, 0xd7, 0xfc, 0xd1, 0x83, 0x8b, + 0x8d, 0xe1, 0x67, 0x5f, 0xee, 0x47, 0xba, 0xfb, 0xc8, 0xeb, 0xff, 0xff, + 0xe8, 0x9b, 0xb1, 0xe8, 0xfa, 0x9c, 0x9a, 0x3b, 0x9b, 0x73, 0xb8, 0x1d, + 0xb8, 0x75, 0x01, 0x16, 0x82, 0x67, 0x7f, 0xd9, 0xa7, 0xf0, 0x3e, 0x8c, + 0x8e, 0xbf, 0xd9, 0xae, 0x73, 0x37, 0xd1, 0xd7, 0xb9, 0x8b, 0x3a, 0xf9, + 0x07, 0x34, 0x75, 0xb3, 0xc6, 0xeb, 0x60, 0x6e, 0xff, 0xc8, 0x31, 0xa8, + 0xf4, 0xf8, 0xd9, 0xd7, 0xf7, 0x19, 0xd7, 0x46, 0x99, 0xd7, 0xe7, 0x18, + 0xdb, 0xf9, 0xd7, 0x6e, 0xb3, 0xac, 0xa3, 0x50, 0xaa, 0x3e, 0x21, 0xe5, + 0x39, 0x14, 0x8e, 0x42, 0xda, 0xb2, 0x9f, 0xcf, 0x76, 0x98, 0x6c, 0x94, + 0x5f, 0xe5, 0x33, 0x8c, 0x77, 0x61, 0xa2, 0xdd, 0xbf, 0x85, 0xd4, 0xe4, + 0xfd, 0x3a, 0xf2, 0x6e, 0x03, 0xaf, 0xfe, 0xe3, 0xb0, 0x1f, 0xeb, 0xd1, + 0xbb, 0x67, 0x5c, 0x2a, 0x9d, 0x7c, 0xc7, 0x76, 0x1a, 0x29, 0x0a, 0xc3, + 0xc3, 0xe0, 0xb5, 0xfe, 0x97, 0x91, 0xbd, 0x01, 0x0e, 0xbf, 0xf6, 0x75, + 0x36, 0xf7, 0x30, 0x58, 0x75, 0xe7, 0x92, 0x81, 0x4c, 0x6f, 0x21, 0x15, + 0xb9, 0x0e, 0x8c, 0xef, 0x38, 0xc8, 0xeb, 0x28, 0xc4, 0xf5, 0x38, 0x5c, + 0xb8, 0xcd, 0xdb, 0x55, 0xbf, 0xf9, 0x47, 0x92, 0x99, 0xc6, 0x3b, 0xb0, + 0xd1, 0x29, 0x54, 0xeb, 0xde, 0xf3, 0x28, 0xad, 0x5d, 0xcf, 0xc1, 0x2b, + 0x24, 0x61, 0x2f, 0xe9, 0x42, 0x7b, 0x09, 0x97, 0xfa, 0x48, 0x3e, 0xc4, + 0x09, 0xd7, 0xb5, 0xfa, 0xce, 0xb2, 0x9b, 0x9e, 0x6a, 0x18, 0x5e, 0x17, + 0x91, 0xd7, 0xee, 0x31, 0xdd, 0x86, 0x89, 0xda, 0xff, 0xec, 0xe8, 0xbc, + 0xbf, 0x02, 0xde, 0x47, 0x5e, 0x79, 0x29, 0x87, 0xec, 0x26, 0x77, 0x4e, + 0xd6, 0x75, 0xff, 0xf9, 0x03, 0xfa, 0xe3, 0x61, 0xc2, 0x30, 0x38, 0xc3, + 0xaf, 0xf4, 0xa3, 0x93, 0xc7, 0x27, 0x3a, 0xff, 0xdd, 0x17, 0x97, 0xe0, + 0x5b, 0xc8, 0xea, 0x83, 0xf2, 0xc3, 0x4b, 0x29, 0x89, 0xe1, 0xae, 0x12, + 0x1d, 0x32, 0x71, 0xa1, 0x86, 0x3d, 0xff, 0xf2, 0x9f, 0x76, 0x5c, 0x41, + 0x9e, 0x81, 0x40, 0x1d, 0x7f, 0xf3, 0xaf, 0xb8, 0xc7, 0xec, 0x7d, 0x91, + 0xd7, 0x90, 0x2e, 0x75, 0xff, 0xc3, 0x9d, 0x79, 0xf3, 0x42, 0xfb, 0x9d, + 0x76, 0xca, 0x81, 0x45, 0x07, 0x51, 0x34, 0x35, 0x52, 0x56, 0xee, 0xb8, + 0xfb, 0x34, 0xb3, 0xb3, 0x0f, 0x2b, 0xff, 0xf8, 0x2f, 0xe5, 0x33, 0x50, + 0x3b, 0x83, 0x5a, 0x80, 0x1d, 0x7e, 0xe3, 0x1d, 0xd8, 0x68, 0x8b, 0x2f, + 0xfc, 0xf2, 0x53, 0x38, 0xc7, 0x76, 0x1a, 0x25, 0xdb, 0xff, 0xfb, 0x03, + 0xd8, 0xfa, 0xa7, 0x85, 0xc1, 0xad, 0x40, 0x0a, 0xb2, 0x98, 0x8d, 0x95, + 0x99, 0xec, 0xa5, 0x5f, 0xfc, 0xb7, 0x92, 0x99, 0xc6, 0x3b, 0xb0, 0xd1, + 0x31, 0x5f, 0xff, 0x63, 0x21, 0x4e, 0xba, 0x6c, 0xa0, 0x30, 0x27, 0x52, + 0x88, 0xa0, 0xea, 0x85, 0xfb, 0x8c, 0x77, 0x61, 0xa2, 0xa9, 0xb6, 0x1d, + 0x58, 0x78, 0x4a, 0x99, 0xdf, 0xfb, 0xf7, 0xe4, 0x87, 0x1b, 0x70, 0x1d, + 0x7f, 0xf3, 0xeb, 0x88, 0xdf, 0xba, 0x9c, 0x91, 0xd7, 0xfd, 0xc7, 0xee, + 0xf2, 0xcf, 0x28, 0x14, 0x41, 0x74, 0xfa, 0x94, 0x47, 0xbb, 0xc2, 0x92, + 0xff, 0xf2, 0x8b, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x13, 0xa5, 0xfe, + 0x47, 0xe4, 0x49, 0xf6, 0x9d, 0x7e, 0x9a, 0x26, 0x8d, 0x1d, 0x7f, 0x37, + 0x89, 0xb7, 0x04, 0xea, 0x43, 0xd5, 0xd1, 0x45, 0xe4, 0xec, 0x1c, 0xa1, + 0xa1, 0xbf, 0xfb, 0xfd, 0x7a, 0x37, 0x53, 0xf9, 0x91, 0x67, 0x52, 0xcf, + 0xd3, 0xa5, 0x77, 0xfe, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x13, 0xbd, + 0xfb, 0xdf, 0xba, 0xd0, 0xab, 0xff, 0x0c, 0x7b, 0x35, 0x99, 0xbc, 0x8e, + 0xa0, 0xa7, 0xd7, 0x91, 0x8e, 0x2c, 0x89, 0xd2, 0xbc, 0x4f, 0x7f, 0xc1, + 0x89, 0x42, 0x8d, 0xe8, 0x07, 0x5f, 0xd0, 0xa0, 0x07, 0x02, 0x75, 0x28, + 0x8b, 0x5c, 0x4f, 0x13, 0xab, 0xff, 0xca, 0x2d, 0xe4, 0xa6, 0x71, 0x8e, + 0xec, 0x34, 0x50, 0xb7, 0xff, 0xcf, 0xe9, 0x60, 0xa0, 0x54, 0xd4, 0xf1, + 0xc3, 0xaf, 0xff, 0xff, 0x77, 0xf5, 0xad, 0xe4, 0xa3, 0x3b, 0xff, 0xa0, + 0x72, 0x75, 0x7f, 0x89, 0x8e, 0xbf, 0x7f, 0xbf, 0x91, 0x87, 0x5f, 0xb0, + 0x18, 0xe2, 0x75, 0xf6, 0x91, 0xbf, 0x1d, 0x7a, 0x00, 0xa4, 0xe7, 0xde, + 0x25, 0x3e, 0x24, 0xa4, 0x4c, 0xb8, 0x61, 0xdb, 0x7f, 0xf9, 0x45, 0xbc, + 0x94, 0xce, 0x31, 0xdd, 0x86, 0x8a, 0x4a, 0xff, 0xff, 0x66, 0x94, 0xfb, + 0x93, 0x75, 0xd7, 0xee, 0xc7, 0xbf, 0x59, 0xd5, 0x0c, 0x96, 0xf9, 0xe3, + 0x34, 0x94, 0x36, 0x59, 0x1a, 0xef, 0x0a, 0x17, 0x2b, 0xdc, 0x05, 0xe2, + 0xaf, 0xe8, 0xdf, 0x7f, 0x27, 0xd9, 0x57, 0xbf, 0xca, 0x67, 0x18, 0xee, + 0xc3, 0x44, 0x49, 0x7f, 0xf9, 0x45, 0xbc, 0x94, 0xce, 0x31, 0xdd, 0x86, + 0x89, 0x7a, 0xf3, 0x50, 0xb0, 0x1d, 0x7d, 0xcf, 0xfd, 0xa3, 0xaf, 0xdc, + 0x02, 0xd3, 0x47, 0x5e, 0x81, 0xdc, 0xeb, 0xf7, 0xbe, 0xac, 0x60, 0xeb, + 0x27, 0x4f, 0x0c, 0x46, 0xef, 0xff, 0x77, 0x6c, 0x08, 0x1a, 0xf0, 0x39, + 0xcd, 0xce, 0xba, 0x3c, 0x75, 0xff, 0x3c, 0xfc, 0x8d, 0xe4, 0x8b, 0x3a, + 0xff, 0xf7, 0xe1, 0x4e, 0x7d, 0x9b, 0x63, 0xf7, 0x19, 0x8e, 0xa9, 0x26, + 0x28, 0x84, 0xc0, 0x4e, 0x11, 0x5d, 0x1c, 0xdf, 0xc0, 0xec, 0x71, 0x16, + 0x75, 0xff, 0xa6, 0xd4, 0x6d, 0x7e, 0xc6, 0xf3, 0x1d, 0x50, 0x7d, 0xce, + 0x59, 0x7e, 0xc9, 0xf3, 0x4b, 0x3a, 0xff, 0xe9, 0xbe, 0x7d, 0x18, 0xda, + 0xfb, 0x62, 0x63, 0xa8, 0xeb, 0xf4, 0x9f, 0xcf, 0xb4, 0xeb, 0xf3, 0xea, + 0x36, 0xe1, 0xd5, 0x31, 0xe7, 0xed, 0x28, 0xa8, 0x46, 0x56, 0x26, 0x3a, + 0xcd, 0xdc, 0x83, 0xa8, 0x2a, 0xea, 0xd0, 0x8e, 0x68, 0xdf, 0xb9, 0x0b, + 0x71, 0x20, 0xdb, 0x0f, 0x1d, 0x82, 0xdb, 0xb0, 0x4e, 0xbf, 0xbe, 0x6b, + 0xb8, 0x9e, 0x3a, 0x82, 0x78, 0x48, 0x29, 0x70, 0x77, 0x3a, 0xfe, 0x1f, + 0xfd, 0x34, 0x2a, 0x75, 0xe6, 0x9a, 0x70, 0xeb, 0x23, 0x9e, 0x77, 0xe5, + 0xf7, 0xe1, 0xc9, 0xfe, 0xed, 0x3a, 0xfb, 0x27, 0xfb, 0xb4, 0xeb, 0xf0, + 0x63, 0x70, 0xbf, 0xc3, 0xd1, 0x12, 0xbb, 0xff, 0xe4, 0xe7, 0xce, 0xc2, + 0x7b, 0x5f, 0xb3, 0xf8, 0x3a, 0xf9, 0x27, 0x03, 0x59, 0xd7, 0xcc, 0x77, + 0x61, 0xa2, 0x97, 0xbe, 0x1f, 0x47, 0x0e, 0xbf, 0xec, 0xe3, 0x5e, 0x07, + 0x39, 0xb9, 0xd4, 0x87, 0xb7, 0xb4, 0x82, 0xa4, 0x9b, 0x12, 0xa8, 0x13, + 0x29, 0x70, 0x97, 0xb0, 0x88, 0xbf, 0x83, 0xbc, 0x71, 0x37, 0x3a, 0xfb, + 0xd3, 0xe3, 0x67, 0x52, 0x1e, 0x88, 0x97, 0x5f, 0xfa, 0x06, 0x3b, 0xf3, + 0xf1, 0xfd, 0x87, 0x5e, 0xfd, 0xf4, 0x75, 0xf4, 0xdf, 0xbc, 0xc7, 0x5f, + 0xa0, 0x0f, 0xbe, 0x8e, 0xbc, 0x28, 0x03, 0xaf, 0x67, 0xb4, 0x75, 0x41, + 0xb5, 0xd0, 0xd5, 0x05, 0x1f, 0x93, 0x20, 0x74, 0x70, 0x04, 0x9e, 0x5c, + 0xbf, 0x35, 0xb8, 0x87, 0x60, 0xeb, 0xa3, 0x73, 0xaf, 0xf8, 0x1a, 0xe4, + 0x6f, 0x24, 0x59, 0xd7, 0xbc, 0xfb, 0x4e, 0xbf, 0x4f, 0xfc, 0xd0, 0xd6, + 0x75, 0xf7, 0xf3, 0x43, 0x59, 0xd7, 0x3c, 0xff, 0x0f, 0x4e, 0x72, 0xda, + 0x84, 0x6d, 0x39, 0xcf, 0xee, 0x17, 0xfc, 0x9a, 0x99, 0x07, 0xd0, 0x03, + 0xaf, 0xfe, 0x1f, 0x6d, 0x8e, 0x69, 0xc6, 0x1a, 0xce, 0xa9, 0x22, 0xb1, + 0x65, 0xfa, 0x37, 0xbf, 0xd0, 0xd7, 0xa8, 0x5b, 0xf8, 0xeb, 0x9c, 0x4e, + 0xbf, 0xe8, 0x07, 0xce, 0xc2, 0xdc, 0x4e, 0xad, 0xcf, 0x33, 0x68, 0xa5, + 0x49, 0x14, 0xbc, 0x84, 0x05, 0xfd, 0x0d, 0xa7, 0x7f, 0x6b, 0x3a, 0xfe, + 0xde, 0x5a, 0x71, 0xdc, 0xea, 0x85, 0x64, 0x92, 0x2c, 0xc8, 0xe7, 0x12, + 0x1a, 0xbc, 0x28, 0xfa, 0x63, 0x7b, 0x90, 0xb3, 0xaf, 0xe8, 0x19, 0xbc, + 0x8a, 0x9d, 0x7f, 0xd2, 0xce, 0x4d, 0x83, 0x0b, 0x3a, 0xfc, 0x08, 0x66, + 0x2c, 0xeb, 0xfd, 0x93, 0xea, 0x26, 0xff, 0x87, 0x52, 0x22, 0x4b, 0x86, + 0xe2, 0x4d, 0x74, 0xb0, 0xeb, 0xee, 0x0c, 0x2c, 0xeb, 0xd0, 0x0d, 0x1d, + 0x50, 0x7f, 0xc1, 0x2e, 0xc1, 0x56, 0xc8, 0x2f, 0x9f, 0xaf, 0x39, 0xd7, + 0xee, 0xfe, 0xae, 0x09, 0xd7, 0xf9, 0xb1, 0x7f, 0x49, 0xc2, 0x75, 0xff, + 0x47, 0x74, 0xfe, 0x8e, 0x6c, 0x1d, 0x7f, 0xe5, 0xb8, 0x7e, 0xcd, 0x28, + 0x1d, 0xce, 0xa0, 0x9f, 0xda, 0x1d, 0x5f, 0x70, 0x1f, 0x76, 0x9d, 0x79, + 0x1b, 0xf1, 0xd5, 0xd3, 0xc2, 0xd1, 0x35, 0x4e, 0x9b, 0xd8, 0x48, 0x77, + 0x28, 0xec, 0x2b, 0x7c, 0xc7, 0x7f, 0x87, 0xd9, 0xa4, 0x7e, 0x9d, 0x7f, + 0xc0, 0x4e, 0xe7, 0x1e, 0x6d, 0x1d, 0x7f, 0xfe, 0x89, 0x0c, 0x4f, 0xf6, + 0x6d, 0x77, 0x36, 0x38, 0x03, 0xaf, 0xef, 0x8b, 0xcf, 0x3f, 0x8e, 0xb3, + 0x0e, 0xbb, 0x7d, 0x61, 0xbe, 0x72, 0xeb, 0xd0, 0x81, 0x3a, 0xa1, 0x34, + 0x7d, 0xcc, 0x16, 0x70, 0xf0, 0x99, 0xd1, 0x65, 0xfe, 0xc6, 0xe4, 0x9a, + 0xfd, 0x67, 0x5d, 0xb7, 0x47, 0x5f, 0xdf, 0xea, 0x26, 0xff, 0x87, 0x5f, + 0xb2, 0x7c, 0xee, 0x8e, 0xa8, 0x3e, 0xfe, 0x8c, 0x09, 0x85, 0xec, 0xe6, + 0x8e, 0xa6, 0x1e, 0x46, 0xd2, 0xdb, 0xfe, 0x04, 0x03, 0xee, 0xd8, 0x1d, + 0x83, 0xaa, 0x13, 0x4d, 0xc8, 0x75, 0xa1, 0x25, 0xff, 0xff, 0xdd, 0x8e, + 0x6e, 0xc4, 0xdf, 0xe2, 0xaf, 0xf3, 0x5d, 0x76, 0x40, 0x84, 0xeb, 0xe4, + 0x57, 0x67, 0x0e, 0xbf, 0xbe, 0xfa, 0x27, 0x1d, 0xce, 0xbc, 0x28, 0xb3, + 0xab, 0x87, 0xdc, 0x02, 0x4f, 0x18, 0x5f, 0xe1, 0x87, 0x1f, 0x60, 0x9d, + 0x7f, 0xba, 0xf3, 0x27, 0x22, 0x73, 0xae, 0xc5, 0x9d, 0x41, 0x4e, 0x2b, + 0x21, 0xca, 0xb2, 0xf7, 0x2e, 0xda, 0x67, 0x7e, 0xd8, 0x45, 0xc6, 0x8e, + 0xbf, 0x3e, 0xdc, 0xe6, 0x8e, 0xa0, 0x9e, 0x8a, 0xca, 0x6f, 0xdd, 0x71, + 0x45, 0x9d, 0x7c, 0xac, 0xda, 0x83, 0xaf, 0xe0, 0x6e, 0x0c, 0xe6, 0x1d, + 0x7f, 0x38, 0x17, 0x19, 0xe3, 0xaa, 0x0f, 0x61, 0x0b, 0x6f, 0xf3, 0x83, + 0x51, 0xd8, 0xd1, 0xd7, 0xed, 0xfd, 0xac, 0x9c, 0xeb, 0xb2, 0x73, 0xa9, + 0xcd, 0xf8, 0x94, 0xd4, 0x26, 0xe3, 0x84, 0x48, 0x4b, 0xd7, 0xb1, 0x20, + 0xd3, 0x85, 0xc0, 0x61, 0xd6, 0xd1, 0xd7, 0x22, 0xba, 0x34, 0xdf, 0x8b, + 0x5e, 0x03, 0xb0, 0xeb, 0xe6, 0xe6, 0xd4, 0x1d, 0x7f, 0x68, 0x5e, 0x78, + 0xf1, 0xd7, 0xe9, 0xdf, 0x59, 0x23, 0xaf, 0xff, 0x83, 0x9b, 0x5f, 0x93, + 0x7d, 0x93, 0xf9, 0xd6, 0x75, 0x41, 0xfd, 0x21, 0x3d, 0xfc, 0xfb, 0x81, + 0x69, 0xa3, 0xaa, 0x13, 0x31, 0xdc, 0x6e, 0x62, 0x3e, 0x42, 0x9b, 0xa4, + 0x17, 0xfb, 0xc8, 0xdb, 0xcd, 0x0b, 0x3a, 0xca, 0x35, 0x6d, 0xc7, 0x44, + 0x4b, 0xcc, 0x9e, 0x17, 0x92, 0x21, 0x0b, 0x2e, 0x47, 0xb5, 0xbc, 0x28, + 0xd2, 0x31, 0xc9, 0xa5, 0xb7, 0xf1, 0x8d, 0x63, 0x7d, 0x8c, 0xf5, 0xe3, + 0xb6, 0x04, 0x73, 0x23, 0x1c, 0xe6, 0xa3, 0xbd, 0xf4, 0xa1, 0x2d, 0x97, + 0xaf, 0xb1, 0xaf, 0xec, 0x28, 0xdf, 0xe5, 0x33, 0x8c, 0x77, 0x61, 0xa2, + 0x9c, 0xbf, 0xcb, 0x85, 0xe6, 0xc4, 0x78, 0xeb, 0xff, 0x27, 0x1f, 0x5d, + 0xcc, 0x16, 0x1d, 0x7e, 0x5f, 0x39, 0x9a, 0x3a, 0xff, 0xfd, 0xdf, 0xfd, + 0xc8, 0xf6, 0xb1, 0x9a, 0x8e, 0x30, 0xeb, 0xff, 0xfb, 0xd9, 0x30, 0xa6, + 0xbd, 0x1f, 0x53, 0x93, 0x47, 0x4e, 0xbf, 0xc8, 0xb0, 0xc6, 0xbf, 0x13, + 0xaf, 0xec, 0xf6, 0xf2, 0x86, 0xce, 0xbf, 0xf2, 0x6f, 0xa1, 0xc0, 0xf5, + 0xdb, 0x3a, 0xff, 0xfb, 0x27, 0xcd, 0xfd, 0xa4, 0x18, 0x03, 0xac, 0xea, + 0x55, 0x11, 0x9a, 0x3e, 0xbf, 0xf6, 0x76, 0x39, 0x8a, 0x36, 0xdb, 0x65, + 0x5c, 0x8d, 0x9d, 0x74, 0xea, 0x42, 0xaa, 0xf0, 0x9a, 0x61, 0xdb, 0x09, + 0xd1, 0x5b, 0xab, 0x82, 0x65, 0xe8, 0x5d, 0x6c, 0x92, 0x6c, 0x20, 0xdf, + 0xb8, 0xc7, 0x76, 0x1a, 0x2b, 0xcb, 0xff, 0xfb, 0x03, 0xd8, 0xfa, 0xa7, + 0x85, 0xc1, 0xad, 0x40, 0x0a, 0xb2, 0x98, 0x88, 0xfd, 0x93, 0x3b, 0xff, + 0x94, 0x79, 0x29, 0x9c, 0x63, 0xbb, 0x0d, 0x12, 0x3d, 0xe6, 0x62, 0xce, + 0xbc, 0x80, 0x83, 0xaf, 0x33, 0x16, 0x52, 0x85, 0xd5, 0xfb, 0x8c, 0x77, + 0x61, 0xa2, 0x48, 0xbf, 0xff, 0xa1, 0x38, 0x9b, 0x10, 0x33, 0xc7, 0x93, + 0xaf, 0x39, 0xd7, 0xff, 0x87, 0x01, 0xb3, 0x9c, 0x89, 0xdf, 0x8c, 0x3a, + 0xe9, 0x29, 0x09, 0x82, 0x61, 0x5f, 0x4c, 0xfc, 0xb7, 0x7e, 0xce, 0xa9, + 0x8b, 0x3a, 0xca, 0x42, 0x75, 0x2f, 0x19, 0xcf, 0x92, 0x6f, 0xfe, 0x51, + 0xe4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x49, 0x57, 0xee, 0x31, 0xdd, 0x86, + 0x8b, 0xc6, 0xff, 0xa4, 0xa6, 0x71, 0x8e, 0xec, 0x34, 0x49, 0xb6, 0x53, + 0x0f, 0xe1, 0xcc, 0xef, 0xe8, 0xd2, 0x2e, 0x26, 0x3a, 0xdd, 0x3a, 0x96, + 0x6f, 0x1b, 0x2c, 0xbf, 0x20, 0x35, 0x82, 0x75, 0xff, 0xc9, 0xfb, 0x35, + 0xa7, 0xe7, 0xa1, 0x53, 0xaf, 0xff, 0xbf, 0x7d, 0xf3, 0x15, 0x55, 0xe5, + 0x9b, 0xf8, 0xea, 0x92, 0x2f, 0x02, 0x4b, 0xa4, 0x5b, 0xff, 0x9c, 0x0c, + 0xea, 0x70, 0x53, 0xda, 0x3a, 0xe1, 0x9c, 0xea, 0x73, 0xd8, 0xfa, 0x85, + 0x77, 0x3c, 0x75, 0xe9, 0x86, 0x73, 0xae, 0x76, 0x1d, 0x7f, 0x30, 0x3f, + 0xcf, 0xf5, 0x67, 0x54, 0x1e, 0x3e, 0x0a, 0xd8, 0x4e, 0xbb, 0xef, 0xd3, + 0xa8, 0x06, 0xa7, 0xe8, 0x7d, 0xdb, 0x2a, 0x42, 0xa6, 0xfc, 0x86, 0xf7, + 0x61, 0x10, 0xe4, 0x7a, 0x16, 0xf3, 0x27, 0xd4, 0x9a, 0x87, 0x4b, 0x19, + 0x39, 0xfc, 0xab, 0x93, 0xf0, 0xc6, 0xe6, 0x92, 0xbb, 0xa6, 0x8c, 0xc5, + 0x65, 0x9d, 0x8f, 0xeb, 0xc7, 0x9f, 0xc3, 0x27, 0xec, 0xad, 0x2a, 0x89, + 0xcf, 0xf4, 0x49, 0xe5, 0x81, 0x4a, 0x79, 0x20, 0x33, 0xc4, 0x99, 0x8a, + 0xbc, 0xf5, 0x67, 0x91, 0x99, 0x7c, 0xe7, 0xdb, 0xd6, 0xcd, 0xa9, 0x4b, + 0x8e, 0x6b, 0x94, 0x63, 0x35, 0xbb, 0xea, 0xe5, 0xac, 0xc4, 0x5e, 0x79, + 0x84, 0xfd, 0xa6, 0xb8, 0x3d, 0xbf, 0x78, 0x05, 0x26, 0xcd, 0xa7, 0x2a, + 0x30, 0x6b, 0x95, 0x0d, 0x57, 0xa7, 0x5e, 0xbe, 0x62, 0x5f, 0xed, 0xea, + 0xd6, 0xda, 0x6e, 0x1b, 0x73, 0xed, 0x9b, 0x33, 0x89, 0xdf, 0x69, 0x37, + 0x9b, 0x16, 0x99, 0x26, 0x80, }; -static const unsigned kPreloadedHSTSBits = 333310; +static const unsigned kPreloadedHSTSBits = 333537; -static const unsigned kHSTSRootPosition = 332692; +static const unsigned kHSTSRootPosition = 332919; #endif // NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index 6e5e29b..faea76d 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -3530,7 +3530,7 @@ { "name": "dolphin-hosting.com", "include_subdomains": true, "mode": "force-https" }, { "name": "dolphin-it.de", "include_subdomains": true, "mode": "force-https" }, { "name": "enquos.com", "include_subdomains": true, "mode": "force-https" }, - { "name": "flipagram.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "flipagram.com", "include_subdomains": false, "mode": "force-https" }, { "name": "gravity-net.de", "include_subdomains": true, "mode": "force-https" }, { "name": "gtanda.tk", "include_subdomains": true, "mode": "force-https" }, { "name": "hannover-banditen.de", "include_subdomains": true, "mode": "force-https" },
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc index d79f003..292074ab 100644 --- a/net/spdy/spdy_network_transaction_unittest.cc +++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -346,41 +346,42 @@ session_deps_->socket_factory->AddSSLSocketDataProvider( ssl_provider.get()); - ssl_vector_.push_back(ssl_provider.release()); + ssl_vector_.push_back(std::move(ssl_provider)); session_deps_->socket_factory->AddSocketDataProvider(data); if (test_params_.ssl_type == HTTP_SPDY_VIA_ALT_SVC) { MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); - StaticSocketDataProvider* hanging_non_alt_svc_socket = - new StaticSocketDataProvider(NULL, 0, NULL, 0); + scoped_ptr<StaticSocketDataProvider> hanging_non_alt_svc_socket( + make_scoped_ptr(new StaticSocketDataProvider(NULL, 0, NULL, 0))); hanging_non_alt_svc_socket->set_connect_data(hanging_connect); session_deps_->socket_factory->AddSocketDataProvider( - hanging_non_alt_svc_socket); - alternate_vector_.push_back(hanging_non_alt_svc_socket); + hanging_non_alt_svc_socket.get()); + alternate_vector_.push_back(std::move(hanging_non_alt_svc_socket)); } } void AddDeterministicData(DeterministicSocketData* data) { DCHECK(deterministic_); deterministic_data_vector_.push_back(data); - SSLSocketDataProvider* ssl_provider = - new SSLSocketDataProvider(ASYNC, OK); + scoped_ptr<SSLSocketDataProvider> ssl_provider( + make_scoped_ptr(new SSLSocketDataProvider(ASYNC, OK))); ssl_provider->SetNextProto(test_params_.protocol); ssl_provider->cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); - ssl_vector_.push_back(ssl_provider); session_deps_->deterministic_socket_factory->AddSSLSocketDataProvider( - ssl_provider); + ssl_provider.get()); + ssl_vector_.push_back(std::move(ssl_provider)); session_deps_->deterministic_socket_factory->AddSocketDataProvider(data); if (test_params_.ssl_type == HTTP_SPDY_VIA_ALT_SVC) { MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); - DeterministicSocketData* hanging_non_alt_svc_socket = - new DeterministicSocketData(NULL, 0, NULL, 0); + scoped_ptr<DeterministicSocketData> hanging_non_alt_svc_socket( + make_scoped_ptr(new DeterministicSocketData(NULL, 0, NULL, 0))); hanging_non_alt_svc_socket->set_connect_data(hanging_connect); session_deps_->deterministic_socket_factory->AddSocketDataProvider( - hanging_non_alt_svc_socket); - alternate_deterministic_vector_.push_back(hanging_non_alt_svc_socket); + hanging_non_alt_svc_socket.get()); + alternate_deterministic_vector_.push_back( + std::move(hanging_non_alt_svc_socket)); } } @@ -403,9 +404,10 @@ private: typedef std::vector<SocketDataProvider*> DataVector; typedef std::vector<DeterministicSocketData*> DeterministicDataVector; - typedef ScopedVector<SSLSocketDataProvider> SSLVector; - typedef ScopedVector<SocketDataProvider> AlternateVector; - typedef ScopedVector<DeterministicSocketData> AlternateDeterministicVector; + typedef std::vector<scoped_ptr<SSLSocketDataProvider>> SSLVector; + typedef std::vector<scoped_ptr<SocketDataProvider>> AlternateVector; + typedef std::vector<scoped_ptr<DeterministicSocketData>> + AlternateDeterministicVector; HttpRequestInfo request_; RequestPriority priority_; scoped_ptr<SpdySessionDependencies> session_deps_;
diff --git a/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc b/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc index cf18642..1b29f24a 100644 --- a/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc +++ b/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc
@@ -15,7 +15,6 @@ #include "base/files/file_path.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" -#include "base/memory/scoped_vector.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" @@ -105,7 +104,7 @@ if (!succeeded) { LOG(ERROR) << "Could not initialize backend in " << spec.path.LossyDisplayName(); - return result.Pass(); + return result; } // For the simple cache, the index may not be initialized yet. if (spec.backend_type == net::CACHE_BACKEND_SIMPLE) { @@ -125,12 +124,12 @@ if (!succeeded) { LOG(ERROR) << "Could not initialize Simple Cache in " << spec.path.LossyDisplayName(); - return result.Pass(); + return result; } } DCHECK(backend); result.swap(backend); - return result.Pass(); + return result; } // Parses range lines from /proc/<PID>/smaps, e.g. (anonymous read write): @@ -224,16 +223,15 @@ return total_size; } -bool CacheMemTest(const ScopedVector<CacheSpec>& specs) { - ScopedVector<Backend> backends; - ScopedVector<CacheSpec>::const_iterator it; - for (it = specs.begin(); it != specs.end(); ++it) { - scoped_ptr<Backend> backend = CreateAndInitBackend(**it); +bool CacheMemTest(const std::vector<scoped_ptr<CacheSpec>>& specs) { + std::vector<scoped_ptr<Backend>> backends; + for (const auto& it : specs) { + scoped_ptr<Backend> backend = CreateAndInitBackend(*it); if (!backend) return false; - std::cout << "Number of entries in " << (*it)->path.LossyDisplayName() - << " : " << backend->GetEntryCount() << std::endl; - backends.push_back(backend.release()); + std::cout << "Number of entries in " << it->path.LossyDisplayName() << " : " + << backend->GetEntryCount() << std::endl; + backends.push_back(std::move(backend)); } const uint64 memory_consumption = GetMemoryConsumption(); std::cout << "Private dirty memory: " << memory_consumption << " kB" @@ -254,13 +252,13 @@ } bool ParseAndStoreSpec(const std::string& spec_str, - ScopedVector<CacheSpec>* specs) { + std::vector<scoped_ptr<CacheSpec>>* specs) { scoped_ptr<CacheSpec> spec = CacheSpec::Parse(spec_str); if (!spec) { PrintUsage(&std::cerr); return false; } - specs->push_back(spec.release()); + specs->push_back(std::move(spec)); return true; } @@ -282,7 +280,7 @@ PrintUsage(&std::cerr); return false; } - ScopedVector<CacheSpec> specs; + std::vector<scoped_ptr<CacheSpec>> specs; const std::string spec_str_1 = command_line.GetSwitchValueASCII("spec-1"); if (!ParseAndStoreSpec(spec_str_1, &specs)) return false;
diff --git a/net/url_request/url_request_ftp_job_unittest.cc b/net/url_request/url_request_ftp_job_unittest.cc index 48e70522..f51f033 100644 --- a/net/url_request/url_request_ftp_job_unittest.cc +++ b/net/url_request/url_request_ftp_job_unittest.cc
@@ -4,9 +4,10 @@ #include "net/url_request/url_request_ftp_job.h" +#include <vector> + #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" -#include "base/memory/scoped_vector.h" #include "base/run_loop.h" #include "net/base/host_port_pair.h" #include "net/base/load_states.h" @@ -256,19 +257,19 @@ void AddSocket(MockRead* reads, size_t reads_size, MockWrite* writes, size_t writes_size) { - SequencedSocketData* socket_data = - new SequencedSocketData(reads, reads_size, writes, writes_size); + scoped_ptr<SequencedSocketData> socket_data(make_scoped_ptr( + new SequencedSocketData(reads, reads_size, writes, writes_size))); socket_data->set_connect_data(MockConnect(SYNCHRONOUS, OK)); - socket_factory_.AddSocketDataProvider(socket_data); + socket_factory_.AddSocketDataProvider(socket_data.get()); - socket_data_.push_back(socket_data); + socket_data_.push_back(std::move(socket_data)); } FtpTestURLRequestContext* request_context() { return &request_context_; } TestNetworkDelegate* network_delegate() { return &network_delegate_; } private: - ScopedVector<SequencedSocketData> socket_data_; + std::vector<scoped_ptr<SequencedSocketData>> socket_data_; MockClientSocketFactory socket_factory_; TestNetworkDelegate network_delegate_; MockFtpTransactionFactory ftp_transaction_factory_;
diff --git a/sync/test/fake_server/fake_server.cc b/sync/test/fake_server/fake_server.cc index 19cc2b0..e342e62 100644 --- a/sync/test/fake_server/fake_server.cc +++ b/sync/test/fake_server/fake_server.cc
@@ -160,22 +160,6 @@ return entity.IsDeleted() || entity.IsPermanent(); } -// This is a hack to add the parent ID string if it has not been set inside -// FakeServer::SerializeAsProto (this method only adds the parent ID to the -// proto if FakeServerEntity::RequiresParentId returns true). -// -// In the case where FakeServer::enable_implicit_permanent_folder_creation_ is -// true, we must add the parent ID to the proto. -// -// TODO(pvalenzuela): Remove this when creation of explicit, non-required -// permanent folders is no longer supported. When this feature transition -// happens, these non-required parent IDs will no longer be necessary. -void AddParentIdIfNecessary(const FakeServerEntity& entity, - sync_pb::SyncEntity* entity_proto) { - if (!entity_proto->has_parent_id_string()) - entity_proto->set_parent_id_string(entity.GetParentId()); -} - } // namespace FakeServer::FakeServer() : version_(0), @@ -185,7 +169,6 @@ alternate_triggered_errors_(false), request_counter_(0), network_enabled_(true), - enable_implicit_permanent_folder_creation_(false), weak_ptr_factory_(this) { Init(); } @@ -216,8 +199,7 @@ // Permanent folders are always required for Bookmarks (hierarchical // structure) and Nigori (data stored in permanent root folder). ModelTypeSet permanent_folder_types = - enable_implicit_permanent_folder_creation_ ? - ModelTypeSet(syncer::BOOKMARKS, syncer::NIGORI) : syncer::ProtocolTypes(); + ModelTypeSet(syncer::BOOKMARKS, syncer::NIGORI); for (ModelTypeSet::Iterator it = permanent_folder_types.First(); it.Good(); it.Inc()) { @@ -362,8 +344,6 @@ if (sieve->ClientWantsItem(entity)) { sync_pb::SyncEntity* response_entity = response->add_entries(); entity.SerializeAsProto(response_entity); - if (!enable_implicit_permanent_folder_creation_) - AddParentIdIfNecessary(entity, response_entity); max_response_version = std::max(max_response_version, response_entity->version()); @@ -564,8 +544,6 @@ if (!IsDeletedOrPermanent(entity) && entity.GetModelType() == model_type) { sync_pb::SyncEntity sync_entity; entity.SerializeAsProto(&sync_entity); - if (!enable_implicit_permanent_folder_creation_) - AddParentIdIfNecessary(entity, &sync_entity); sync_entities.push_back(sync_entity); } } @@ -723,10 +701,6 @@ return ""; } -void FakeServer::EnableImplicitPermanentFolderCreation() { - enable_implicit_permanent_folder_creation_ = true; -} - base::WeakPtr<FakeServer> FakeServer::AsWeakPtr() { DCHECK(thread_checker_.CalledOnValidThread()); return weak_ptr_factory_.GetWeakPtr();
diff --git a/sync/test/fake_server/fake_server.h b/sync/test/fake_server/fake_server.h index f7ad139..87bc2a4 100644 --- a/sync/test/fake_server/fake_server.h +++ b/sync/test/fake_server/fake_server.h
@@ -138,13 +138,6 @@ // Returns the entity ID of the Bookmark Bar folder. std::string GetBookmarkBarFolderId() const; - // Instructs the server to not create explicit permanent folders. - // This method should be called before syncing begins. - // - // TODO(pvalenzuela): Remove this method when this feature becomes the - // default in the real sync server. - void EnableImplicitPermanentFolderCreation(); - // Returns the current FakeServer as a WeakPtr. base::WeakPtr<FakeServer> AsWeakPtr(); @@ -252,15 +245,6 @@ // on every request. This is used to simulate a network failure on the client. bool network_enabled_; - // Whether the implicit permanent folder feature should be enabled. When true, - // permanent folders are only created for the required types (Bookmarks and - // Nigori). When false, permanent folders are created for all types. The plan - // (as of late 2015) is to migrate the real sync server to use this feature. - // - // TODO(pvalenzuela): Remove this boolean and make this behavior the default - // when it becomes normal operation in the real server. - bool enable_implicit_permanent_folder_creation_; - // Used to verify that FakeServer is only used from one thread. base::ThreadChecker thread_checker_;
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index c62a3fe..26ea077 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -23,6 +23,112 @@ "system_webview_apk" ] }, + "Android Swarm Builder": { + "gtest_tests": [ + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "base_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "breakpad_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "components_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "content_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "device_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "events_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "gl_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "gl_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "gpu_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "ipc_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "media_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "net_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "sql_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "ui_android_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "ui_base_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "ui_touch_selection_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "unit_tests" + } + ] + }, "Jelly Bean Tester": { "gtest_tests": [ {
diff --git a/testing/scripts/run_telemetry_benchmark_as_googletest.py b/testing/scripts/run_telemetry_benchmark_as_googletest.py index 5715422..39af8f0 100755 --- a/testing/scripts/run_telemetry_benchmark_as_googletest.py +++ b/testing/scripts/run_telemetry_benchmark_as_googletest.py
@@ -80,6 +80,9 @@ if not valid and not failures: failures = ['(entire test suite)'] + if rc == 0: + rc = 1 # Signal an abnormal exit. + json.dump({ 'valid': valid, 'failures': failures,
diff --git a/third_party/WebKit/LayoutTests/editing/selection/addRange-failures-expected.txt b/third_party/WebKit/LayoutTests/editing/selection/addRange-failures-expected.txt index eb41f634..f2e832d 100644 --- a/third_party/WebKit/LayoutTests/editing/selection/addRange-failures-expected.txt +++ b/third_party/WebKit/LayoutTests/editing/selection/addRange-failures-expected.txt
@@ -1,4 +1,3 @@ -CONSOLE ERROR: The given range is null. CONSOLE WARNING: 'Range.detach' is now a no-op, as per DOM (https://dom.spec.whatwg.org/#dom-range-detach). CONSOLE ERROR: Discontiguous selection is not supported. CONSOLE ERROR: The given range isn't in document. @@ -10,6 +9,7 @@ Running: testNull +PASS selection.addRange(null) threw exception TypeError: Failed to execute 'addRange' on 'Selection': parameter 1 is not of type 'Range'.. PASS selection.rangeCount is 1 PASS selection.getRangeAt(0).startContainer === document.body is true PASS selection.getRangeAt(0).startOffset is 0
diff --git a/third_party/WebKit/LayoutTests/editing/selection/addRange-failures.html b/third_party/WebKit/LayoutTests/editing/selection/addRange-failures.html index 998e207..42d0ad4 100644 --- a/third_party/WebKit/LayoutTests/editing/selection/addRange-failures.html +++ b/third_party/WebKit/LayoutTests/editing/selection/addRange-failures.html
@@ -12,7 +12,7 @@ function testNull() { - selection.addRange(null); + shouldThrow('selection.addRange(null)'); } function testDetachedRange()
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLImageElement/images/green-2x2.png b/third_party/WebKit/LayoutTests/fast/dom/HTMLImageElement/images/green-2x2.png new file mode 100644 index 0000000..adc0594 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/dom/HTMLImageElement/images/green-2x2.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLImageElement/relevant-mutations.html b/third_party/WebKit/LayoutTests/fast/dom/HTMLImageElement/relevant-mutations.html new file mode 100644 index 0000000..97d16b9e --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/dom/HTMLImageElement/relevant-mutations.html
@@ -0,0 +1,386 @@ +<!doctype html> +<!-- TODO(yoav): this test is imported from web-platform-tests, but is here due to crbug.com/498120 --> +<title>img relevant mutations</title> +<script src="../../../resources/testharness.js"></script> +<script src="../../../resources/testharnessreport.js"></script> +<div id=log></div> + +<!-- should invoke update the image data --> + +<img data-desc="src set"> +<img src="images/green-2x2.png" data-desc="src changed"> +<img src="images/green-2x2.png" data-desc="src removed"> + +<img data-desc="srcset set"> +<img srcset="images/green-2x2.png" data-desc="srcset changed"> +<img srcset="images/green-2x2.png" data-desc="srcset removed"> + +<img data-desc="sizes set"> +<img sizes="" data-desc="sizes changed"> +<img sizes="" data-desc="sizes removed"> + +<img src="images/green-2x2.png" data-desc="src set to same value"> + +<img data-desc="crossorigin absent to empty"> +<img data-desc="crossorigin absent to anonymous"> +<img data-desc="crossorigin absent to use-credentials"> +<img crossorigin data-desc="crossorigin empty to absent"> +<img crossorigin data-desc="crossorigin empty to use-credentials"> +<img crossorigin=anonymous data-desc="crossorigin anonymous to absent"> +<img crossorigin=anonymous data-desc="crossorigin anonymous to use-credentials"> +<img crossorigin=use-credentials data-desc="crossorigin use-credentials to absent"> +<img crossorigin=use-credentials data-desc="crossorigin use-credentials to empty"> +<img crossorigin=use-credentials data-desc="crossorigin use-credentials to anonymous"> + +<img src="images/green-2x2.png" data-desc="inserted into picture"><picture></picture> + +<picture><img src="images/green-2x2.png" data-desc="removed from picture"></picture> + +<picture><img src="images/green-2x2.png" data-desc="parent is picture, previous source inserted"></picture> + +<picture><source><img src="images/green-2x2.png" data-desc="parent is picture, previous source removed"></picture> + +<picture><source><img src="images/green-2x2.png" data-desc="parent is picture, previous source has srcset set"></picture> +<picture><source srcset=""><img src="images/green-2x2.png" data-desc="parent is picture, previous source has srcset changed"></picture> +<picture><source srcset=""><img src="images/green-2x2.png" data-desc="parent is picture, previous source has srcset removed"></picture> + +<picture><source><img src="images/green-2x2.png" data-desc="parent is picture, previous source has sizes set"></picture> +<picture><source sizes=""><img src="images/green-2x2.png" data-desc="parent is picture, previous source has sizes changed"></picture> +<picture><source sizes=""><img src="images/green-2x2.png" data-desc="parent is picture, previous source has sizes removed"></picture> + +<picture><source><img src="images/green-2x2.png" data-desc="parent is picture, previous source has media set"></picture> +<picture><source media=""><img src="images/green-2x2.png" data-desc="parent is picture, previous source has media changed"></picture> +<picture><source media=""><img src="images/green-2x2.png" data-desc="parent is picture, previous source has media removed"></picture> + +<picture><source><img src="images/green-2x2.png" data-desc="parent is picture, previous source has type set"></picture> +<picture><source type=""><img src="images/green-2x2.png" data-desc="parent is picture, previous source has type changed"></picture> +<picture><source type=""><img src="images/green-2x2.png" data-desc="parent is picture, previous source has type removed"></picture> + +<!-- should not invoke update the image data --> + +<img srcset="images/green-2x2.png" data-desc="srcset is set to same value"> +<img srcset="images/green-2x2.png" sizes data-desc="sizes is set to same value"> + +<img src="images/green-2x2.png" data-desc="crossorigin state not changed: absent, removeAttribute"> +<img src="images/green-2x2.png" crossorigin data-desc="crossorigin state not changed: empty to anonymous"> +<img src="images/green-2x2.png" crossorigin=anonymous data-desc="crossorigin state not changed: anonymous to foobar"> +<img src="images/green-2x2.png" crossorigin=use-credentials data-desc="crossorigin state not changed: use-credentials to USE-CREDENTIALS"> + +<img src="images/green-2x2.png" data-desc="inserted into picture ancestor"><picture><span></span></picture> +<picture><span><img src="images/green-2x2.png" data-desc="removed from picture ancestor"></span></picture> + +<picture><span><img src="images/green-2x2.png" data-desc="ancestor picture has a source inserted"></span></picture> +<picture><source><span><img src="images/green-2x2.png" data-desc="ancestor picture has a source removed"></span></picture> + +<picture><span><img src="images/green-2x2.png" data-desc="ancestor picture; previous sibling source inserted"></span></picture> +<picture><span><source><img src="images/green-2x2.png" data-desc="ancestor picture; previous sibling source removed"></span></picture> + +<picture><img src="images/green-2x2.png" data-desc="parent is picture, following sibling source inserted"></picture> +<picture><img src="images/green-2x2.png" data-desc="parent is picture, following sibling source removed"><source></picture> + +<picture><img src="images/green-2x2.png" data-desc="parent is picture, following sibling source has srcset set"><source></picture> + +<img src="images/green-2x2.png" data-desc="media on img set"> +<img src="images/green-2x2.png" data-desc="type on img set"> +<img src="images/green-2x2.png" data-desc="class on img set"> +<img src="images/green-2x2.png" data-desc="alt on img set"> + +<picture><source><img src="images/green-2x2.png" data-desc="src on previous sibling source set"></picture> +<picture><source><img src="images/green-2x2.png" data-desc="class on previous sibling source set"></picture> + +<img src="images/green-2x2.png" data-desc="inserted/removed children of img"> + +<picture><img src="images/green-2x2.png" data-desc="picture is inserted"></picture><span></span> +<picture><img src="images/green-2x2.png" data-desc="picture is removed"></picture> + +<picture><img src="images/green-2x2.png" data-desc="parent is picture, following img inserted"></picture> +<picture><img src="images/green-2x2.png" data-desc="parent is picture, following img removed"><img></picture> +<picture><img src="images/green-2x2.png" data-desc="parent is picture, following img has src set"><img></picture> +<picture><img src="images/green-2x2.png" data-desc="parent is picture, following img has srcset set"><img></picture> +<picture><img src="images/green-2x2.png" data-desc="parent is picture, following img has sizes set"><img></picture> + + +<script> +setup({explicit_done:true}); + +function t(desc, func, expect) { + async_test(function() { + var img = document.querySelector('[data-desc="' + desc + '"]'); + img.onload = img.onerror = this.unreached_func('update the image data was run'); + if (expect == 'timeout') { + setTimeout(this.step_func_done(), 1000); + } else { + img['on' + expect] = this.step_func_done(function() {}); + } + func.call(this, img); + }, desc); +} + +onload = function() { + + t('src set', function(img) { + img.src = 'images/green-2x2.png'; + }, 'load'); + + t('src changed', function(img) { + img.src = 'images/green-2x2.png '; + }, 'load'); + + t('src removed', function(img) { + img.removeAttribute('src'); + }, 'timeout'); + + t('srcset set', function(img) { + img.srcset = 'images/green-2x2.png'; + }, 'load'); + + t('srcset changed', function(img) { + img.srcset = 'images/green-2x2.png '; + }, 'load'); + + t('srcset removed', function(img) { + img.removeAttribute('srcset'); + }, 'timeout'); + + t('sizes set', function(img) { + img.sizes = ''; + }, 'timeout'); + + t('sizes changed', function(img) { + img.sizes = ' '; + }, 'timeout'); + + t('sizes removed', function(img) { + img.removeAttribute('sizes'); + }, 'timeout'); + + t('src set to same value', function(img) { + img.src = 'images/green-2x2.png'; + }, 'load'); + + t('crossorigin absent to empty', function(img) { + img.crossOrigin = ''; + }, 'timeout'); + + t('crossorigin absent to anonymous', function(img) { + img.crossOrigin = 'anonymous'; + }, 'timeout'); + + t('crossorigin absent to use-credentials', function(img) { + img.crossOrigin = 'use-credentials'; + }, 'timeout'); + + t('crossorigin empty to absent', function(img) { + img.removeAttribute('crossorigin'); + }, 'timeout'); + + t('crossorigin empty to use-credentials', function(img) { + img.crossOrigin = 'use-credentials'; + }, 'timeout'); + + t('crossorigin anonymous to absent', function(img) { + img.removeAttribute('crossorigin'); + }, 'timeout'); + + t('crossorigin anonymous to use-credentials', function(img) { + img.crossOrigin = 'use-credentials'; + }, 'timeout'); + + t('crossorigin use-credentials to absent', function(img) { + img.removeAttribute('crossorigin'); + }, 'timeout'); + + t('crossorigin use-credentials to empty', function(img) { + img.crossOrigin = ''; + }, 'timeout'); + + t('crossorigin use-credentials to anonymous', function(img) { + img.crossOrigin = 'anonymous'; + }, 'timeout'); + + t('inserted into picture', function(img) { + img.nextSibling.appendChild(img); + }, 'load'); + + t('removed from picture', function(img) { + img.parentNode.removeChild(img); + }, 'load'); + + t('parent is picture, previous source inserted', function(img) { + img.parentNode.insertBefore(document.createElement('source'), img); + }, 'load'); + + t('parent is picture, previous source removed', function(img) { + img.parentNode.removeChild(img.previousSibling); + }, 'load'); + + t('parent is picture, previous source has srcset set', function(img) { + img.previousSibling.srcset = ''; + }, 'load'); + + t('parent is picture, previous source has srcset changed', function(img) { + img.previousSibling.srcset = ' '; + }, 'load'); + + t('parent is picture, previous source has srcset removed', function(img) { + img.previousSibling.removeAttribute('srcset'); + }, 'load'); + + t('parent is picture, previous source has sizes set', function(img) { + img.previousSibling.sizes = ''; + }, 'load'); + + t('parent is picture, previous source has sizes changed', function(img) { + img.previousSibling.sizes = ' '; + }, 'load'); + + t('parent is picture, previous source has sizes removed', function(img) { + img.previousSibling.removeAttribute('sizes'); + }, 'load'); + + t('parent is picture, previous source has media set', function(img) { + img.previousSibling.media = ''; + }, 'load'); + + t('parent is picture, previous source has media changed', function(img) { + img.previousSibling.media = ' '; + }, 'load'); + + t('parent is picture, previous source has media removed', function(img) { + img.previousSibling.removeAttribute('media'); + }, 'load'); + + t('parent is picture, previous source has type set', function(img) { + img.previousSibling.type = ''; + }, 'load'); + + t('parent is picture, previous source has type changed', function(img) { + img.previousSibling.type = ' '; + }, 'load'); + + t('parent is picture, previous source has type removed', function(img) { + img.previousSibling.removeAttribute('type'); + }, 'load'); + + t('srcset is set to same value', function(img) { + img.srcset = "images/green-2x2.png"; + }, 'timeout'); + + t('sizes is set to same value', function(img) { + img.sizes = ''; + }, 'timeout'); + + t('crossorigin state not changed: absent, removeAttribute', function(img) { + img.removeAttribute('crossorigin'); + }, 'timeout'); + + t('crossorigin state not changed: empty to anonymous', function(img) { + img.crossOrigin = 'anonymous'; + }, 'timeout'); + + t('crossorigin state not changed: anonymous to foobar', function(img) { + img.crossOrigin = 'foobar'; + }, 'timeout'); + + t('crossorigin state not changed: use-credentials to USE-CREDENTIALS', function(img) { + img.crossOrigin = 'USE-CREDENTIALS'; + }, 'timeout'); + + t('inserted into picture ancestor', function(img) { + img.nextSibling.firstChild.appendChild(img); + }, 'timeout'); + + t('removed from picture ancestor', function(img) { + img.parentNode.removeChild(img); + }, 'timeout'); + + t('ancestor picture has a source inserted', function(img) { + img.parentNode.parentNode.insertBefore(document.createElement('source'), img.parentNode); + }, 'timeout'); + + t('ancestor picture has a source removed', function(img) { + img.parentNode.parentNode.removeChild(img.parentNode.previousSibling); + }, 'timeout'); + + t('ancestor picture; previous sibling source inserted', function(img) { + img.parentNode.insertBefore(document.createElement('source'), img); + }, 'timeout'); + + t('ancestor picture; previous sibling source removed', function(img) { + img.parentNode.removeChild(img.previousSibling); + }, 'timeout'); + + t('parent is picture, following sibling source inserted', function(img) { + img.parentNode.appendChild(document.createElement('source')); + }, 'timeout'); + + t('parent is picture, following sibling source removed', function(img) { + img.parentNode.removeChild(img.nextSibling); + }, 'timeout'); + + t('parent is picture, following sibling source has srcset set', function(img) { + img.nextSibling.srcset = ''; + }, 'timeout'); + + t('media on img set', function(img) { + img.setAttribute('media', ''); + }, 'timeout'); + + t('type on img set', function(img) { + img.setAttribute('type', ''); + }, 'timeout'); + + t('class on img set', function(img) { + img.className = ''; + }, 'timeout'); + + t('alt on img set', function(img) { + img.alt = ''; + }, 'timeout'); + + t('src on previous sibling source set', function(img) { + img.previousSibling.setAttribute('src', ''); + }, 'timeout'); + + t('class on previous sibling source set', function(img) { + img.previousSibling.className = ''; + }, 'timeout'); + + t('inserted/removed children of img', function(img) { + img.appendChild(document.createElement('source')); + setTimeout(this.step_func(function() { + img.removeChild(img.firstChild); + }), 0); + }, 'timeout'); + + t('picture is inserted', function(img) { + img.parentNode.nextSibling.appendChild(img.parentNode); + }, 'timeout'); + + t('picture is removed', function(img) { + img.parentNode.parentNode.removeChild(img.parentNode); + }, 'timeout'); + + t('parent is picture, following img inserted', function(img) { + img.parentNode.appendChild(document.createElement('img')); + }, 'timeout'); + + t('parent is picture, following img removed', function(img) { + img.parentNode.removeChild(img.nextSibling); + }, 'timeout'); + + t('parent is picture, following img has src set', function(img) { + img.nextSibling.src = ''; + }, 'timeout'); + + t('parent is picture, following img has srcset set', function(img) { + img.nextSibling.srcset = ''; + }, 'timeout'); + + t('parent is picture, following img has sizes set', function(img) { + img.nextSibling.sizes = ''; + }, 'timeout'); + + done(); +}; +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/option-text-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/option-text-expected.txt deleted file mode 100644 index d34a2cd..0000000 --- a/third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/option-text-expected.txt +++ /dev/null
@@ -1,9 +0,0 @@ -Test for the text attribute of HTMLOptionElement. To match other browsers, the attribute value is the text as displayed in the list box or popup, rather than strictly “the text contained within the option element” as specified. - - -PASS: got "foo" as expected. -PASS: got "foo" as expected. -PASS: got "¥" as expected. -PASS: got "foo bar" as expected. -PASS: got "label" as expected. -
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/named-options.html b/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/named-options.html deleted file mode 100644 index 67d780c..0000000 --- a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/named-options.html +++ /dev/null
@@ -1,9 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> -<html> -<head> -<script src="../../../resources/js-test.js"></script> -</head> -<body> -<script src="script-tests/named-options.js"></script> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/script-tests/TEMPLATE.html b/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/script-tests/TEMPLATE.html deleted file mode 100644 index a44cea6a..0000000 --- a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/script-tests/TEMPLATE.html +++ /dev/null
@@ -1,9 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> -<html> -<head> -<script src="../../../resources/js-test.js"></script> -</head> -<body> -<script src="YOUR_JS_FILE_HERE"></script> -</body> -</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/change-multiple-preserve-selection-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/change-multiple-preserve-selection-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection.html b/third_party/WebKit/LayoutTests/fast/forms/select/change-multiple-preserve-selection.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection.html rename to third_party/WebKit/LayoutTests/fast/forms/select/change-multiple-preserve-selection.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/click-size-zero-no-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/click-size-zero-no-crash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/click-size-zero-no-crash-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/click-size-zero-no-crash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/click-size-zero-no-crash.html b/third_party/WebKit/LayoutTests/fast/forms/select/click-size-zero-no-crash.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/click-size-zero-no-crash.html rename to third_party/WebKit/LayoutTests/fast/forms/select/click-size-zero-no-crash.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/collection-setter-getter-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/collection-setter-getter-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter.html b/third_party/WebKit/LayoutTests/fast/forms/select/collection-setter-getter.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter.html rename to third_party/WebKit/LayoutTests/fast/forms/select/collection-setter-getter.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/exceptions-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/exceptions-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/exceptions-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/exceptions-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/exceptions.html b/third_party/WebKit/LayoutTests/fast/forms/select/exceptions.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/exceptions.html rename to third_party/WebKit/LayoutTests/fast/forms/select/exceptions.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/length-not-overridden-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/length-not-overridden-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/length-not-overridden-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/length-not-overridden-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/length-not-overridden.html b/third_party/WebKit/LayoutTests/fast/forms/select/length-not-overridden.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/length-not-overridden.html rename to third_party/WebKit/LayoutTests/fast/forms/select/length-not-overridden.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/listbox-select-reset-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/listbox-select-reset-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/listbox-select-reset-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/listbox-select-reset-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/listbox-select-reset.html b/third_party/WebKit/LayoutTests/fast/forms/select/listbox-select-reset.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/listbox-select-reset.html rename to third_party/WebKit/LayoutTests/fast/forms/select/listbox-select-reset.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/named-options-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/named-options-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/named-options-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/named-options-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/script-tests/named-options.js b/third_party/WebKit/LayoutTests/fast/forms/select/named-options.html similarity index 90% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/script-tests/named-options.js rename to third_party/WebKit/LayoutTests/fast/forms/select/named-options.html index b52a120..c344319 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/script-tests/named-options.js +++ b/third_party/WebKit/LayoutTests/fast/forms/select/named-options.html
@@ -1,3 +1,10 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> +<head> +<script src="../../../resources/js-test.js"></script> +</head> +<body> +<script> description("This tests that option elements are accessible using namedItem from both HTMLSelectElement and HTMLOptionsCollection as well as using the getter from the HTMLOptionsCollection"); var select1 = document.createElement("select"); @@ -30,3 +37,6 @@ // Clean up after ourselves document.body.removeChild(select1); document.body.removeChild(select2); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/option-add-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/option-add-crash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/option-add-crash-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/option-add-crash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/option-add-crash.html b/third_party/WebKit/LayoutTests/fast/forms/select/option-add-crash.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/option-add-crash.html rename to third_party/WebKit/LayoutTests/fast/forms/select/option-add-crash.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/option-prototype-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/option-prototype-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/option-prototype-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/option-prototype-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/option-prototype.html b/third_party/WebKit/LayoutTests/fast/forms/select/option-prototype.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/option-prototype.html rename to third_party/WebKit/LayoutTests/fast/forms/select/option-prototype.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/options-collection-detached-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/options-collection-detached-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/options-collection-detached-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/options-collection-detached-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/options-collection-detached.html b/third_party/WebKit/LayoutTests/fast/forms/select/options-collection-detached.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/options-collection-detached.html rename to third_party/WebKit/LayoutTests/fast/forms/select/options-collection-detached.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/options-collection-set-string-length-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/options-collection-set-string-length-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/options-collection-set-string-length-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/options-collection-set-string-length-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/options-collection-set-string-length.html b/third_party/WebKit/LayoutTests/fast/forms/select/options-collection-set-string-length.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/options-collection-set-string-length.html rename to third_party/WebKit/LayoutTests/fast/forms/select/options-collection-set-string-length.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/remove-element-from-within-focus-handler-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/remove-element-from-within-focus-handler-crash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/remove-element-from-within-focus-handler-crash-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/remove-element-from-within-focus-handler-crash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/remove-element-from-within-focus-handler-crash.html b/third_party/WebKit/LayoutTests/fast/forms/select/remove-element-from-within-focus-handler-crash.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/remove-element-from-within-focus-handler-crash.html rename to third_party/WebKit/LayoutTests/fast/forms/select/remove-element-from-within-focus-handler-crash.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/remove-option.html b/third_party/WebKit/LayoutTests/fast/forms/select/remove-option.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/remove-option.html rename to third_party/WebKit/LayoutTests/fast/forms/select/remove-option.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-element-item-argument-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/select-element-item-argument-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-element-item-argument-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/select-element-item-argument-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-element-item-argument.html b/third_party/WebKit/LayoutTests/fast/forms/select/select-element-item-argument.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-element-item-argument.html rename to third_party/WebKit/LayoutTests/fast/forms/select/select-element-item-argument.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-bug-12942-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-bug-12942-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-bug-12942-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-bug-12942-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-bug-12942.html b/third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-bug-12942.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-bug-12942.html rename to third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-bug-12942.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-multiple-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-multiple-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-multiple-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-multiple-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-multiple.html b/third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-multiple.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-multiple.html rename to third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-multiple.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-noAnchorIndex-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-noAnchorIndex-crash-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-noAnchorIndex-crash-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-noAnchorIndex-crash-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-noAnchorIndex-crash.html b/third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-noAnchorIndex-crash.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex-noAnchorIndex-crash.html rename to third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex-noAnchorIndex-crash.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex.html b/third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedIndex.html rename to third_party/WebKit/LayoutTests/fast/forms/select/select-selectedIndex.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedOptions-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/select-selectedOptions-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedOptions-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/select-selectedOptions-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedOptions.html b/third_party/WebKit/LayoutTests/fast/forms/select/select-selectedOptions.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/select-selectedOptions.html rename to third_party/WebKit/LayoutTests/fast/forms/select/select-selectedOptions.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/selected-false-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/selected-false-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/selected-false-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/selected-false-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/selected-false.html b/third_party/WebKit/LayoutTests/fast/forms/select/selected-false.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/selected-false.html rename to third_party/WebKit/LayoutTests/fast/forms/select/selected-false.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/selected-index-preserved-when-option-text-changes-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/selected-index-preserved-when-option-text-changes-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes.html b/third_party/WebKit/LayoutTests/fast/forms/select/selected-index-preserved-when-option-text-changes.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes.html rename to third_party/WebKit/LayoutTests/fast/forms/select/selected-index-preserved-when-option-text-changes.html
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/set-option-index-text-expected.txt b/third_party/WebKit/LayoutTests/fast/forms/select/set-option-index-text-expected.txt similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/set-option-index-text-expected.txt rename to third_party/WebKit/LayoutTests/fast/forms/select/set-option-index-text-expected.txt
diff --git a/third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/set-option-index-text.html b/third_party/WebKit/LayoutTests/fast/forms/select/set-option-index-text.html similarity index 100% rename from third_party/WebKit/LayoutTests/fast/dom/HTMLOptionElement/set-option-index-text.html rename to third_party/WebKit/LayoutTests/fast/forms/select/set-option-index-text.html
diff --git a/third_party/WebKit/LayoutTests/fast/speechsynthesis/speech-synthesis-speak-invalid-argument-throws-expected.txt b/third_party/WebKit/LayoutTests/fast/speechsynthesis/speech-synthesis-speak-invalid-argument-throws-expected.txt index 6f6d098..1533b8f 100644 --- a/third_party/WebKit/LayoutTests/fast/speechsynthesis/speech-synthesis-speak-invalid-argument-throws-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/speechsynthesis/speech-synthesis-speak-invalid-argument-throws-expected.txt
@@ -4,11 +4,11 @@ PASS speechSynthesis.speak() threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': 1 argument required, but only 0 present.. -PASS speechSynthesis.speak(0) threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': Invalid utterance argument. -PASS speechSynthesis.speak('') threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': Invalid utterance argument. -PASS speechSynthesis.speak(document.body) threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': Invalid utterance argument. -PASS speechSynthesis.speak({}) threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': Invalid utterance argument. -PASS speechSynthesis.speak((new SpeechSynthesisUtterance()).text = 'hello') threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': Invalid utterance argument. +PASS speechSynthesis.speak(0) threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': parameter 1 is not of type 'SpeechSynthesisUtterance'.. +PASS speechSynthesis.speak('') threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': parameter 1 is not of type 'SpeechSynthesisUtterance'.. +PASS speechSynthesis.speak(document.body) threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': parameter 1 is not of type 'SpeechSynthesisUtterance'.. +PASS speechSynthesis.speak({}) threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': parameter 1 is not of type 'SpeechSynthesisUtterance'.. +PASS speechSynthesis.speak((new SpeechSynthesisUtterance()).text = 'hello') threw exception TypeError: Failed to execute 'speak' on 'SpeechSynthesis': parameter 1 is not of type 'SpeechSynthesisUtterance'.. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/fast/speechsynthesis/speech-synthesis-speak-invalid-argument-throws.html b/third_party/WebKit/LayoutTests/fast/speechsynthesis/speech-synthesis-speak-invalid-argument-throws.html index 8ee0a79..5c7fad05 100644 --- a/third_party/WebKit/LayoutTests/fast/speechsynthesis/speech-synthesis-speak-invalid-argument-throws.html +++ b/third_party/WebKit/LayoutTests/fast/speechsynthesis/speech-synthesis-speak-invalid-argument-throws.html
@@ -14,12 +14,12 @@ description("This tests that passing an argument other than a SpeechSynthesisUtterance to speechSynthesis.speak throws a TypeError exception."); - shouldThrow("speechSynthesis.speak()", '"TypeError: Failed to execute \'speak\' on \'SpeechSynthesis\': 1 argument required, but only 0 present."'); - shouldThrow("speechSynthesis.speak(0)", '"TypeError: Failed to execute \'speak\' on \'SpeechSynthesis\': Invalid utterance argument"'); - shouldThrow("speechSynthesis.speak('')", '"TypeError: Failed to execute \'speak\' on \'SpeechSynthesis\': Invalid utterance argument"'); - shouldThrow("speechSynthesis.speak(document.body)", '"TypeError: Failed to execute \'speak\' on \'SpeechSynthesis\': Invalid utterance argument"'); - shouldThrow("speechSynthesis.speak({})", '"TypeError: Failed to execute \'speak\' on \'SpeechSynthesis\': Invalid utterance argument"'); - shouldThrow("speechSynthesis.speak((new SpeechSynthesisUtterance()).text = 'hello')", '"TypeError: Failed to execute \'speak\' on \'SpeechSynthesis\': Invalid utterance argument"'); + shouldThrow("speechSynthesis.speak()"); + shouldThrow("speechSynthesis.speak(0)"); + shouldThrow("speechSynthesis.speak('')"); + shouldThrow("speechSynthesis.speak(document.body)"); + shouldThrow("speechSynthesis.speak({})"); + shouldThrow("speechSynthesis.speak((new SpeechSynthesisUtterance()).text = 'hello')"); </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/TEMPLATE-window.html b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/TEMPLATE-window.html index f37bb6ce..b003df5 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/TEMPLATE-window.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/TEMPLATE-window.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/body-mixin.js b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/body-mixin.js index 491f4b9..b02f9b3 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/body-mixin.js +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/body-mixin.js
@@ -1,15 +1,6 @@ if (self.importScripts) { importScripts('../resources/fetch-test-helpers.js'); -} - -function readStream(reader, values) { - reader.read().then(function(r) { - if (!r.done) { - values.push(r.value); - readStream(reader, values); - } - }); - return reader.closed; + importScripts('/streams/resources/rs-utils.js'); } function isLocked(stream) { @@ -35,14 +26,13 @@ }, 'FetchTextAfterAccessingStreamTest'); promise_test(function(test) { - var chunks = []; var actual = ''; return fetch('/fetch/resources/doctype.html') .then(function(response) { r = response; - return readStream(response.body.getReader(), chunks); + return readableStreamToArray(response.body); }) - .then(function() { + .then(function(chunks) { var decoder = new TextDecoder(); for (var chunk of chunks) { actual += decoder.decode(chunk, {stream: true});
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/response.js b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/response.js index 1590a09b..7180ef73f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/response.js +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/response.js
@@ -1,19 +1,6 @@ if (self.importScripts) { importScripts('../resources/fetch-test-helpers.js'); -} - -function consume(reader) { - var chunks = []; - function rec(reader) { - return reader.read().then(function(r) { - if (r.done) { - return chunks; - } - chunks.push(r.value); - return rec(reader); - }); - } - return rec(reader); + importScripts('/streams/resources/rs-utils.js'); } function decode(chunks) { @@ -294,12 +281,12 @@ assert_not_equals(res.body, clone.body); assert_not_equals(body, clone.body); assert_throws({name: 'TypeError'}, function() { body.getReader(); }); - var reader1 = res.body.getReader(); - var reader2 = clone.body.getReader(); - return Promise.all([consume(reader1), consume(reader2)]).then(function(r) { - assert_equals(decode(r[0]), 'hello'); - assert_equals(decode(r[1]), 'hello'); - }); + return Promise.all( + [readableStreamToArray(res.body), readableStreamToArray(clone.body)]) + .then(r => { + assert_equals(decode(r[0]), 'hello'); + assert_equals(decode(r[1]), 'hello'); + }); }, 'Clone on Response (manual read)'); test(() => {
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/stream-reader.js b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/stream-reader.js index 562782c..5ffd8d9d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/stream-reader.js +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/stream-reader.js
@@ -1,20 +1,6 @@ if (self.importScripts) { importScripts('/fetch/resources/fetch-test-helpers.js'); -} - -function read_until_end(reader) { - var chunks = []; - function consume() { - return reader.read().then(function(r) { - if (r.done) { - return chunks; - } else { - chunks.push(r.value); - return consume(); - } - }); - } - return consume(); + importScripts('/streams/resources/rs-utils.js'); } promise_test(function(t) { @@ -31,7 +17,7 @@ promise_test(function(t) { return fetch('/fetch/resources/doctype.html').then(function(res) { var reader = res.body.getReader(); - return read_until_end(reader); + return readableStreamToArray(res.body, reader); }).then(function(chunks) { var size = 0; for (var chunk of chunks) {
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-base-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-base-https.html index a6938b7..05a0e4f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-base-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-base-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-nocors-base-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-nocors-base-https.html index 42944af0..99ee6014d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-nocors-base-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/block-mixed-content-nocors-base-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin-base-https-other-https.html index 35cf3c2..b03e0a0 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin.html index 7b422e9..379469b2 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/body-mixin.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override-base-https-other-https.html index a6f99603..dbabea9 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override.html index 5e13e7d..a79e5b4 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/cache-override.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch-base-https-other-https.html index 2876d72..1d77fe2f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch.html index 44741f6d..8acea7b 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/fetch.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-base-https-other-https.html index 1178d88..0cfe944 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-other-https.html index ac4701d..65b4f742 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response.html index 2f2a091..a5c70d8 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/filtered-response.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-base-https-other-https.html index c7525d2..a8032d7 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard-base-https-other-https.html index 4896b6cf..38d4d39 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard.html index 35a0043..657261f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers-guard.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers.html index ef85b89..8dfc3adf 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/headers.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer-base-https-other-https.html index 34f8724..7d2cbaa 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer.html index 509c80d..1c92caf 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/referrer.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/request-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/request-base-https-other-https.html index 3a05fbe2..6276b9c 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/request-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/request-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/request.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/request.html index 02cab055..1740e4ba 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/request.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/request.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-base-https-other-https.html index f87eae0..4847485 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content-base-https-other-https.html index 574f2b1d..f02a630 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content.html index c2ef606a..28aa5f3 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response-content.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response.html index 96fffcf..69d6b371 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/response.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/response.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader-base-https-other-https.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader-base-https-other-https.html index a298875..234590ca 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader-base-https-other-https.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader-base-https-other-https.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader.html b/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader.html index 6491022c..2dd90c1 100644 --- a/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader.html +++ b/third_party/WebKit/LayoutTests/http/tests/fetch/window/stream-reader.html
@@ -7,6 +7,7 @@ <script src = "/serviceworker/resources/test-helpers.js"></script> <script src = "../resources/fetch-test-options.js"></script> <script src = "../resources/fetch-test-helpers.js"></script> +<script src = "/streams/resources/rs-utils.js"></script> </head> <body> <script>
diff --git a/third_party/WebKit/LayoutTests/inspector/animation/animation-timeline-expected.txt b/third_party/WebKit/LayoutTests/inspector/animation/animation-timeline-expected.txt index 79107a2..30666fb3 100644 --- a/third_party/WebKit/LayoutTests/inspector/animation/animation-timeline-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/animation/animation-timeline-expected.txt
@@ -3,21 +3,21 @@ >>>> Animation with start delay only WebAnimation -<g style="transform: translateX(200px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="407.00" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0 5 L 400.00 5 L 400.00 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="407.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="207.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(600px);"></line> +<g style="cursor: -webkit-grab; transform: translateX(200px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="407.00" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0 5 L 400.00 5 L 400.00 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black; cursor: ew-resize;"></circle><circle class="animation-endpoint" cx="407.00" cy="26" r="3.5" style="stroke: black; fill: black; cursor: ew-resize;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="207.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(600px);"></line> >>>> Animation with start and end delay WebAnimation -<g style="transform: translateX(4.95px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="997.10" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0 5 L 990.10 5 L 990.10 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="997.10" cy="26" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="11.95" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="16.90" style="stroke: black; transform: translateX(995.05px);"></line> +<g style="cursor: -webkit-grab; transform: translateX(4.95px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="997.10" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0 5 L 990.10 5 L 990.10 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black; cursor: ew-resize;"></circle><circle class="animation-endpoint" cx="997.10" cy="26" r="3.5" style="stroke: black; fill: black; cursor: ew-resize;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="11.95" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="16.90" style="stroke: black; transform: translateX(995.05px);"></line> >>>> Animation with step timing function WebAnimation -<g style="transform: translateX(0px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="407.00" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0 5 L 400.00 5 L 400.00 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="407.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(400px);"></line> +<g style="cursor: -webkit-grab; transform: translateX(0px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="407.00" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0 5 L 400.00 5 L 400.00 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black; cursor: ew-resize;"></circle><circle class="animation-endpoint" cx="407.00" cy="26" r="3.5" style="stroke: black; fill: black; cursor: ew-resize;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(400px);"></line> >>>> CSS animation started CSSAnimation anim -<g style="transform: translateX(0px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="607.00" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0.47 24.97 L 19.52 22.90 L 37.98 20.86 L 55.90 18.88 L 73.30 16.99 L 90.22 15.22 L 106.67 13.59 L 122.71 12.11 L 138.35 10.79 L 153.63 9.63 L 168.58 8.62 L 183.23 7.75 L 197.61 7.02 L 211.76 6.41 L 225.71 5.91 L 239.48 5.51 L 253.11 5.20 L 266.63 4.97 L 280.08 4.83 L 293.47 4.76 L 306.85 4.76 L 320.25 4.83 L 333.70 4.97 L 347.22 5.20 L 360.85 5.51 L 374.63 5.91 L 388.58 6.41 L 402.73 7.02 L 417.12 7.75 L 431.78 8.62 L 446.74 9.63 L 462.03 10.79 L 477.68 12.11 L 493.72 13.59 L 510.19 15.22 L 527.11 16.99 L 544.52 18.88 L 562.45 20.86 L 580.94 22.90 L 600.00 24.97 L 600.00 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="607.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(600px);"></line> +<g style="cursor: -webkit-grab; transform: translateX(0px);"><g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="607.00" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0.47 24.97 L 19.52 22.90 L 37.98 20.86 L 55.90 18.88 L 73.30 16.99 L 90.22 15.22 L 106.67 13.59 L 122.71 12.11 L 138.35 10.79 L 153.63 9.63 L 168.58 8.62 L 183.23 7.75 L 197.61 7.02 L 211.76 6.41 L 225.71 5.91 L 239.48 5.51 L 253.11 5.20 L 266.63 4.97 L 280.08 4.83 L 293.47 4.76 L 306.85 4.76 L 320.25 4.83 L 333.70 4.97 L 347.22 5.20 L 360.85 5.51 L 374.63 5.91 L 388.58 6.41 L 402.73 7.02 L 417.12 7.75 L 431.78 8.62 L 446.74 9.63 L 462.03 10.79 L 477.68 12.11 L 493.72 13.59 L 510.19 15.22 L 527.11 16.99 L 544.52 18.88 L 562.45 20.86 L 580.94 22.90 L 600.00 24.97 L 600.00 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black; cursor: ew-resize;"></circle><circle class="animation-endpoint" cx="607.00" cy="26" r="3.5" style="stroke: black; fill: black; cursor: ew-resize;"></circle></g><g class="animation-tail-iterations"></g></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(600px);"></line> >>>> CSS transition started CSSTransition background-color -<g style="transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="307.00" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0.01 0.00 L 0.32 0.00 L 1.21 0.00 L 2.66 0.02 L 4.65 0.11 L 7.17 0.31 L 10.21 0.66 L 13.74 1.15 L 17.76 1.76 L 22.25 2.45 L 27.19 3.21 L 32.57 4.00 L 38.38 4.82 L 44.59 5.64 L 51.20 6.47 L 58.18 7.29 L 65.53 8.10 L 73.23 8.90 L 81.26 9.69 L 89.60 10.46 L 98.25 11.23 L 107.19 11.98 L 116.40 12.72 L 125.87 13.46 L 135.58 14.19 L 145.51 14.91 L 155.66 15.63 L 166.00 16.35 L 176.53 17.08 L 187.23 17.80 L 198.07 18.53 L 209.05 19.26 L 220.15 20.01 L 231.36 20.76 L 242.66 21.52 L 254.04 22.30 L 265.48 23.09 L 276.96 23.90 L 288.47 24.72 L 300.00 25.57 L 300.00 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle><circle class="animation-endpoint" cx="307.00" cy="26" r="3.5" style="stroke: black; fill: black;"></circle></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(300px);"></line> +<g style="cursor: -webkit-grab; transform: translateX(0px);"><line class="animation-line" x1="7" y1="26" y2="26" x2="307.00" style="stroke: black;"></line><path class="animation-keyframe" d="M 0 26 L 0.01 0.00 L 0.32 0.00 L 1.21 0.00 L 2.66 0.02 L 4.65 0.11 L 7.17 0.31 L 10.21 0.66 L 13.74 1.15 L 17.76 1.76 L 22.25 2.45 L 27.19 3.21 L 32.57 4.00 L 38.38 4.82 L 44.59 5.64 L 51.20 6.47 L 58.18 7.29 L 65.53 8.10 L 73.23 8.90 L 81.26 9.69 L 89.60 10.46 L 98.25 11.23 L 107.19 11.98 L 116.40 12.72 L 125.87 13.46 L 135.58 14.19 L 145.51 14.91 L 155.66 15.63 L 166.00 16.35 L 176.53 17.08 L 187.23 17.80 L 198.07 18.53 L 209.05 19.26 L 220.15 20.01 L 231.36 20.76 L 242.66 21.52 L 254.04 22.30 L 265.48 23.09 L 276.96 23.90 L 288.47 24.72 L 300.00 25.57 L 300.00 26 Z" style="transform: translateX(7px); fill: black;"></path><circle class="animation-endpoint" cx="7.00" cy="26" r="3.5" style="stroke: black; fill: black; cursor: ew-resize;"></circle><circle class="animation-endpoint" cx="307.00" cy="26" r="3.5" style="stroke: black; fill: black; cursor: ew-resize;"></circle></g><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black;"></line><line class="animation-delay-line" x1="7" y1="26" y2="26" x2="7.00" style="stroke: black; transform: translateX(300px);"></line>
diff --git a/third_party/WebKit/LayoutTests/inspector/animation/animation-web-anim-negative-start-time-expected.txt b/third_party/WebKit/LayoutTests/inspector/animation/animation-web-anim-negative-start-time-expected.txt new file mode 100644 index 0000000..0b5a3d9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/animation/animation-web-anim-negative-start-time-expected.txt
@@ -0,0 +1,5 @@ +Tests that animation with negative start delay gets added. + +true +true +
diff --git a/third_party/WebKit/LayoutTests/inspector/animation/animation-web-anim-negative-start-time.html b/third_party/WebKit/LayoutTests/inspector/animation/animation-web-anim-negative-start-time.html new file mode 100644 index 0000000..925c8de9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/animation/animation-web-anim-negative-start-time.html
@@ -0,0 +1,68 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/elements-test.js"></script> +<script> +function startAnimation() +{ + node.animate([{ width: "100px" }, { width: "200px" }], { duration: 200, delay: 100 }); +} + +function startAnimationWithNegativeStartTime() +{ + animation = node.animate([{ width: "100px" }, { width: "200px" }], { duration: 20000, delay: 100, endDelay: 200 }); + animation.startTime = -10000; +} + +var initialize_Animations = function() { + + InspectorTest.preloadModule("animation"); +} + +function test() +{ + // Override timeline width for testing + WebInspector.AnimationTimeline.prototype.width = function() { return 50; } + // Override animation color for testing + // FIXME: Set animation name of Web Animation instead; not supported yet + WebInspector.AnimationUI.Color = function() { return "black"; } + var timeline; + InspectorTest.addSniffer(WebInspector.TabbedPane.prototype, "changeTabView", onChangeTabView, true); + WebInspector.inspectorView.showViewInDrawer("animations", true); + + function onChangeTabView(id, view) + { + if (!timeline && id === "animations") { + timeline = view; + InspectorTest.assertTrue(timeline instanceof WebInspector.AnimationTimeline); + InspectorTest.waitForAnimationAdded(step2); + InspectorTest.evaluateInPage("startAnimation()"); + } + } + + function step2(group) + { + InspectorTest.addResult(timeline._groupBuffer.indexOf(group) !== -1); + InspectorTest.waitForAnimationAdded(step3); + InspectorTest.evaluateInPage("startAnimationWithNegativeStartTime()"); + } + + function step3(group) + { + InspectorTest.addResult(timeline._groupBuffer.indexOf(group) !== -1); + InspectorTest.completeTest(); + } +} + +</script> +</head> + +<body onload="runTest()"> +<p> +Tests that animation with negative start delay gets added. +</p> + +<div id="node" style="background-color: red; height: 100px"></div> + +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-eval-object-literal-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-eval-object-literal-expected.txt new file mode 100644 index 0000000..bbf6fad --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/console/console-eval-object-literal-expected.txt
@@ -0,0 +1,11 @@ +Tests that evaluating object literal in the console correctly reported. + +{a:1, b:2} +Object {a: 1, b: 2} +{a:1} +Object {a: 1} +{var a = 1; eval("{a :1, b:2 }");} + VM:2 Uncaught SyntaxError: Unexpected identifier(…) +{ for (var i = 0; i < 5; ++i); } + VM:2 Uncaught SyntaxError: Unexpected token var(…) +
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-eval-object-literal.html b/third_party/WebKit/LayoutTests/inspector/console/console-eval-object-literal.html new file mode 100644 index 0000000..afa3fd3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/console/console-eval-object-literal.html
@@ -0,0 +1,29 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/console-test.js"></script> +<script> +function test() +{ + var commands = ["{a:1, b:2}", "{a:1}", "{var a = 1; eval(\"{a :1, b:2 }\");}", "{ for (var i = 0; i < 5; ++i); }"]; + var current = -1; + loopOverCommands(); + function loopOverCommands() + { + ++current; + if (current < commands.length) { + InspectorTest.evaluateInConsole(commands[current], loopOverCommands); + } else { + InspectorTest.dumpConsoleMessagesIgnoreErrorStackFrames(); + InspectorTest.completeTest(); + } + } +} +</script> +</head> +<body onload="runTest()"> +<p> +Tests that evaluating object literal in the console correctly reported. +</p> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/elements/styles-1/css-outline-expected.txt b/third_party/WebKit/LayoutTests/inspector/elements/styles-1/css-outline-expected.txt index 08d5dda7..95db061 100644 --- a/third_party/WebKit/LayoutTests/inspector/elements/styles-1/css-outline-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/elements/styles-1/css-outline-expected.txt
@@ -53,7 +53,7 @@ startColumn : 6 startLine : 19 } - value : "red" + value : " red " valueRange : { endColumn : 17 endLine : 19 @@ -82,7 +82,7 @@ startColumn : 4 startLine : 21 } - value : "1px solid black" + value : " 1px solid black" valueRange : { endColumn : 27 endLine : 21 @@ -104,7 +104,7 @@ startColumn : 4 startLine : 22 } - value : "1" + value : " 1" valueRange : { endColumn : 14 endLine : 22 @@ -127,7 +127,7 @@ startColumn : 4 startLine : 23 } - value : "rgb(1, 2, 3)" + value : " rgb(1, 2, 3) " valueRange : { endColumn : 47 endLine : 23 @@ -156,7 +156,7 @@ startColumn : 25 startLine : 25 } - value : "ellipsis" + value : " ellipsis" valueRange : { endColumn : 48 endLine : 25 @@ -185,7 +185,7 @@ startColumn : 4 startLine : 27 } - value : "blue" + value : " blue" valueRange : { endColumn : 22 endLine : 27 @@ -207,7 +207,8 @@ startColumn : 4 startLine : 28 } - value : ""dogs"" + value : " "dogs" +" valueRange : { endColumn : 0 endLine : 29 @@ -241,7 +242,7 @@ startColumn : 4 startLine : 39 } - value : "underline" + value : " underline" valueRange : { endColumn : 30 endLine : 39 @@ -276,7 +277,7 @@ startColumn : 0 startLine : 44 } - value : "Times New Roman" + value : " Times New Roman" valueRange : { endColumn : 36 endLine : 44 @@ -298,7 +299,7 @@ startColumn : 8 startLine : 45 } - value : "10px" + value : " 10px" valueRange : { endColumn : 35 endLine : 45 @@ -320,7 +321,8 @@ startColumn : 8 startLine : 46 } - value : ""Example Font"" + value : " "Example Font" + " valueRange : { endColumn : 4 endLine : 47
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/sass-test.js b/third_party/WebKit/LayoutTests/inspector/sass/sass-test.js index 47a654fa..0ed17d0 100644 --- a/third_party/WebKit/LayoutTests/inspector/sass/sass-test.js +++ b/third_party/WebKit/LayoutTests/inspector/sass/sass-test.js
@@ -86,5 +86,14 @@ } } +var cssParser = null; + +InspectorTest.parseCSS = function(url, text) +{ + if (!cssParser) + cssParser = new WebInspector.CSSParser(); + return WebInspector.SASSSupport.parseCSS(cssParser, url, text); +} + }
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-1-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-1-expected.txt new file mode 100644 index 0000000..d00e9d0c --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-1-expected.txt
@@ -0,0 +1,97 @@ +Verifies CSS AST for simple input. + +div { + /* display: flex; */ + color: red; + background-color: blue; + /* position: absolute; */ +} + +div .className { + padding: 10px 0 0 10px; + /* font-family: "Times New Roman"; */ + background-image: url(assets/no-image-set.png); +} + +div .className #test::before { + margin: 10px 10px; + content: "test me"; + /* border: 1px solid black; */ +} +=== AST === +rule 0: "div" + property 0 + name: "display" + range: {"startLine":1,"startColumn":7,"endLine":1,"endColumn":14} + value: " flex" + range: {"startLine":1,"startColumn":15,"endLine":1,"endColumn":20} + range: {"startLine":1,"startColumn":4,"endLine":1,"endColumn":24} + disabled: true + property 1 + name: "color" + range: {"startLine":2,"startColumn":4,"endLine":2,"endColumn":9} + value: " red" + range: {"startLine":2,"startColumn":10,"endLine":2,"endColumn":14} + range: {"startLine":2,"startColumn":4,"endLine":2,"endColumn":15} + disabled: false + property 2 + name: "background-color" + range: {"startLine":3,"startColumn":4,"endLine":3,"endColumn":20} + value: " blue" + range: {"startLine":3,"startColumn":21,"endLine":3,"endColumn":26} + range: {"startLine":3,"startColumn":4,"endLine":3,"endColumn":27} + disabled: false + property 3 + name: "position" + range: {"startLine":4,"startColumn":7,"endLine":4,"endColumn":15} + value: " absolute" + range: {"startLine":4,"startColumn":16,"endLine":4,"endColumn":25} + range: {"startLine":4,"startColumn":4,"endLine":4,"endColumn":29} + disabled: true +rule 1: "div .className" + property 0 + name: "padding" + range: {"startLine":8,"startColumn":4,"endLine":8,"endColumn":11} + value: " 10px 0 0 10px" + range: {"startLine":8,"startColumn":12,"endLine":8,"endColumn":26} + range: {"startLine":8,"startColumn":4,"endLine":8,"endColumn":27} + disabled: false + property 1 + name: "font-family" + range: {"startLine":9,"startColumn":7,"endLine":9,"endColumn":18} + value: " "Times New Roman"" + range: {"startLine":9,"startColumn":19,"endLine":9,"endColumn":37} + range: {"startLine":9,"startColumn":4,"endLine":9,"endColumn":41} + disabled: true + property 2 + name: "background-image" + range: {"startLine":10,"startColumn":4,"endLine":10,"endColumn":20} + value: " url(assets/no-image-set.png)" + range: {"startLine":10,"startColumn":21,"endLine":10,"endColumn":50} + range: {"startLine":10,"startColumn":4,"endLine":10,"endColumn":51} + disabled: false +rule 2: "div .className #test::before" + property 0 + name: "margin" + range: {"startLine":14,"startColumn":4,"endLine":14,"endColumn":10} + value: " 10px 10px" + range: {"startLine":14,"startColumn":11,"endLine":14,"endColumn":21} + range: {"startLine":14,"startColumn":4,"endLine":14,"endColumn":22} + disabled: false + property 1 + name: "content" + range: {"startLine":15,"startColumn":4,"endLine":15,"endColumn":11} + value: " "test me"" + range: {"startLine":15,"startColumn":12,"endLine":15,"endColumn":22} + range: {"startLine":15,"startColumn":4,"endLine":15,"endColumn":23} + disabled: false + property 2 + name: "border" + range: {"startLine":16,"startColumn":7,"endLine":16,"endColumn":13} + value: " 1px solid black" + range: {"startLine":16,"startColumn":14,"endLine":16,"endColumn":30} + range: {"startLine":16,"startColumn":4,"endLine":16,"endColumn":34} + disabled: true +====== +Ranges OK. +
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-1.html b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-1.html new file mode 100644 index 0000000..3b1bd8d --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-1.html
@@ -0,0 +1,60 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/elements-test.js"></script> +<script src="./sass-test.js"></script> +<style> +pre { + font-family: monospace; +} +</style> +<script> + +function test() +{ + InspectorTest.evaluateInPage("getCSS()", onCSS); + + function onCSS(result) + { + InspectorTest.parseCSS("", result.value) + .then(InspectorTest.dumpAST) + .then(InspectorTest.validateASTRanges) + .catch(console.error.bind(console)) + .then(InspectorTest.completeTest); + } +} + +function getCSS() +{ + return document.querySelector(".snippet").textContent; +} + +</script> +</head> + +<body onload="runTest()"> +<p> +Verifies CSS AST for simple input. +</p> +<pre class="snippet"> +div { + /* display: flex; */ + color: red; + background-color: blue; + /* position: absolute; */ +} + +div .className { + padding: 10px 0 0 10px; + /* font-family: "Times New Roman"; */ + background-image: url(assets/no-image-set.png); +} + +div .className #test::before { + margin: 10px 10px; + content: "test me"; + /* border: 1px solid black; */ +} +</pre> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-2-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-2-expected.txt new file mode 100644 index 0000000..1f8e1c9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-2-expected.txt
@@ -0,0 +1,44 @@ +Verifies AST of CSS with media query. + +@media (min-device-width: 720px) { + body { + width: 720px; + /* padding-top: 5em; */ + height: 100%; + margin: 0 auto; + } +} + +=== AST === +rule 0: "body" + property 0 + name: "width" + range: {"startLine":2,"startColumn":8,"endLine":2,"endColumn":13} + value: " 720px" + range: {"startLine":2,"startColumn":14,"endLine":2,"endColumn":20} + range: {"startLine":2,"startColumn":8,"endLine":2,"endColumn":21} + disabled: false + property 1 + name: "padding-top" + range: {"startLine":3,"startColumn":11,"endLine":3,"endColumn":22} + value: " 5em" + range: {"startLine":3,"startColumn":23,"endLine":3,"endColumn":27} + range: {"startLine":3,"startColumn":8,"endLine":3,"endColumn":31} + disabled: true + property 2 + name: "height" + range: {"startLine":4,"startColumn":8,"endLine":4,"endColumn":14} + value: " 100%" + range: {"startLine":4,"startColumn":15,"endLine":4,"endColumn":20} + range: {"startLine":4,"startColumn":8,"endLine":4,"endColumn":21} + disabled: false + property 3 + name: "margin" + range: {"startLine":5,"startColumn":8,"endLine":5,"endColumn":14} + value: " 0 auto" + range: {"startLine":5,"startColumn":15,"endLine":5,"endColumn":22} + range: {"startLine":5,"startColumn":8,"endLine":5,"endColumn":23} + disabled: false +====== +Ranges OK. +
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-2.html b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-2.html new file mode 100644 index 0000000..70651eea --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-2.html
@@ -0,0 +1,51 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/elements-test.js"></script> +<script src="./sass-test.js"></script> +<style> +pre { + font-family: monospace; +} +</style> +<script> + +function test() +{ + InspectorTest.evaluateInPage("getCSS()", onCSS); + + function onCSS(result) + { + InspectorTest.parseCSS("", result.value) + .then(InspectorTest.dumpAST) + .then(InspectorTest.validateASTRanges) + .catch(console.error.bind(console)) + .then(InspectorTest.completeTest); + } +} + +function getCSS() +{ + return document.querySelector(".snippet").textContent; +} + +</script> +</head> + +<body onload="runTest()"> +<p> +Verifies AST of CSS with media query. +</p> +<pre class="snippet"> +@media (min-device-width: 720px) { + body { + width: 720px; + /* padding-top: 5em; */ + height: 100%; + margin: 0 auto; + } +} + +</pre> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-3-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-3-expected.txt new file mode 100644 index 0000000..48528d9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-3-expected.txt
@@ -0,0 +1,47 @@ +Verifies AST of CSS with missing trailing semicolon after last property. + +body { + /* padding-top: 5em; */ + margin: 0 auto +} + +body { + color: red; + /* margin: 0 auto */ +} + +=== AST === +rule 0: "body" + property 0 + name: "padding-top" + range: {"startLine":1,"startColumn":7,"endLine":1,"endColumn":18} + value: " 5em" + range: {"startLine":1,"startColumn":19,"endLine":1,"endColumn":23} + range: {"startLine":1,"startColumn":4,"endLine":1,"endColumn":27} + disabled: true + property 1 + name: "margin" + range: {"startLine":2,"startColumn":4,"endLine":2,"endColumn":10} + value: " 0 auto +" + range: {"startLine":2,"startColumn":11,"endLine":3,"endColumn":0} + range: {"startLine":2,"startColumn":4,"endLine":3,"endColumn":0} + disabled: false +rule 1: "body" + property 0 + name: "color" + range: {"startLine":6,"startColumn":4,"endLine":6,"endColumn":9} + value: " red" + range: {"startLine":6,"startColumn":10,"endLine":6,"endColumn":14} + range: {"startLine":6,"startColumn":4,"endLine":6,"endColumn":15} + disabled: false + property 1 + name: "margin" + range: {"startLine":7,"startColumn":7,"endLine":7,"endColumn":13} + value: " 0 auto " + range: {"startLine":7,"startColumn":14,"endLine":7,"endColumn":22} + range: {"startLine":7,"startColumn":4,"endLine":7,"endColumn":24} + disabled: true +====== +Ranges OK. +
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-3.html b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-3.html new file mode 100644 index 0000000..03cd8238 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-ast-css-3.html
@@ -0,0 +1,52 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/elements-test.js"></script> +<script src="./sass-test.js"></script> +<style> +pre { + font-family: monospace; +} +</style> +<script> + +function test() +{ + InspectorTest.evaluateInPage("getCSS()", onCSS); + + function onCSS(result) + { + InspectorTest.parseCSS("", result.value) + .then(InspectorTest.dumpAST) + .then(InspectorTest.validateASTRanges) + .catch(console.error.bind(console)) + .then(InspectorTest.completeTest); + } +} + +function getCSS() +{ + return document.querySelector(".snippet").textContent; +} + +</script> +</head> + +<body onload="runTest()"> +<p> +Verifies AST of CSS with missing trailing semicolon after last property. +</p> +<pre class="snippet"> +body { + /* padding-top: 5em; */ + margin: 0 auto +} + +body { + color: red; + /* margin: 0 auto */ +} + +</pre> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe-expected.txt index 5e2e70c4..877d0848 100644 --- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe-expected.txt
@@ -4,19 +4,19 @@ Set timer for test function. Call stack: 0) pauseInsideIframe (:6) - 1) testFunction (debugger-eval-on-call-frame-inside-iframe.html:34) + 1) testFunction (debugger-eval-on-call-frame-inside-iframe.html:35) === Evaluating on iframe === dir() = "overridden dir() in iframe" dirxml() = undefined table = "local in iframe" clear = -x: = VM:1 Uncaught SyntaxError {message: "Unexpected end of input"}pauseInsideIframe @ VM:6testFunction @ debugger-eval-on-call-frame-inside-iframe.html:34 +x: = VM:1 Uncaught SyntaxError {message: "Unexpected end of input"}pauseInsideIframe @ VM:6testFunction @ debugger-eval-on-call-frame-inside-iframe.html:35 === Evaluating on top frame === dir() = undefined dirxml() = "overridden dirxml() in top frame" table = clear = "local in top frame" -x: = VM:1 Uncaught SyntaxError {message: "Unexpected end of input"}pauseInsideIframe @ VM:6testFunction @ debugger-eval-on-call-frame-inside-iframe.html:34 +x: = VM:1 Uncaught SyntaxError {message: "Unexpected end of input"}pauseInsideIframe @ VM:6testFunction @ debugger-eval-on-call-frame-inside-iframe.html:35
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.html index bf4b41ee..c35dab2 100644 --- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.html +++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.html
@@ -18,6 +18,7 @@ "{\n" + " var table = 'local in iframe';\n" + " debugger;\n" + + " dir;\n" + "}\n" + "</" + "script></" + "head><" + "body></" + "body></" + "html>"; doc.open();
diff --git a/third_party/WebKit/LayoutTests/inspector/user-metrics-expected.txt b/third_party/WebKit/LayoutTests/inspector/user-metrics-expected.txt index e63a430..3ace0dba 100644 --- a/third_party/WebKit/LayoutTests/inspector/user-metrics-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/user-metrics-expected.txt
@@ -6,6 +6,7 @@ AuditsStarted : 7 CommandEvaluatedInConsolePanel : 15 ConsoleEvaluated : 8 + DOMPropertiesExpanded : 16 DeviceModeEnabled : 10 FileSavedInWorkspace : 9 FileSystemDirectoryContentReceived : 13
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index dde3259..4b15166 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -3134,6 +3134,13 @@ interface KeywordValue : StyleValue getter keywordValue method constructor +interface LengthValue : StyleValue + static method fromValue + method add + method constructor + method divide + method multiply + method subtract interface Location method constructor interface MIDIAccess : EventTarget
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunnerTest.cpp b/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunnerTest.cpp index 86c5c0b..0867cf07 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunnerTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunnerTest.cpp
@@ -31,7 +31,7 @@ void TearDown() override { - m_resourceRequest.clear(); + m_resourceRequest = ResourceRequest(); m_resource.clear(); } @@ -73,14 +73,14 @@ void setEmptyResource() { - m_resourceRequest = WTF::adoptPtr(new ResourceRequest); - m_resource = new ScriptResource(*m_resourceRequest.get(), "UTF-8"); + m_resourceRequest = ResourceRequest(); + m_resource = new ScriptResource(m_resourceRequest, "UTF-8"); } void setResource() { - m_resourceRequest = WTF::adoptPtr(new ResourceRequest(url())); - m_resource = new ScriptResource(*m_resourceRequest.get(), "UTF-8"); + m_resourceRequest = ResourceRequest(url()); + m_resource = new ScriptResource(m_resourceRequest, "UTF-8"); } CachedMetadataHandler* cacheHandler() @@ -89,7 +89,7 @@ } protected: - WTF::OwnPtr<ResourceRequest> m_resourceRequest; + ResourceRequest m_resourceRequest; ResourcePtr<ScriptResource> m_resource; V8TestingScope m_scope;
diff --git a/third_party/WebKit/Source/core/animation/Animation.cpp b/third_party/WebKit/Source/core/animation/Animation.cpp index f15ce8ee..985b411 100644 --- a/third_party/WebKit/Source/core/animation/Animation.cpp +++ b/third_party/WebKit/Source/core/animation/Animation.cpp
@@ -114,6 +114,15 @@ destroyCompositorPlayer(); } +void Animation::dispose() +{ + destroyCompositorPlayer(); + // If the AnimationTimeline and its Animation objects are + // finalized by the same GC, we have to eagerly clear out + // this Animation object's compositor player registration. + ASSERT(!m_compositorPlayer); +} + double Animation::effectEnd() const { return m_content ? m_content->endTimeInternal() : 0; @@ -929,8 +938,8 @@ if (m_compositorPlayer) { detachCompositorTimeline(); m_compositorPlayer->setAnimationDelegate(nullptr); + m_compositorPlayer.clear(); } - m_compositorPlayer.clear(); } void Animation::attachCompositorTimeline()
diff --git a/third_party/WebKit/Source/core/animation/Animation.h b/third_party/WebKit/Source/core/animation/Animation.h index c2a2e8a..402df1ad 100644 --- a/third_party/WebKit/Source/core/animation/Animation.h +++ b/third_party/WebKit/Source/core/animation/Animation.h
@@ -68,8 +68,9 @@ Finished }; - ~Animation(); static Animation* create(AnimationEffect*, AnimationTimeline*); + ~Animation(); + void dispose(); // Returns whether the animation is finished. bool update(TimingUpdateReason); @@ -230,6 +231,7 @@ Member<AnimationEffect> m_content; Member<AnimationTimeline> m_timeline; + // Reflects all pausing, including via pauseForTesting(). bool m_paused; bool m_held;
diff --git a/third_party/WebKit/Source/core/animation/AnimationTimeline.cpp b/third_party/WebKit/Source/core/animation/AnimationTimeline.cpp index 14882ee5..d39fd4b3 100644 --- a/third_party/WebKit/Source/core/animation/AnimationTimeline.cpp +++ b/third_party/WebKit/Source/core/animation/AnimationTimeline.cpp
@@ -72,6 +72,7 @@ , m_playbackRate(1) , m_lastCurrentTimeInternal(0) { + ThreadState::current()->registerPreFinalizer(this); if (!timing) m_timing = new AnimationTimelineTiming(this); else @@ -89,6 +90,17 @@ { } +void AnimationTimeline::dispose() +{ + // The Animation objects depend on using this AnimationTimeline to + // unregister from its underlying compositor timeline. To arrange + // for that safely, this dispose() method will return first + // during prefinalization, notifying each Animation object of + // impending destruction. + for (const auto& animation : m_animations) + animation->dispose(); +} + bool AnimationTimeline::isActive() { return m_document && m_document->page();
diff --git a/third_party/WebKit/Source/core/animation/AnimationTimeline.h b/third_party/WebKit/Source/core/animation/AnimationTimeline.h index ef6cb95..3836cd6d 100644 --- a/third_party/WebKit/Source/core/animation/AnimationTimeline.h +++ b/third_party/WebKit/Source/core/animation/AnimationTimeline.h
@@ -50,6 +50,7 @@ // AnimationTimeline is constructed and owned by Document, and tied to its lifecycle. class CORE_EXPORT AnimationTimeline : public GarbageCollectedFinalized<AnimationTimeline>, public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); + USING_PRE_FINALIZER(AnimationTimeline, dispose); public: class PlatformTiming : public GarbageCollectedFinalized<PlatformTiming> { public: @@ -62,6 +63,7 @@ static AnimationTimeline* create(Document*, PlatformTiming* = nullptr); ~AnimationTimeline(); + void dispose(); void serviceAnimations(TimingUpdateReason); void scheduleNextService();
diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi index 00b0105..5aaf6e9 100644 --- a/third_party/WebKit/Source/core/core.gypi +++ b/third_party/WebKit/Source/core/core.gypi
@@ -41,6 +41,7 @@ 'css/StyleSheetList.idl', 'css/WebKitCSSMatrix.idl', 'css/cssom/KeywordValue.idl', + 'css/cssom/LengthValue.idl', 'css/cssom/NumberValue.idl', 'css/cssom/StyleValue.idl', 'dom/ArrayBuffer.idl', @@ -1234,6 +1235,8 @@ 'css/StyleSheetList.h', 'css/cssom/KeywordValue.cpp', 'css/cssom/KeywordValue.h', + 'css/cssom/LengthValue.cpp', + 'css/cssom/LengthValue.h', 'css/cssom/NumberValue.h', 'css/cssom/StyleValue.cpp', 'css/cssom/StyleValue.h',
diff --git a/third_party/WebKit/Source/core/css/CSSFontFaceRule.idl b/third_party/WebKit/Source/core/css/CSSFontFaceRule.idl index 6d2ece7..cc71dcd 100644 --- a/third_party/WebKit/Source/core/css/CSSFontFaceRule.idl +++ b/third_party/WebKit/Source/core/css/CSSFontFaceRule.idl
@@ -27,5 +27,5 @@ // TODO(philipj): Implement the interface from CSS Fonts. interface CSSFontFaceRule : CSSRule { - readonly attribute CSSStyleDeclaration style; + [Measure] readonly attribute CSSStyleDeclaration style; };
diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp index 49a7e1a..8a0dcf4 100644 --- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp +++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
@@ -22,11 +22,21 @@ , m_display(display) , m_period(display == FontDisplaySwap ? SwapPeriod : BlockPeriod) { +#if ENABLE(OILPAN) + ThreadState::current()->registerPreFinalizer(this); +#endif m_font->addClient(this); } RemoteFontFaceSource::~RemoteFontFaceSource() { +#if !ENABLE(OILPAN) + dispose(); +#endif +} + +void RemoteFontFaceSource::dispose() +{ m_font->removeClient(this); pruneTable(); }
diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h index 1d6eb55c..33746840 100644 --- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h +++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
@@ -23,11 +23,13 @@ }; class RemoteFontFaceSource final : public CSSFontFaceSource, public FontResourceClient { + WILL_BE_USING_PRE_FINALIZER(RemoteFontFaceSource, dispose); public: enum DisplayPeriod { BlockPeriod, SwapPeriod, FailurePeriod }; explicit RemoteFontFaceSource(FontResource*, PassRefPtrWillBeRawPtr<FontLoader>, FontDisplay); ~RemoteFontFaceSource() override; + void dispose(); FontResource* resource() override { return m_font.get(); } bool isLoading() const override;
diff --git a/third_party/WebKit/Source/core/css/cssom/KeywordValue.cpp b/third_party/WebKit/Source/core/css/cssom/KeywordValue.cpp index ecf3033..e4428945 100644 --- a/third_party/WebKit/Source/core/css/cssom/KeywordValue.cpp +++ b/third_party/WebKit/Source/core/css/cssom/KeywordValue.cpp
@@ -1,3 +1,7 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + #include "config.h" #include "core/css/cssom/KeywordValue.h"
diff --git a/third_party/WebKit/Source/core/css/cssom/KeywordValue.h b/third_party/WebKit/Source/core/css/cssom/KeywordValue.h index 05e9b99..189c4ead 100644 --- a/third_party/WebKit/Source/core/css/cssom/KeywordValue.h +++ b/third_party/WebKit/Source/core/css/cssom/KeywordValue.h
@@ -1,3 +1,7 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + #ifndef KeywordValue_h #define KeywordValue_h
diff --git a/third_party/WebKit/Source/core/css/cssom/KeywordValue.idl b/third_party/WebKit/Source/core/css/cssom/KeywordValue.idl index edcf68c2..07c8347 100644 --- a/third_party/WebKit/Source/core/css/cssom/KeywordValue.idl +++ b/third_party/WebKit/Source/core/css/cssom/KeywordValue.idl
@@ -1,3 +1,7 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + enum StyleValueKeyword {"initial", "inherit", "default", "unset"}; [
diff --git a/third_party/WebKit/Source/core/css/cssom/LengthValue.cpp b/third_party/WebKit/Source/core/css/cssom/LengthValue.cpp new file mode 100644 index 0000000..7cd23cb2 --- /dev/null +++ b/third_party/WebKit/Source/core/css/cssom/LengthValue.cpp
@@ -0,0 +1,175 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "config.h" +#include "core/css/cssom/LengthValue.h" + +#include "bindings/core/v8/ExceptionState.h" +#include "wtf/HashMap.h" + +namespace blink { + +namespace { + +using UnitTable = HashMap<String, LengthValue::LengthUnit>; + +UnitTable createStrToLenUnitTable() +{ + UnitTable table; + table.set(String("px"), LengthValue::Px); + table.set(String("percent"), LengthValue::Percent); + table.set(String("%"), LengthValue::Percent); + table.set(String("em"), LengthValue::Em); + table.set(String("ex"), LengthValue::Ex); + table.set(String("ch"), LengthValue::Ch); + table.set(String("rem"), LengthValue::Rem); + table.set(String("vw"), LengthValue::Vw); + table.set(String("vh"), LengthValue::Vh); + table.set(String("vmin"), LengthValue::Vmin); + table.set(String("vmax"), LengthValue::Vmax); + table.set(String("cm"), LengthValue::Cm); + table.set(String("mm"), LengthValue::Mm); + table.set(String("q"), LengthValue::QUnit); + table.set(String("in"), LengthValue::In); + table.set(String("pc"), LengthValue::Pc); + table.set(String("pt"), LengthValue::Pt); + return table; +} + +UnitTable& typeTable() +{ + DEFINE_STATIC_LOCAL(UnitTable, typeTable, (createStrToLenUnitTable())); + return typeTable; +} + +} // namespace + +LengthValue* LengthValue::parse(const String& cssString) +{ + // TODO: Implement + return nullptr; +} + +LengthValue* LengthValue::fromValue(double value, const String& typeStr) +{ + return nullptr; + // return SimpleLength::create(value, lengthUnitFromName(typeStr)).get(); +} + +PassRefPtrWillBeRawPtr<LengthValue> LengthValue::add(const LengthValue* other, ExceptionState& exceptionState) +{ + if (type() == other->type()) + return addInternal(other, exceptionState); + + exceptionState.throwTypeError("Not implemented yet"); + return nullptr; +} + +PassRefPtrWillBeRawPtr<LengthValue> LengthValue::subtract(const LengthValue* other, ExceptionState& exceptionState) +{ + if (type() == other->type()) + return subtractInternal(other, exceptionState); + + exceptionState.throwTypeError("Not implemented yet"); + return nullptr; +} + +PassRefPtrWillBeRawPtr<LengthValue> LengthValue::multiply(double x, ExceptionState& exceptionState) +{ + return multiplyInternal(x, exceptionState); +} + +PassRefPtrWillBeRawPtr<LengthValue> LengthValue::divide(double x, ExceptionState& exceptionState) +{ + return divideInternal(x, exceptionState); +} + +LengthValue::LengthUnit LengthValue::lengthUnitFromName(const String& str) +{ + return typeTable().get(str.lower()); +} + +const String& LengthValue::lengthTypeToString(LengthValue::LengthUnit unit) +{ + DEFINE_STATIC_LOCAL(const String, PxStr, ("px")); + DEFINE_STATIC_LOCAL(const String, PercentStr, ("%")); + DEFINE_STATIC_LOCAL(const String, EmStr, ("em")); + DEFINE_STATIC_LOCAL(const String, ExStr, ("ex")); + DEFINE_STATIC_LOCAL(const String, ChStr, ("ch")); + DEFINE_STATIC_LOCAL(const String, RemStr, ("rem")); + DEFINE_STATIC_LOCAL(const String, VwStr, ("vw")); + DEFINE_STATIC_LOCAL(const String, VhStr, ("vh")); + DEFINE_STATIC_LOCAL(const String, VminStr, ("vmin")); + DEFINE_STATIC_LOCAL(const String, VmaxStr, ("vmax")); + DEFINE_STATIC_LOCAL(const String, CmStr, ("cm")); + DEFINE_STATIC_LOCAL(const String, MmStr, ("mm")); + DEFINE_STATIC_LOCAL(const String, QStr, ("q")); + DEFINE_STATIC_LOCAL(const String, InStr, ("in")); + DEFINE_STATIC_LOCAL(const String, PcStr, ("pc")); + DEFINE_STATIC_LOCAL(const String, PtStr, ("pt")); + + switch (unit) { + case Px: + return PxStr; + case Percent: + return PercentStr; + case Em: + return EmStr; + case Ex: + return ExStr; + case Ch: + return ChStr; + case Rem: + return RemStr; + case Vw: + return VwStr; + case Vh: + return VhStr; + case Vmin: + return VminStr; + case Vmax: + return VmaxStr; + case Cm: + return CmStr; + case Mm: + return MmStr; + case QUnit: + return QStr; + case In: + return InStr; + case Pc: + return PcStr; + case Pt: + return PtStr; + default: + ASSERT_NOT_REACHED(); + return emptyString(); + } +} + +PassRefPtrWillBeRawPtr<LengthValue> LengthValue::addInternal(const LengthValue*, ExceptionState&) +{ + ASSERT_NOT_REACHED(); + return nullptr; +} + +PassRefPtrWillBeRawPtr<LengthValue> LengthValue::subtractInternal(const LengthValue*, ExceptionState&) +{ + ASSERT_NOT_REACHED(); + return nullptr; +} + +PassRefPtrWillBeRawPtr<LengthValue> LengthValue::multiplyInternal(double, ExceptionState&) +{ + ASSERT_NOT_REACHED(); + return nullptr; +} + +PassRefPtrWillBeRawPtr<LengthValue> LengthValue::divideInternal(double, ExceptionState&) +{ + ASSERT_NOT_REACHED(); + return nullptr; +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/css/cssom/LengthValue.h b/third_party/WebKit/Source/core/css/cssom/LengthValue.h new file mode 100644 index 0000000..b1377e7 --- /dev/null +++ b/third_party/WebKit/Source/core/css/cssom/LengthValue.h
@@ -0,0 +1,63 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef LengthValue_h +#define LengthValue_h + +#include "core/css/cssom/StyleValue.h" + +namespace blink { + +class ExceptionState; + +class CORE_EXPORT LengthValue : public StyleValue { + DEFINE_WRAPPERTYPEINFO(); +public: + enum LengthUnit { + Px = 0, + Percent, + Em, + Ex, + Ch, + Rem, + Vw, + Vh, + Vmin, + Vmax, + Cm, + Mm, + QUnit, + In, + Pc, + Pt, + Count // Keep last. Not a real value. + }; + + PassRefPtrWillBeRawPtr<LengthValue> add(const LengthValue* other, ExceptionState&); + PassRefPtrWillBeRawPtr<LengthValue> subtract(const LengthValue* other, ExceptionState&); + PassRefPtrWillBeRawPtr<LengthValue> multiply(double, ExceptionState&); + PassRefPtrWillBeRawPtr<LengthValue> divide(double, ExceptionState&); + + static LengthValue* parse(const String& cssString); + static LengthValue* fromValue(double value, const String& typeStr); + // TODO: Uncomment when Calc is implemented. + // static LengthValue* fromDictionary(const CalcDictionary&); + +protected: + static LengthUnit lengthUnitFromName(const String&); + static const String& lengthTypeToString(LengthUnit type); + + virtual PassRefPtrWillBeRawPtr<LengthValue> addInternal(const LengthValue* other, ExceptionState&); + virtual PassRefPtrWillBeRawPtr<LengthValue> subtractInternal(const LengthValue* other, ExceptionState&); + virtual PassRefPtrWillBeRawPtr<LengthValue> multiplyInternal(double, ExceptionState&); + virtual PassRefPtrWillBeRawPtr<LengthValue> divideInternal(double, ExceptionState&); + + // Length(const String& cssString) : StyleValue(cssString) {} + // Length(double value, LengthUnit type) {} + LengthValue() {} +}; + +} // namespace blink + +#endif
diff --git a/third_party/WebKit/Source/core/css/cssom/LengthValue.idl b/third_party/WebKit/Source/core/css/cssom/LengthValue.idl new file mode 100644 index 0000000..d2cbca3 --- /dev/null +++ b/third_party/WebKit/Source/core/css/cssom/LengthValue.idl
@@ -0,0 +1,21 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +enum LengthType { + "px", "percent", "em", "ex", "ch", "rem", "vw", "vh", "vmin", "vmax", "cm", "mm", "q", "in", "pc", "pt" +}; + +[ + RuntimeEnabled=CSSTypedOM +] interface LengthValue : StyleValue { + [RaisesException, NewObject] LengthValue add(LengthValue other); + [RaisesException, NewObject] LengthValue subtract(LengthValue other); + [RaisesException, NewObject] LengthValue multiply(double value); + [RaisesException, NewObject] LengthValue divide(double value); + + [NewObject] static LengthValue parse(DOMString cssString); + [NewObject] static LengthValue fromValue(double value, LengthType type); + // TODO: Uncomment when Calc is implemented. + // [NewObject] static LengthValue fromDictionary(CalcDictionary dictionary); +};
diff --git a/third_party/WebKit/Source/core/css/cssom/NumberValue.h b/third_party/WebKit/Source/core/css/cssom/NumberValue.h index 43853b2..9773335 100644 --- a/third_party/WebKit/Source/core/css/cssom/NumberValue.h +++ b/third_party/WebKit/Source/core/css/cssom/NumberValue.h
@@ -1,3 +1,7 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + #ifndef NumberValue_h #define NumberValue_h
diff --git a/third_party/WebKit/Source/core/css/cssom/NumberValue.idl b/third_party/WebKit/Source/core/css/cssom/NumberValue.idl index 7080174..57e90f6 100644 --- a/third_party/WebKit/Source/core/css/cssom/NumberValue.idl +++ b/third_party/WebKit/Source/core/css/cssom/NumberValue.idl
@@ -1,6 +1,10 @@ - [ - Constructor(double value), - RuntimeEnabled=CSSTypedOM - ] interface NumberValue : StyleValue { - attribute double value; - }; +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +[ + Constructor(double value), + RuntimeEnabled=CSSTypedOM +] interface NumberValue : StyleValue { + attribute double value; +};
diff --git a/third_party/WebKit/Source/core/css/cssom/StyleValue.cpp b/third_party/WebKit/Source/core/css/cssom/StyleValue.cpp index 8cab731..edcfebb 100644 --- a/third_party/WebKit/Source/core/css/cssom/StyleValue.cpp +++ b/third_party/WebKit/Source/core/css/cssom/StyleValue.cpp
@@ -1,3 +1,7 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + #include "config.h" #include "core/css/cssom/StyleValue.h"
diff --git a/third_party/WebKit/Source/core/css/cssom/StyleValue.h b/third_party/WebKit/Source/core/css/cssom/StyleValue.h index 3c25cf40..1c901a94 100644 --- a/third_party/WebKit/Source/core/css/cssom/StyleValue.h +++ b/third_party/WebKit/Source/core/css/cssom/StyleValue.h
@@ -1,3 +1,7 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + #ifndef StyleValue_h #define StyleValue_h
diff --git a/third_party/WebKit/Source/core/css/cssom/StyleValue.idl b/third_party/WebKit/Source/core/css/cssom/StyleValue.idl index ef6ba78..8278e82 100644 --- a/third_party/WebKit/Source/core/css/cssom/StyleValue.idl +++ b/third_party/WebKit/Source/core/css/cssom/StyleValue.idl
@@ -1,3 +1,7 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + [ RuntimeEnabled=CSSTypedOM, WillBeGarbageCollected
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp index 6e2b221..db7cdba5 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -83,7 +83,7 @@ // This doesn't count UA style sheets if (parseSuccess && context.useCounter()) - context.useCounter()->count(context, unresolvedProperty); + context.useCounter()->count(context.mode(), unresolvedProperty); if (!parseSuccess) parser.rollbackLastProperties(parsedProperties.size() - parsedPropertiesSize); @@ -691,11 +691,11 @@ return true; } -static PassRefPtrWillBeRawPtr<CSSValue> consumeColor(CSSParserTokenRange& range, const CSSParserContext& context, bool acceptQuirkyColors = false) +static PassRefPtrWillBeRawPtr<CSSValue> consumeColor(CSSParserTokenRange& range, CSSParserMode cssParserMode, bool acceptQuirkyColors = false) { CSSValueID id = range.peek().id(); if (CSSPropertyParser::isColorKeyword(id)) { - if (!isValueAllowedInMode(id, context.mode())) + if (!isValueAllowedInMode(id, cssParserMode)) return nullptr; return consumeIdent(range); } @@ -1758,7 +1758,7 @@ return consumeInteger(range); } -static PassRefPtrWillBeRawPtr<CSSShadowValue> parseSingleShadow(CSSParserTokenRange& range, const CSSParserContext& context, bool allowInset, bool allowSpread) +static PassRefPtrWillBeRawPtr<CSSShadowValue> parseSingleShadow(CSSParserTokenRange& range, CSSParserMode cssParserMode, bool allowInset, bool allowSpread) { RefPtrWillBeRawPtr<CSSPrimitiveValue> style = nullptr; RefPtrWillBeRawPtr<CSSValue> color = nullptr; @@ -1770,29 +1770,29 @@ return nullptr; style = consumeIdent(range); } - color = consumeColor(range, context); + color = consumeColor(range, cssParserMode); - RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalOffset = consumeLength(range, context.mode(), ValueRangeAll); + RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalOffset = consumeLength(range, cssParserMode, ValueRangeAll); if (!horizontalOffset) return nullptr; - RefPtrWillBeRawPtr<CSSPrimitiveValue> verticalOffset = consumeLength(range, context.mode(), ValueRangeAll); + RefPtrWillBeRawPtr<CSSPrimitiveValue> verticalOffset = consumeLength(range, cssParserMode, ValueRangeAll); if (!verticalOffset) return nullptr; - RefPtrWillBeRawPtr<CSSPrimitiveValue> blurRadius = consumeLength(range, context.mode(), ValueRangeAll); + RefPtrWillBeRawPtr<CSSPrimitiveValue> blurRadius = consumeLength(range, cssParserMode, ValueRangeAll); RefPtrWillBeRawPtr<CSSPrimitiveValue> spreadDistance = nullptr; if (blurRadius) { // Blur radius must be non-negative. if (blurRadius->getDoubleValue() < 0) return nullptr; if (allowSpread) - spreadDistance = consumeLength(range, context.mode(), ValueRangeAll); + spreadDistance = consumeLength(range, cssParserMode, ValueRangeAll); } if (!range.atEnd()) { if (!color) - color = consumeColor(range, context); + color = consumeColor(range, cssParserMode); if (range.peek().id() == CSSValueInset) { if (!allowInset || style) return nullptr; @@ -1803,14 +1803,14 @@ spreadDistance.release(), style.release(), color.release()); } -static PassRefPtrWillBeRawPtr<CSSValue> consumeShadow(CSSParserTokenRange& range, const CSSParserContext& context, bool isBoxShadowProperty) +static PassRefPtrWillBeRawPtr<CSSValue> consumeShadow(CSSParserTokenRange& range, CSSParserMode cssParserMode, bool isBoxShadowProperty) { if (range.peek().id() == CSSValueNone) return consumeIdent(range); RefPtrWillBeRawPtr<CSSValueList> shadowValueList = CSSValueList::createCommaSeparated(); do { - if (RefPtrWillBeRawPtr<CSSShadowValue> shadowValue = parseSingleShadow(range, context, isBoxShadowProperty, isBoxShadowProperty)) + if (RefPtrWillBeRawPtr<CSSShadowValue> shadowValue = parseSingleShadow(range, cssParserMode, isBoxShadowProperty, isBoxShadowProperty)) shadowValueList->append(shadowValue.release()); else return nullptr; @@ -1818,7 +1818,7 @@ return shadowValueList; } -static PassRefPtrWillBeRawPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range, const CSSParserContext& context) +static PassRefPtrWillBeRawPtr<CSSFunctionValue> consumeFilterFunction(CSSParserTokenRange& range, CSSParserMode cssParserMode) { CSSValueID filterType = range.peek().functionId(); if (filterType < CSSValueInvert || filterType > CSSValueDropShadow) @@ -1828,7 +1828,7 @@ RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr; if (filterType == CSSValueDropShadow) { - parsedValue = parseSingleShadow(args, context, false, false); + parsedValue = parseSingleShadow(args, cssParserMode, false, false); } else { // TODO(timloh): Add UseCounters for empty filter arguments. if (args.atEnd()) @@ -1839,7 +1839,7 @@ if (!parsedValue) parsedValue = consumeNumber(args, ValueRangeAll); } else if (filterType == CSSValueHueRotate) { - parsedValue = consumeAngle(args, context.mode()); + parsedValue = consumeAngle(args, cssParserMode); } else if (filterType == CSSValueBlur) { parsedValue = consumeLength(args, HTMLStandardMode, ValueRangeNonNegative); } else { @@ -1860,7 +1860,7 @@ return filterValue.release(); } -static PassRefPtrWillBeRawPtr<CSSValue> consumeFilter(CSSParserTokenRange& range, const CSSParserContext& context) +static PassRefPtrWillBeRawPtr<CSSValue> consumeFilter(CSSParserTokenRange& range, CSSParserMode cssParserMode) { if (range.peek().id() == CSSValueNone) return consumeIdent(range); @@ -1873,7 +1873,7 @@ filterValue = CSSFunctionValue::create(CSSValueUrl); filterValue->append(CSSSVGDocumentValue::create(url)); } else { - filterValue = consumeFilterFunction(range, context); + filterValue = consumeFilterFunction(range, cssParserMode); if (!filterValue) return nullptr; } @@ -1993,13 +1993,13 @@ return nullptr; } -static PassRefPtrWillBeRawPtr<CSSValue> consumeOutlineColor(CSSParserTokenRange& range, const CSSParserContext& context) +static PassRefPtrWillBeRawPtr<CSSValue> consumeOutlineColor(CSSParserTokenRange& range, CSSParserMode cssParserMode) { // Outline color has "invert" as additional keyword. // Also, we want to allow the special focus color even in HTML Standard parsing mode. if (range.peek().id() == CSSValueInvert || range.peek().id() == CSSValueWebkitFocusRingColor) return consumeIdent(range); - return consumeColor(range, context); + return consumeColor(range, cssParserMode); } static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeLineWidth(CSSParserTokenRange& range, CSSParserMode cssParserMode) @@ -2202,7 +2202,7 @@ return consumePositionLonghand<CSSValueTop, CSSValueBottom>(range, cssParserMode); } -static PassRefPtrWillBeRawPtr<CSSValue> consumePaint(CSSParserTokenRange& range, CSSParserContext context) +static PassRefPtrWillBeRawPtr<CSSValue> consumePaint(CSSParserTokenRange& range, CSSParserMode cssParserMode) { if (range.peek().id() == CSSValueNone) return consumeIdent(range); @@ -2212,7 +2212,7 @@ if (range.peek().id() == CSSValueNone) parsedValue = consumeIdent(range); else - parsedValue = consumeColor(range, context); + parsedValue = consumeColor(range, cssParserMode); if (parsedValue) { RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated(); values->append(CSSURIValue::create(url)); @@ -2221,7 +2221,7 @@ } return CSSURIValue::create(url); } - return consumeColor(range, context); + return consumeColor(range, cssParserMode); } static PassRefPtrWillBeRawPtr<CSSValue> consumePaintOrder(CSSParserTokenRange& range) @@ -2317,7 +2317,7 @@ return consumeLengthOrPercent(range, SVGAttributeMode, ValueRangeAll, UnitlessQuirk::Forbid); } -static PassRefPtrWillBeRawPtr<CSSValue> consumeImageSet(CSSParserTokenRange& range, CSSParserContext context) +static PassRefPtrWillBeRawPtr<CSSValue> consumeImageSet(CSSParserTokenRange& range, const CSSParserContext& context) { CSSParserTokenRange rangeCopy = range; CSSParserTokenRange args = consumeFunction(rangeCopy); @@ -2347,7 +2347,7 @@ return imageSet.release(); } -static PassRefPtrWillBeRawPtr<CSSValue> consumeCursor(CSSParserTokenRange& range, CSSParserContext context, bool inQuirksMode) +static PassRefPtrWillBeRawPtr<CSSValue> consumeCursor(CSSParserTokenRange& range, const CSSParserContext& context, bool inQuirksMode) { RefPtrWillBeRawPtr<CSSValueList> list = nullptr; while (!range.atEnd()) { @@ -2540,7 +2540,7 @@ return consumeWidowsOrOrphans(m_range); case CSSPropertyTextDecorationColor: ASSERT(RuntimeEnabledFeatures::css3TextDecorationsEnabled()); - return consumeColor(m_range, m_context); + return consumeColor(m_range, m_context.mode()); case CSSPropertyWebkitTextStrokeWidth: return consumeTextStrokeWidth(m_range, m_context.mode()); case CSSPropertyWebkitTextFillColor: @@ -2555,9 +2555,9 @@ case CSSPropertyFloodColor: case CSSPropertyLightingColor: case CSSPropertyWebkitColumnRuleColor: - return consumeColor(m_range, m_context); + return consumeColor(m_range, m_context.mode()); case CSSPropertyColor: - return consumeColor(m_range, m_context, inQuirksMode()); + return consumeColor(m_range, m_context.mode(), inQuirksMode()); case CSSPropertyWebkitBorderStartWidth: case CSSPropertyWebkitBorderEndWidth: case CSSPropertyWebkitBorderBeforeWidth: @@ -2567,10 +2567,10 @@ return consumeZIndex(m_range); case CSSPropertyTextShadow: // CSS2 property, dropped in CSS2.1, back in CSS3, so treat as CSS3 case CSSPropertyBoxShadow: - return consumeShadow(m_range, m_context, property == CSSPropertyBoxShadow); + return consumeShadow(m_range, m_context.mode(), property == CSSPropertyBoxShadow); case CSSPropertyWebkitFilter: case CSSPropertyBackdropFilter: - return consumeFilter(m_range, m_context); + return consumeFilter(m_range, m_context.mode()); case CSSPropertyWebkitTextDecorationsInEffect: case CSSPropertyTextDecorationLine: return consumeTextDecorationLine(m_range); @@ -2583,7 +2583,7 @@ case CSSPropertyWebkitTextEmphasisStyle: return consumeTextEmphasisStyle(m_range); case CSSPropertyOutlineColor: - return consumeOutlineColor(m_range, m_context); + return consumeOutlineColor(m_range, m_context.mode()); case CSSPropertyOutlineOffset: return consumeLength(m_range, m_context.mode(), ValueRangeAll); case CSSPropertyOutlineWidth: @@ -2600,7 +2600,7 @@ return consumeLength(m_range, m_context.mode(), ValueRangeAll); case CSSPropertyFill: case CSSPropertyStroke: - return consumePaint(m_range, m_context); + return consumePaint(m_range, m_context.mode()); case CSSPropertyPaintOrder: return consumePaintOrder(m_range); case CSSPropertyMarkerStart: @@ -2668,7 +2668,7 @@ return values.release(); } -static PassRefPtrWillBeRawPtr<CSSValue> consumeFontFaceSrcURI(CSSParserTokenRange& range, CSSParserContext context) +static PassRefPtrWillBeRawPtr<CSSValue> consumeFontFaceSrcURI(CSSParserTokenRange& range, const CSSParserContext& context) { String url = consumeUrl(range); if (url.isNull()) @@ -2690,7 +2690,7 @@ return uriValue.release(); } -static PassRefPtrWillBeRawPtr<CSSValue> consumeFontFaceSrcLocal(CSSParserTokenRange& range, CSSParserContext context) +static PassRefPtrWillBeRawPtr<CSSValue> consumeFontFaceSrcLocal(CSSParserTokenRange& range, const CSSParserContext& context) { CSSParserTokenRange args = consumeFunction(range); ContentSecurityPolicyDisposition shouldCheckContentSecurityPolicy = context.shouldCheckContentSecurityPolicy(); @@ -2709,7 +2709,7 @@ return nullptr; } -static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceSrc(CSSParserTokenRange& range, CSSParserContext context) +static PassRefPtrWillBeRawPtr<CSSValueList> consumeFontFaceSrc(CSSParserTokenRange& range, const CSSParserContext& context) { RefPtrWillBeRawPtr<CSSValueList> values(CSSValueList::createCommaSeparated());
diff --git a/third_party/WebKit/Source/core/dom/ContainerNode.cpp b/third_party/WebKit/Source/core/dom/ContainerNode.cpp index de447cf4..a78cf21 100644 --- a/third_party/WebKit/Source/core/dom/ContainerNode.cpp +++ b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
@@ -532,7 +532,7 @@ RefPtrWillBeRawPtr<Node> protect(n); // removedFromDocument may remove all references to this node. container.document().adoptIfNeeded(*n); if (n->inDocument()) - container.notifyNodeRemoved(*n); + container.notifyNodeRemoved(*n, next); } } @@ -591,7 +591,7 @@ Node* prev = child->previousSibling(); Node* next = child->nextSibling(); removeBetween(prev, next, *child); - notifyNodeRemoved(*child); + notifyNodeRemoved(*child, next); childrenChanged(ChildrenChange::forRemoval(*child, prev, next, ChildrenChangeSourceAPI)); } dispatchSubtreeModifiedEvent(); @@ -643,7 +643,7 @@ Node* next = oldChild.nextSibling(); removeBetween(prev, next, oldChild); - notifyNodeRemoved(oldChild); + notifyNodeRemoved(oldChild, next); childrenChanged(ChildrenChange::forRemoval(oldChild, prev, next, ChildrenChangeSourceParser)); } @@ -695,11 +695,12 @@ removedChildren.reserveInitialCapacity(countChildren()); #endif while (RefPtrWillBeRawPtr<Node> child = m_firstChild) { - removeBetween(0, child->nextSibling(), *child); + Node* next = child->nextSibling(); + removeBetween(nullptr, next, *child); #if !ENABLE(OILPAN) removedChildren.append(child.get()); #endif - notifyNodeRemoved(*child); + notifyNodeRemoved(*child, next); } } @@ -847,7 +848,7 @@ } } -void ContainerNode::notifyNodeRemoved(Node& root) +void ContainerNode::notifyNodeRemoved(Node& root, Node* next) { ScriptForbiddenScope forbidScript; EventDispatchForbiddenScope assertNoEventDispatch; @@ -858,9 +859,9 @@ // call to removedFrom is not needed. if (!node.isContainerNode() && !node.isInTreeScope()) continue; - node.removedFrom(this); + node.removedFrom(this, node == root ? next : node.nextSibling()); for (ShadowRoot* shadowRoot = node.youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) - notifyNodeRemoved(*shadowRoot); + notifyNodeRemoved(*shadowRoot, next); } }
diff --git a/third_party/WebKit/Source/core/dom/ContainerNode.h b/third_party/WebKit/Source/core/dom/ContainerNode.h index 44f1f4e..87989667 100644 --- a/third_party/WebKit/Source/core/dom/ContainerNode.h +++ b/third_party/WebKit/Source/core/dom/ContainerNode.h
@@ -247,7 +247,7 @@ void notifyNodeInserted(Node&, ChildrenChangeSource = ChildrenChangeSourceAPI); void notifyNodeInsertedInternal(Node&, NodeVector& postInsertionNotificationTargets); - void notifyNodeRemoved(Node&); + void notifyNodeRemoved(Node& root, Node* next); bool hasRestyleFlag(DynamicRestyleFlags mask) const { return hasRareData() && hasRestyleFlagInternal(mask); } bool hasRestyleFlags() const { return hasRareData() && hasRestyleFlagsInternal(); }
diff --git a/third_party/WebKit/Source/core/dom/DocumentType.cpp b/third_party/WebKit/Source/core/dom/DocumentType.cpp index 78c5c4e..fb182a2 100644 --- a/third_party/WebKit/Source/core/dom/DocumentType.cpp +++ b/third_party/WebKit/Source/core/dom/DocumentType.cpp
@@ -68,10 +68,10 @@ return InsertionDone; } -void DocumentType::removedFrom(ContainerNode* insertionPoint) +void DocumentType::removedFrom(ContainerNode* insertionPoint, Node* next) { document().setDoctype(nullptr); - Node::removedFrom(insertionPoint); + Node::removedFrom(insertionPoint, next); } }
diff --git a/third_party/WebKit/Source/core/dom/DocumentType.h b/third_party/WebKit/Source/core/dom/DocumentType.h index 86549b2..6ec5916 100644 --- a/third_party/WebKit/Source/core/dom/DocumentType.h +++ b/third_party/WebKit/Source/core/dom/DocumentType.h
@@ -49,7 +49,7 @@ PassRefPtrWillBeRawPtr<Node> cloneNode(bool deep) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; String m_name; String m_publicId;
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp index 575b315..b82a53ac 100644 --- a/third_party/WebKit/Source/core/dom/Element.cpp +++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -1492,7 +1492,7 @@ return InsertionDone; } -void Element::removedFrom(ContainerNode* insertionPoint) +void Element::removedFrom(ContainerNode* insertionPoint, Node* next) { bool wasInDocument = insertionPoint->inDocument(); @@ -1524,7 +1524,7 @@ updateName(nameValue, nullAtom); } - ContainerNode::removedFrom(insertionPoint); + ContainerNode::removedFrom(insertionPoint, next); if (wasInDocument) { if (this == document().cssTarget()) document().setCSSTarget(nullptr);
diff --git a/third_party/WebKit/Source/core/dom/Element.h b/third_party/WebKit/Source/core/dom/Element.h index 473da92c..93a27d0 100644 --- a/third_party/WebKit/Source/core/dom/Element.h +++ b/third_party/WebKit/Source/core/dom/Element.h
@@ -563,7 +563,7 @@ void addPropertyToPresentationAttributeStyle(MutableStylePropertySet*, CSSPropertyID, PassRefPtrWillBeRawPtr<CSSValue>); InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void childrenChanged(const ChildrenChange&) override; virtual void willRecalcStyle(StyleRecalcChange); @@ -846,7 +846,7 @@ return InsertionDone; } -inline void Node::removedFrom(ContainerNode* insertionPoint) +inline void Node::removedFrom(ContainerNode* insertionPoint, Node* next) { ASSERT(insertionPoint->inDocument() || isContainerNode() || isInShadowTree()); if (insertionPoint->inDocument()) {
diff --git a/third_party/WebKit/Source/core/dom/Node.h b/third_party/WebKit/Source/core/dom/Node.h index 9424c99..c77514646 100644 --- a/third_party/WebKit/Source/core/dom/Node.h +++ b/third_party/WebKit/Source/core/dom/Node.h
@@ -577,7 +577,7 @@ // This is a dual of insertedInto(), and is similar to the DOMNodeRemovedFromDocument DOM event, but does not require the overhead of event // dispatching, and is called _after_ the node is removed from the tree. // - virtual void removedFrom(ContainerNode* insertionPoint); + virtual void removedFrom(ContainerNode* insertionPoint, Node* next); // FIXME(dominicc): This method is not debug-only--it is used by // Tracing--rename it to something indicative.
diff --git a/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp b/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp index d540c302..fd3c13f 100644 --- a/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp +++ b/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
@@ -274,9 +274,9 @@ return InsertionDone; } -void ProcessingInstruction::removedFrom(ContainerNode* insertionPoint) +void ProcessingInstruction::removedFrom(ContainerNode* insertionPoint, Node* next) { - CharacterData::removedFrom(insertionPoint); + CharacterData::removedFrom(insertionPoint, next); if (!insertionPoint->inDocument()) return;
diff --git a/third_party/WebKit/Source/core/dom/ProcessingInstruction.h b/third_party/WebKit/Source/core/dom/ProcessingInstruction.h index 48c3c64..b0a5a66 100644 --- a/third_party/WebKit/Source/core/dom/ProcessingInstruction.h +++ b/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
@@ -85,7 +85,7 @@ PassRefPtrWillBeRawPtr<Node> cloneNode(bool deep) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; bool checkStyleSheet(String& href, String& charset); void process(const String& href, const String& charset);
diff --git a/third_party/WebKit/Source/core/dom/PseudoElement.cpp b/third_party/WebKit/Source/core/dom/PseudoElement.cpp index c8aba370..be6e5cc 100644 --- a/third_party/WebKit/Source/core/dom/PseudoElement.cpp +++ b/third_party/WebKit/Source/core/dom/PseudoElement.cpp
@@ -112,7 +112,7 @@ RefPtrWillBeRawPtr<Element> parent = parentOrShadowHostElement(); document().adoptIfNeeded(*this); setParentOrShadowHostNode(0); - removedFrom(parent.get()); + removedFrom(parent.get(), nullptr); } void PseudoElement::attach(const AttachContext& context)
diff --git a/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.cpp b/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.cpp index eba7d6e..f6f3a22 100644 --- a/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.cpp +++ b/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.cpp
@@ -221,7 +221,7 @@ return InsertionDone; } -void InsertionPoint::removedFrom(ContainerNode* insertionPoint) +void InsertionPoint::removedFrom(ContainerNode* insertionPoint, Node* next) { ShadowRoot* root = containingShadowRoot(); if (!root) @@ -248,7 +248,7 @@ } } - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); } DEFINE_TRACE(InsertionPoint)
diff --git a/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.h b/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.h index 6f9e673..5db4e5e 100644 --- a/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.h +++ b/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.h
@@ -75,7 +75,7 @@ bool layoutObjectIsNeeded(const ComputedStyle&) override; void childrenChanged(const ChildrenChange&) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void willRecalcStyle(StyleRecalcChange) override; private:
diff --git a/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.cpp b/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.cpp index 0ad8b55..0d243d7f 100644 --- a/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.cpp +++ b/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.cpp
@@ -177,7 +177,7 @@ return InsertionDone; } -void ShadowRoot::removedFrom(ContainerNode* insertionPoint) +void ShadowRoot::removedFrom(ContainerNode* insertionPoint, Node* next) { if (insertionPoint->inDocument()) { document().styleEngine().shadowRootRemovedFromDocument(this); @@ -191,7 +191,7 @@ } } - DocumentFragment::removedFrom(insertionPoint); + DocumentFragment::removedFrom(insertionPoint, next); } void ShadowRoot::childrenChanged(const ChildrenChange& change)
diff --git a/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h b/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h index 6d23555..c149bad 100644 --- a/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h +++ b/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h
@@ -86,7 +86,7 @@ void attach(const AttachContext& = AttachContext()) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void registerScopedHTMLStyleChild(); void unregisterScopedHTMLStyleChild();
diff --git a/third_party/WebKit/Source/core/editing/DOMSelection.cpp b/third_party/WebKit/Source/core/editing/DOMSelection.cpp index 5578ccc..d1d378f 100644 --- a/third_party/WebKit/Source/core/editing/DOMSelection.cpp +++ b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
@@ -393,15 +393,11 @@ void DOMSelection::addRange(Range* newRange) { + ASSERT(newRange); + if (!m_frame) return; - // FIXME: Should we throw DOMException for error cases below? - if (!newRange) { - addConsoleError("The given range is null."); - return; - } - if (!newRange->inDocument()) { addConsoleError("The given range isn't in document."); return;
diff --git a/third_party/WebKit/Source/core/editing/Selection.idl b/third_party/WebKit/Source/core/editing/Selection.idl index 0cc455d1..5eeeb99 100644 --- a/third_party/WebKit/Source/core/editing/Selection.idl +++ b/third_party/WebKit/Source/core/editing/Selection.idl
@@ -42,7 +42,7 @@ [MeasureAs=SelectionRangeCount] readonly attribute long rangeCount; [MeasureAs=SelectionType] readonly attribute DOMString type; [MeasureAs=SelectionGetRangeAt, RaisesException] Range getRangeAt(long index); - [MeasureAs=SelectionAddRange, LegacyInterfaceTypeChecking] void addRange(Range range); + [MeasureAs=SelectionAddRange] void addRange(Range range); // TODO(yoichio): Implement removeRange. crbug.com/391673 //void removeRange(Range range); [MeasureAs=SelectionRemoveAllRanges] void removeAllRanges();
diff --git a/third_party/WebKit/Source/core/fetch/ResourceTest.cpp b/third_party/WebKit/Source/core/fetch/ResourceTest.cpp index 3a100eff..98f2cc29 100644 --- a/third_party/WebKit/Source/core/fetch/ResourceTest.cpp +++ b/third_party/WebKit/Source/core/fetch/ResourceTest.cpp
@@ -38,19 +38,19 @@ Vector<WebURL> m_cachedURLs; }; -PassOwnPtr<ResourceResponse> createTestResourceResponse() +ResourceResponse createTestResourceResponse() { - OwnPtr<ResourceResponse> response = adoptPtr(new ResourceResponse); - response->setURL(URLTestHelpers::toKURL("https://example.com/")); - response->setHTTPStatusCode(200); - return response.release(); + ResourceResponse response; + response.setURL(URLTestHelpers::toKURL("https://example.com/")); + response.setHTTPStatusCode(200); + return response; } -void createTestResourceAndSetCachedMetadata(const ResourceResponse* response) +void createTestResourceAndSetCachedMetadata(const ResourceResponse& response) { const char testData[] = "test data"; - ResourcePtr<Resource> resource = new Resource(ResourceRequest(response->url()), Resource::Raw); - resource->setResponse(*response); + ResourcePtr<Resource> resource = new Resource(ResourceRequest(response.url()), Resource::Raw); + resource->setResponse(response); resource->cacheHandler()->setCachedMetadata(100, testData, sizeof(testData), CachedMetadataHandler::SendToPlatform); return; } @@ -60,17 +60,17 @@ TEST(ResourceTest, SetCachedMetadata_SendsMetadataToPlatform) { MockPlatform mock; - OwnPtr<ResourceResponse> response(createTestResourceResponse()); - createTestResourceAndSetCachedMetadata(response.get()); + ResourceResponse response(createTestResourceResponse()); + createTestResourceAndSetCachedMetadata(response); EXPECT_EQ(1u, mock.cachedURLs().size()); } TEST(ResourceTest, SetCachedMetadata_DoesNotSendMetadataToPlatformWhenFetchedViaServiceWorker) { MockPlatform mock; - OwnPtr<ResourceResponse> response(createTestResourceResponse()); - response->setWasFetchedViaServiceWorker(true); - createTestResourceAndSetCachedMetadata(response.get()); + ResourceResponse response(createTestResourceResponse()); + response.setWasFetchedViaServiceWorker(true); + createTestResourceAndSetCachedMetadata(response); EXPECT_EQ(0u, mock.cachedURLs().size()); }
diff --git a/third_party/WebKit/Source/core/frame/SubresourceIntegrityTest.cpp b/third_party/WebKit/Source/core/frame/SubresourceIntegrityTest.cpp index 4e327b94..66b8f218 100644 --- a/third_party/WebKit/Source/core/frame/SubresourceIntegrityTest.cpp +++ b/third_party/WebKit/Source/core/frame/SubresourceIntegrityTest.cpp
@@ -163,15 +163,15 @@ ResourcePtr<Resource> createTestResource(const KURL& url, const KURL& allowOriginUrl, CorsStatus corsStatus) { - OwnPtr<ResourceResponse> response = adoptPtr(new ResourceResponse); - response->setURL(url); - response->setHTTPStatusCode(200); + ResourceResponse response; + response.setURL(url); + response.setHTTPStatusCode(200); if (corsStatus == WithCors) { - response->setHTTPHeaderField("access-control-allow-origin", SecurityOrigin::create(allowOriginUrl)->toAtomicString()); - response->setHTTPHeaderField("access-control-allow-credentials", "true"); + response.setHTTPHeaderField("access-control-allow-origin", SecurityOrigin::create(allowOriginUrl)->toAtomicString()); + response.setHTTPHeaderField("access-control-allow-credentials", "true"); } - ResourcePtr<Resource> resource = new Resource(ResourceRequest(response->url()), Resource::Raw); - resource->setResponse(*response); + ResourcePtr<Resource> resource = new Resource(ResourceRequest(response.url()), Resource::Raw); + resource->setResponse(response); return resource; }
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.cpp b/third_party/WebKit/Source/core/frame/UseCounter.cpp index 504334b..8b64750 100644 --- a/third_party/WebKit/Source/core/frame/UseCounter.cpp +++ b/third_party/WebKit/Source/core/frame/UseCounter.cpp
@@ -960,12 +960,12 @@ } } -void UseCounter::count(CSSParserContext context, CSSPropertyID feature) +void UseCounter::count(CSSParserMode cssParserMode, CSSPropertyID feature) { ASSERT(feature >= firstCSSProperty); ASSERT(feature <= lastUnresolvedCSSProperty); - if (!isUseCounterEnabledForMode(context.mode())) + if (!isUseCounterEnabledForMode(cssParserMode)) return; m_CSSFeatureBits.quickSet(feature);
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h index df660e2..300bd720 100644 --- a/third_party/WebKit/Source/core/frame/UseCounter.h +++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -936,6 +936,7 @@ AudioNodeConnectToAudioParam = 1079, AudioNodeDisconnectFromAudioNode = 1080, AudioNodeDisconnectFromAudioParam = 1081, + V8CSSFontFaceRule_Style_AttributeGetter = 1082, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots. @@ -957,7 +958,7 @@ static void countIfNotPrivateScript(v8::Isolate*, const Document&, Feature); static void countIfNotPrivateScript(v8::Isolate*, const ExecutionContext*, Feature); - void count(CSSParserContext, CSSPropertyID); + void count(CSSParserMode, CSSPropertyID); void count(Feature); // "countDeprecation" sets the bit for this feature to 1, and sends a deprecation
diff --git a/third_party/WebKit/Source/core/html/FormAssociatedElement.cpp b/third_party/WebKit/Source/core/html/FormAssociatedElement.cpp index d98ae0a..2f1b3f9 100644 --- a/third_party/WebKit/Source/core/html/FormAssociatedElement.cpp +++ b/third_party/WebKit/Source/core/html/FormAssociatedElement.cpp
@@ -96,7 +96,7 @@ resetFormAttributeTargetObserver(); } -void FormAssociatedElement::removedFrom(ContainerNode* insertionPoint) +void FormAssociatedElement::removedFrom(ContainerNode* insertionPoint, Node* next) { HTMLElement* element = toHTMLElement(this); if (insertionPoint->inDocument() && element->fastHasAttribute(formAttr)) {
diff --git a/third_party/WebKit/Source/core/html/FormAssociatedElement.h b/third_party/WebKit/Source/core/html/FormAssociatedElement.h index 73ce908..9b83025 100644 --- a/third_party/WebKit/Source/core/html/FormAssociatedElement.h +++ b/third_party/WebKit/Source/core/html/FormAssociatedElement.h
@@ -99,7 +99,7 @@ FormAssociatedElement(); void insertedInto(ContainerNode*); - void removedFrom(ContainerNode*); + void removedFrom(ContainerNode* insertionPoint, Node* next); void didMoveToNewDocument(Document& oldDocument); // FIXME: Remove usage of setForm. resetFormOwner should be enough, and
diff --git a/third_party/WebKit/Source/core/html/HTMLBaseElement.cpp b/third_party/WebKit/Source/core/html/HTMLBaseElement.cpp index 3348998..0d6a2827 100644 --- a/third_party/WebKit/Source/core/html/HTMLBaseElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLBaseElement.cpp
@@ -56,9 +56,9 @@ return InsertionDone; } -void HTMLBaseElement::removedFrom(ContainerNode* insertionPoint) +void HTMLBaseElement::removedFrom(ContainerNode* insertionPoint, Node* next) { - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); if (insertionPoint->inDocument()) document().processBaseElement(); }
diff --git a/third_party/WebKit/Source/core/html/HTMLBaseElement.h b/third_party/WebKit/Source/core/html/HTMLBaseElement.h index 6d5d16af..d14bbd9 100644 --- a/third_party/WebKit/Source/core/html/HTMLBaseElement.h +++ b/third_party/WebKit/Source/core/html/HTMLBaseElement.h
@@ -41,7 +41,7 @@ bool isURLAttribute(const Attribute&) const override; void parseAttribute(const QualifiedName&, const AtomicString&, const AtomicString&) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/HTMLDialogElement.cpp b/third_party/WebKit/Source/core/html/HTMLDialogElement.cpp index 03fb812..8496675 100644 --- a/third_party/WebKit/Source/core/html/HTMLDialogElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLDialogElement.cpp
@@ -171,9 +171,9 @@ setFocusForDialog(this); } -void HTMLDialogElement::removedFrom(ContainerNode* insertionPoint) +void HTMLDialogElement::removedFrom(ContainerNode* insertionPoint, Node* next) { - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); setNotCentered(); // FIXME: We should call inertSubtreesChanged() here. }
diff --git a/third_party/WebKit/Source/core/html/HTMLDialogElement.h b/third_party/WebKit/Source/core/html/HTMLDialogElement.h index 4a20fcc..52e9369 100644 --- a/third_party/WebKit/Source/core/html/HTMLDialogElement.h +++ b/third_party/WebKit/Source/core/html/HTMLDialogElement.h
@@ -43,7 +43,7 @@ void closeDialog(const String& returnValue = String()); void show(); void showModal(ExceptionState&); - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; // NotCentered means do not center the dialog. Centered means the dialog has // been centered and centeredPosition() is set. NeedsCentering means attempt
diff --git a/third_party/WebKit/Source/core/html/HTMLFormControlElement.cpp b/third_party/WebKit/Source/core/html/HTMLFormControlElement.cpp index 7847d89..92e5d93 100644 --- a/third_party/WebKit/Source/core/html/HTMLFormControlElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLFormControlElement.cpp
@@ -285,7 +285,7 @@ return InsertionDone; } -void HTMLFormControlElement::removedFrom(ContainerNode* insertionPoint) +void HTMLFormControlElement::removedFrom(ContainerNode* insertionPoint, Node* next) { fieldSetAncestorsSetNeedsValidityCheck(insertionPoint); hideVisibleValidationMessage(); @@ -293,8 +293,8 @@ m_ancestorDisabledState = AncestorDisabledStateUnknown; m_dataListAncestorState = Unknown; setNeedsWillValidateCheck(); - HTMLElement::removedFrom(insertionPoint); - FormAssociatedElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); + FormAssociatedElement::removedFrom(insertionPoint, next); document().removeFormAssociation(this); }
diff --git a/third_party/WebKit/Source/core/html/HTMLFormControlElement.h b/third_party/WebKit/Source/core/html/HTMLFormControlElement.h index aa34278..bd245ef 100644 --- a/third_party/WebKit/Source/core/html/HTMLFormControlElement.h +++ b/third_party/WebKit/Source/core/html/HTMLFormControlElement.h
@@ -128,7 +128,7 @@ virtual void disabledAttributeChanged(); void attach(const AttachContext& = AttachContext()) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void willChangeForm() override; void didChangeForm() override; void didMoveToNewDocument(Document& oldDocument) override;
diff --git a/third_party/WebKit/Source/core/html/HTMLFormControlElementWithState.cpp b/third_party/WebKit/Source/core/html/HTMLFormControlElementWithState.cpp index 88c2036..f0fdf919 100644 --- a/third_party/WebKit/Source/core/html/HTMLFormControlElementWithState.cpp +++ b/third_party/WebKit/Source/core/html/HTMLFormControlElementWithState.cpp
@@ -50,11 +50,11 @@ return HTMLFormControlElement::insertedInto(insertionPoint); } -void HTMLFormControlElementWithState::removedFrom(ContainerNode* insertionPoint) +void HTMLFormControlElementWithState::removedFrom(ContainerNode* insertionPoint, Node* next) { if (insertionPoint->inDocument() && !containingShadowRoot() && !insertionPoint->containingShadowRoot()) document().formController().unregisterStatefulFormControl(*this); - HTMLFormControlElement::removedFrom(insertionPoint); + HTMLFormControlElement::removedFrom(insertionPoint, next); } bool HTMLFormControlElementWithState::shouldAutocomplete() const
diff --git a/third_party/WebKit/Source/core/html/HTMLFormControlElementWithState.h b/third_party/WebKit/Source/core/html/HTMLFormControlElementWithState.h index 546e722..88262d8 100644 --- a/third_party/WebKit/Source/core/html/HTMLFormControlElementWithState.h +++ b/third_party/WebKit/Source/core/html/HTMLFormControlElementWithState.h
@@ -49,7 +49,7 @@ void finishParsingChildren() override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; bool isFormControlElementWithState() const final; };
diff --git a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp index df13f4ae..168d5b8 100644 --- a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
@@ -165,7 +165,7 @@ element->formRemovedFromTree(root); } -void HTMLFormElement::removedFrom(ContainerNode* insertionPoint) +void HTMLFormElement::removedFrom(ContainerNode* insertionPoint, Node* next) { // We don't need to take care of form association by 'form' content // attribute becuse IdTargetObserver handles it. @@ -196,7 +196,7 @@ #if ENABLE(OILPAN) document().formController().willDeleteForm(this); #endif - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); } void HTMLFormElement::handleLocalEvents(Event& event)
diff --git a/third_party/WebKit/Source/core/html/HTMLFormElement.h b/third_party/WebKit/Source/core/html/HTMLFormElement.h index 9bb909cb..ead53a8 100644 --- a/third_party/WebKit/Source/core/html/HTMLFormElement.h +++ b/third_party/WebKit/Source/core/html/HTMLFormElement.h
@@ -123,7 +123,7 @@ bool layoutObjectIsNeeded(const ComputedStyle&) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void finishParsingChildren() override; void handleLocalEvents(Event&) override;
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp b/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp index 43abe48..4168d7b4 100644 --- a/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLIFrameElement.cpp
@@ -134,9 +134,9 @@ return result; } -void HTMLIFrameElement::removedFrom(ContainerNode* insertionPoint) +void HTMLIFrameElement::removedFrom(ContainerNode* insertionPoint, Node* next) { - HTMLFrameElementBase::removedFrom(insertionPoint); + HTMLFrameElementBase::removedFrom(insertionPoint, next); if (insertionPoint->inDocument() && document().isHTMLDocument() && !insertionPoint->isInShadowTree()) toHTMLDocument(document()).removeExtraNamedItem(m_name); }
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElement.h b/third_party/WebKit/Source/core/html/HTMLIFrameElement.h index 3c52fda..97d679d 100644 --- a/third_party/WebKit/Source/core/html/HTMLIFrameElement.h +++ b/third_party/WebKit/Source/core/html/HTMLIFrameElement.h
@@ -46,7 +46,7 @@ void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStylePropertySet*) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; bool layoutObjectIsNeeded(const ComputedStyle&) override; LayoutObject* createLayoutObject(const ComputedStyle&) override;
diff --git a/third_party/WebKit/Source/core/html/HTMLImageElement.cpp b/third_party/WebKit/Source/core/html/HTMLImageElement.cpp index 858b47a..f61e6e7 100644 --- a/third_party/WebKit/Source/core/html/HTMLImageElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
@@ -270,7 +270,7 @@ if (text && text->textContent() != value) text->setTextContent(altText()); } - } else if (name == srcAttr || name == srcsetAttr || name == sizesAttr) { + } else if (name == srcAttr || ((name == srcsetAttr || name == sizesAttr) && (value != oldValue))) { selectSourceURL(ImageLoader::UpdateIgnorePreviousError); } else if (name == usemapAttr) { setIsLink(!value.isNull()); @@ -400,19 +400,26 @@ // If we have been inserted from a layoutObject-less document, // our loader may have not fetched the image, so do it now. - if ((insertionPoint->inDocument() && !imageLoader().image()) || imageWasModified) + if ((insertionPoint->inDocument() && !imageLoader().image()) || imageWasModified || isHTMLPictureElement(insertionPoint)) imageLoader().updateFromElement(ImageLoader::UpdateNormal, m_referrerPolicy); return HTMLElement::insertedInto(insertionPoint); } -void HTMLImageElement::removedFrom(ContainerNode* insertionPoint) +void HTMLImageElement::removedFrom(ContainerNode* insertionPoint, Node* next) { if (!m_form || NodeTraversal::highestAncestorOrSelf(*m_form.get()) != NodeTraversal::highestAncestorOrSelf(*this)) resetFormOwner(); if (m_listener) document().mediaQueryMatcher().removeViewportListener(m_listener); - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); + + if (isHTMLPictureElement(insertionPoint)) { + // This is diverging from the spec because we don't want to trigger spurious downloads of fallback images. + // See https://github.com/ResponsiveImagesCG/picture-element/issues/274 + m_bestFitImageURL = AtomicString(); + imageLoader().updateFromElement(ImageLoader::UpdateNormal, m_referrerPolicy); + } } int HTMLImageElement::width()
diff --git a/third_party/WebKit/Source/core/html/HTMLImageElement.h b/third_party/WebKit/Source/core/html/HTMLImageElement.h index 1191799e6..e3c936e 100644 --- a/third_party/WebKit/Source/core/html/HTMLImageElement.h +++ b/third_party/WebKit/Source/core/html/HTMLImageElement.h
@@ -148,7 +148,7 @@ bool draggable() const override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; bool shouldRegisterAsNamedItem() const override { return true; } bool shouldRegisterAsExtraNamedItem() const override { return true; } bool isInteractiveContent() const override;
diff --git a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp index 78231df..42851a4e 100644 --- a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
@@ -1515,12 +1515,12 @@ return InsertionShouldCallDidNotifySubtreeInsertions; } -void HTMLInputElement::removedFrom(ContainerNode* insertionPoint) +void HTMLInputElement::removedFrom(ContainerNode* insertionPoint, Node* next) { m_inputTypeView->closePopupView(); if (insertionPoint->inDocument() && !form()) removeFromRadioButtonGroup(); - HTMLTextFormControlElement::removedFrom(insertionPoint); + HTMLTextFormControlElement::removedFrom(insertionPoint, next); ASSERT(!inDocument()); resetListAttributeTargetObserver(); }
diff --git a/third_party/WebKit/Source/core/html/HTMLInputElement.h b/third_party/WebKit/Source/core/html/HTMLInputElement.h index 8fa7673..2d28e4b 100644 --- a/third_party/WebKit/Source/core/html/HTMLInputElement.h +++ b/third_party/WebKit/Source/core/html/HTMLInputElement.h
@@ -277,7 +277,7 @@ void willChangeForm() final; void didChangeForm() final; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) final; + void removedFrom(ContainerNode* insertionPoint, Node* next) final; void didMoveToNewDocument(Document& oldDocument) final; void removeAllEventListeners() final;
diff --git a/third_party/WebKit/Source/core/html/HTMLLabelElement.cpp b/third_party/WebKit/Source/core/html/HTMLLabelElement.cpp index 52932b1..fb13d31 100644 --- a/third_party/WebKit/Source/core/html/HTMLLabelElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLLabelElement.cpp
@@ -252,15 +252,15 @@ return result; } -void HTMLLabelElement::removedFrom(ContainerNode* insertionPoint) +void HTMLLabelElement::removedFrom(ContainerNode* insertionPoint, Node* next) { if (insertionPoint->isInTreeScope() && treeScope() == document()) { TreeScope& treeScope = insertionPoint->treeScope(); if (treeScope.shouldCacheLabelsByForAttribute()) updateLabel(treeScope, fastGetAttribute(forAttr), nullAtom); } - HTMLElement::removedFrom(insertionPoint); - FormAssociatedElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); + FormAssociatedElement::removedFrom(insertionPoint, next); document().removeFormAssociation(this); }
diff --git a/third_party/WebKit/Source/core/html/HTMLLabelElement.h b/third_party/WebKit/Source/core/html/HTMLLabelElement.h index fcdf958..ee6516e 100644 --- a/third_party/WebKit/Source/core/html/HTMLLabelElement.h +++ b/third_party/WebKit/Source/core/html/HTMLLabelElement.h
@@ -58,7 +58,7 @@ void accessKeyAction(bool sendMouseEvents) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; // Overridden to update the hover/active state of the corresponding control. void setActive(bool = true) override;
diff --git a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp index 56104327..1dbb604c 100644 --- a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
@@ -282,9 +282,9 @@ return InsertionDone; } -void HTMLLinkElement::removedFrom(ContainerNode* insertionPoint) +void HTMLLinkElement::removedFrom(ContainerNode* insertionPoint, Node* next) { - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); if (!insertionPoint->inDocument()) return;
diff --git a/third_party/WebKit/Source/core/html/HTMLLinkElement.h b/third_party/WebKit/Source/core/html/HTMLLinkElement.h index 42d102b5..4c998441 100644 --- a/third_party/WebKit/Source/core/html/HTMLLinkElement.h +++ b/third_party/WebKit/Source/core/html/HTMLLinkElement.h
@@ -194,7 +194,7 @@ // From Node and subclassses void parseAttribute(const QualifiedName&, const AtomicString&, const AtomicString&) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; bool isURLAttribute(const Attribute&) const override; bool hasLegalLinkAttribute(const QualifiedName&) const override; const QualifiedName& subResourceAttributeName() const override;
diff --git a/third_party/WebKit/Source/core/html/HTMLMapElement.cpp b/third_party/WebKit/Source/core/html/HTMLMapElement.cpp index d1e48c2..8a817ac 100644 --- a/third_party/WebKit/Source/core/html/HTMLMapElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLMapElement.cpp
@@ -117,11 +117,11 @@ return HTMLElement::insertedInto(insertionPoint); } -void HTMLMapElement::removedFrom(ContainerNode* insertionPoint) +void HTMLMapElement::removedFrom(ContainerNode* insertionPoint, Node* next) { if (insertionPoint->inDocument()) treeScope().removeImageMap(this); - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); } }
diff --git a/third_party/WebKit/Source/core/html/HTMLMapElement.h b/third_party/WebKit/Source/core/html/HTMLMapElement.h index 9afd66b0..976243b1 100644 --- a/third_party/WebKit/Source/core/html/HTMLMapElement.h +++ b/third_party/WebKit/Source/core/html/HTMLMapElement.h
@@ -50,7 +50,7 @@ void parseAttribute(const QualifiedName&, const AtomicString&, const AtomicString&) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; AtomicString m_name; };
diff --git a/third_party/WebKit/Source/core/html/HTMLMarqueeElement.cpp b/third_party/WebKit/Source/core/html/HTMLMarqueeElement.cpp index 95a8d107..5e41579e 100644 --- a/third_party/WebKit/Source/core/html/HTMLMarqueeElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLMarqueeElement.cpp
@@ -63,9 +63,9 @@ return InsertionDone; } -void HTMLMarqueeElement::removedFrom(ContainerNode* insertionPoint) +void HTMLMarqueeElement::removedFrom(ContainerNode* insertionPoint, Node* next) { - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); if (insertionPoint->inDocument()) { V8HTMLMarqueeElement::PrivateScript::detachedCallbackMethod(insertionPoint->document().frame(), this); }
diff --git a/third_party/WebKit/Source/core/html/HTMLMarqueeElement.h b/third_party/WebKit/Source/core/html/HTMLMarqueeElement.h index 8446b08..3e19ee9 100644 --- a/third_party/WebKit/Source/core/html/HTMLMarqueeElement.h +++ b/third_party/WebKit/Source/core/html/HTMLMarqueeElement.h
@@ -34,7 +34,7 @@ void attributeChanged(const QualifiedName&, const AtomicString& oldValue, const AtomicString& newValue, AttributeModificationReason) final; InsertionNotificationRequest insertedInto(ContainerNode*) final; - void removedFrom(ContainerNode*) final; + void removedFrom(ContainerNode* insertionPoint, Node* next) final; bool isHorizontal() const;
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp index db1f624d9..13a1482 100644 --- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
@@ -551,11 +551,11 @@ configureMediaControls(); } -void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) +void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint, Node* next) { WTF_LOG(Media, "HTMLMediaElement::removedFrom(%p, %p)", this, insertionPoint); - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); if (insertionPoint->inActiveDocument()) { configureMediaControls(); if (m_networkState > NETWORK_EMPTY)
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.h b/third_party/WebKit/Source/core/html/HTMLMediaElement.h index 1e6910b..1695af5 100644 --- a/third_party/WebKit/Source/core/html/HTMLMediaElement.h +++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.h
@@ -292,7 +292,7 @@ LayoutObject* createLayoutObject(const ComputedStyle&) override; InsertionNotificationRequest insertedInto(ContainerNode*) final; void didNotifySubtreeInsertionsToDocument() override; - void removedFrom(ContainerNode*) final; + void removedFrom(ContainerNode* insertionPoint, Node* next) final; void didRecalcStyle(StyleRecalcChange) final; bool canStartSelection() const override { return false; }
diff --git a/third_party/WebKit/Source/core/html/HTMLObjectElement.cpp b/third_party/WebKit/Source/core/html/HTMLObjectElement.cpp index bab324a..be530ee 100644 --- a/third_party/WebKit/Source/core/html/HTMLObjectElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLObjectElement.cpp
@@ -312,10 +312,10 @@ return InsertionDone; } -void HTMLObjectElement::removedFrom(ContainerNode* insertionPoint) +void HTMLObjectElement::removedFrom(ContainerNode* insertionPoint, Node* next) { - HTMLPlugInElement::removedFrom(insertionPoint); - FormAssociatedElement::removedFrom(insertionPoint); + HTMLPlugInElement::removedFrom(insertionPoint, next); + FormAssociatedElement::removedFrom(insertionPoint, next); } void HTMLObjectElement::childrenChanged(const ChildrenChange& change)
diff --git a/third_party/WebKit/Source/core/html/HTMLObjectElement.h b/third_party/WebKit/Source/core/html/HTMLObjectElement.h index 1a7970a..7410220 100644 --- a/third_party/WebKit/Source/core/html/HTMLObjectElement.h +++ b/third_party/WebKit/Source/core/html/HTMLObjectElement.h
@@ -79,7 +79,7 @@ void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStylePropertySet*) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void didMoveToNewDocument(Document& oldDocument) override;
diff --git a/third_party/WebKit/Source/core/html/HTMLOptionElement.cpp b/third_party/WebKit/Source/core/html/HTMLOptionElement.cpp index 07ba7a7..94c04ce 100644 --- a/third_party/WebKit/Source/core/html/HTMLOptionElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLOptionElement.cpp
@@ -389,7 +389,7 @@ return InsertionDone; } -void HTMLOptionElement::removedFrom(ContainerNode* insertionPoint) +void HTMLOptionElement::removedFrom(ContainerNode* insertionPoint, Node* next) { if (isHTMLSelectElement(*insertionPoint)) { if (!parentNode() || isHTMLOptGroupElement(*parentNode())) @@ -399,7 +399,7 @@ if (isHTMLSelectElement(parent)) toHTMLSelectElement(parent)->optionRemoved(*this); } - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); } String HTMLOptionElement::collectOptionInnerText() const
diff --git a/third_party/WebKit/Source/core/html/HTMLOptionElement.h b/third_party/WebKit/Source/core/html/HTMLOptionElement.h index 6202ec4..65602a9 100644 --- a/third_party/WebKit/Source/core/html/HTMLOptionElement.h +++ b/third_party/WebKit/Source/core/html/HTMLOptionElement.h
@@ -94,7 +94,7 @@ void detach(const AttachContext& = AttachContext()) override; void parseAttribute(const QualifiedName&, const AtomicString&, const AtomicString&) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void accessKeyAction(bool) override; void childrenChanged(const ChildrenChange&) override;
diff --git a/third_party/WebKit/Source/core/html/HTMLPictureElement.cpp b/third_party/WebKit/Source/core/html/HTMLPictureElement.cpp index f71379d..a3d1ab40 100644 --- a/third_party/WebKit/Source/core/html/HTMLPictureElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLPictureElement.cpp
@@ -9,6 +9,7 @@ #include "core/dom/ElementTraversal.h" #include "core/frame/UseCounter.h" #include "core/html/HTMLImageElement.h" +#include "core/html/HTMLSourceElement.h" #include "core/loader/ImageLoader.h" namespace blink { @@ -22,10 +23,19 @@ DEFINE_NODE_FACTORY(HTMLPictureElement) -void HTMLPictureElement::sourceOrMediaChanged() +void HTMLPictureElement::sourceOrMediaChanged(HTMLElement* sourceElement, Node* next) { - for (HTMLImageElement* imageElement = Traversal<HTMLImageElement>::firstChild(*this); imageElement; imageElement = Traversal<HTMLImageElement>::nextSibling(*imageElement)) { - imageElement->selectSourceURL(ImageLoader::UpdateNormal); + bool seenSource = false; + Node* node; + NodeVector potentialSourceNodes; + getChildNodes(*this, potentialSourceNodes); + + for (unsigned i = 0; i < potentialSourceNodes.size(); ++i) { + node = potentialSourceNodes[i].get(); + if (sourceElement == node || (next && node == next)) + seenSource = true; + if (isHTMLImageElement(node) && seenSource) + toHTMLImageElement(node)->selectSourceURL(ImageLoader::UpdateNormal); } }
diff --git a/third_party/WebKit/Source/core/html/HTMLPictureElement.h b/third_party/WebKit/Source/core/html/HTMLPictureElement.h index 80b44db4..1fc9f970 100644 --- a/third_party/WebKit/Source/core/html/HTMLPictureElement.h +++ b/third_party/WebKit/Source/core/html/HTMLPictureElement.h
@@ -14,7 +14,7 @@ public: DECLARE_NODE_FACTORY(HTMLPictureElement); - void sourceOrMediaChanged(); + void sourceOrMediaChanged(HTMLElement*, Node* next = nullptr); protected: explicit HTMLPictureElement(Document&);
diff --git a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp index 52f9c00f..8f6b0c9 100644 --- a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp
@@ -223,7 +223,7 @@ } } -void HTMLPlugInElement::removedFrom(ContainerNode* insertionPoint) +void HTMLPlugInElement::removedFrom(ContainerNode* insertionPoint, Node* next) { // If we've persisted the plugin and we're removed from the tree then // make sure we cleanup the persistance pointer. @@ -231,7 +231,7 @@ HTMLFrameOwnerElement::UpdateSuspendScope suspendWidgetHierarchyUpdates; setPersistedPluginWidget(nullptr); } - HTMLFrameOwnerElement::removedFrom(insertionPoint); + HTMLFrameOwnerElement::removedFrom(insertionPoint, next); } void HTMLPlugInElement::requestPluginCreationWithoutLayoutObjectIfPossible()
diff --git a/third_party/WebKit/Source/core/html/HTMLPlugInElement.h b/third_party/WebKit/Source/core/html/HTMLPlugInElement.h index da253c3..afe27dc4 100644 --- a/third_party/WebKit/Source/core/html/HTMLPlugInElement.h +++ b/third_party/WebKit/Source/core/html/HTMLPlugInElement.h
@@ -69,7 +69,7 @@ void requestPluginCreationWithoutLayoutObjectIfPossible(); void createPluginWithoutLayoutObject(); - void removedFrom(ContainerNode* insertionPoint) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; protected: HTMLPlugInElement(const QualifiedName& tagName, Document&, bool createdByParser, PreferPlugInsForImagesOption);
diff --git a/third_party/WebKit/Source/core/html/HTMLSourceElement.cpp b/third_party/WebKit/Source/core/html/HTMLSourceElement.cpp index 36f820d..8e5b1eff 100644 --- a/third_party/WebKit/Source/core/html/HTMLSourceElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLSourceElement.cpp
@@ -108,20 +108,20 @@ if (isHTMLMediaElement(parent)) toHTMLMediaElement(parent)->sourceWasAdded(this); if (isHTMLPictureElement(parent)) - toHTMLPictureElement(parent)->sourceOrMediaChanged(); + toHTMLPictureElement(parent)->sourceOrMediaChanged(this); return InsertionDone; } -void HTMLSourceElement::removedFrom(ContainerNode* removalRoot) +void HTMLSourceElement::removedFrom(ContainerNode* insertionPoint, Node* next) { Element* parent = parentElement(); - if (!parent && removalRoot->isElementNode()) - parent = toElement(removalRoot); + if (!parent && insertionPoint->isElementNode()) + parent = toElement(insertionPoint); if (isHTMLMediaElement(parent)) toHTMLMediaElement(parent)->sourceWasRemoved(this); if (isHTMLPictureElement(parent)) - toHTMLPictureElement(parent)->sourceOrMediaChanged(); - HTMLElement::removedFrom(removalRoot); + toHTMLPictureElement(parent)->sourceOrMediaChanged(this, next); + HTMLElement::removedFrom(insertionPoint, next); } void HTMLSourceElement::setSrc(const String& url) @@ -179,7 +179,7 @@ if (name == srcsetAttr || name == sizesAttr || name == mediaAttr || name == typeAttr) { Element* parent = parentElement(); if (isHTMLPictureElement(parent)) - toHTMLPictureElement(parent)->sourceOrMediaChanged(); + toHTMLPictureElement(parent)->sourceOrMediaChanged(this); } } @@ -187,7 +187,7 @@ { Element* parent = parentElement(); if (isHTMLPictureElement(parent)) - toHTMLPictureElement(parent)->sourceOrMediaChanged(); + toHTMLPictureElement(parent)->sourceOrMediaChanged(this); } DEFINE_TRACE(HTMLSourceElement)
diff --git a/third_party/WebKit/Source/core/html/HTMLSourceElement.h b/third_party/WebKit/Source/core/html/HTMLSourceElement.h index 35b4229..fb395d38 100644 --- a/third_party/WebKit/Source/core/html/HTMLSourceElement.h +++ b/third_party/WebKit/Source/core/html/HTMLSourceElement.h
@@ -62,7 +62,7 @@ void didMoveToNewDocument(Document& oldDocument) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; bool isURLAttribute(const Attribute&) const override; void parseAttribute(const QualifiedName&, const AtomicString&, const AtomicString&) override;
diff --git a/third_party/WebKit/Source/core/html/HTMLStyleElement.cpp b/third_party/WebKit/Source/core/html/HTMLStyleElement.cpp index f562876..030fd112 100644 --- a/third_party/WebKit/Source/core/html/HTMLStyleElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLStyleElement.cpp
@@ -90,9 +90,9 @@ return InsertionShouldCallDidNotifySubtreeInsertions; } -void HTMLStyleElement::removedFrom(ContainerNode* insertionPoint) +void HTMLStyleElement::removedFrom(ContainerNode* insertionPoint, Node* next) { - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); StyleElement::removedFrom(this, insertionPoint); }
diff --git a/third_party/WebKit/Source/core/html/HTMLStyleElement.h b/third_party/WebKit/Source/core/html/HTMLStyleElement.h index 476052b..668e104 100644 --- a/third_party/WebKit/Source/core/html/HTMLStyleElement.h +++ b/third_party/WebKit/Source/core/html/HTMLStyleElement.h
@@ -57,7 +57,7 @@ void parseAttribute(const QualifiedName&, const AtomicString&, const AtomicString&) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; void didNotifySubtreeInsertionsToDocument() override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void childrenChanged(const ChildrenChange&) override; void finishParsingChildren() override;
diff --git a/third_party/WebKit/Source/core/html/HTMLTitleElement.cpp b/third_party/WebKit/Source/core/html/HTMLTitleElement.cpp index 30e6735b..94e5126 100644 --- a/third_party/WebKit/Source/core/html/HTMLTitleElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLTitleElement.cpp
@@ -52,9 +52,9 @@ return InsertionDone; } -void HTMLTitleElement::removedFrom(ContainerNode* insertionPoint) +void HTMLTitleElement::removedFrom(ContainerNode* insertionPoint, Node* next) { - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); if (insertionPoint->inDocument() && !insertionPoint->isInShadowTree()) document().removeTitle(this); }
diff --git a/third_party/WebKit/Source/core/html/HTMLTitleElement.h b/third_party/WebKit/Source/core/html/HTMLTitleElement.h index a68f395..6457653 100644 --- a/third_party/WebKit/Source/core/html/HTMLTitleElement.h +++ b/third_party/WebKit/Source/core/html/HTMLTitleElement.h
@@ -38,7 +38,7 @@ explicit HTMLTitleElement(Document&); InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void childrenChanged(const ChildrenChange&) override; bool m_ignoreTitleUpdatesWhenChildrenChange;
diff --git a/third_party/WebKit/Source/core/html/HTMLTrackElement.cpp b/third_party/WebKit/Source/core/html/HTMLTrackElement.cpp index 692af72..4fe466a 100644 --- a/third_party/WebKit/Source/core/html/HTMLTrackElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLTrackElement.cpp
@@ -80,11 +80,11 @@ return InsertionDone; } -void HTMLTrackElement::removedFrom(ContainerNode* insertionPoint) +void HTMLTrackElement::removedFrom(ContainerNode* insertionPoint, Node* next) { if (!parentNode() && isHTMLMediaElement(*insertionPoint)) toHTMLMediaElement(insertionPoint)->didRemoveTrackElement(this); - HTMLElement::removedFrom(insertionPoint); + HTMLElement::removedFrom(insertionPoint, next); } void HTMLTrackElement::parseAttribute(const QualifiedName& name, const AtomicString& oldValue, const AtomicString& value)
diff --git a/third_party/WebKit/Source/core/html/HTMLTrackElement.h b/third_party/WebKit/Source/core/html/HTMLTrackElement.h index 8d1d1990..c07ab0e 100644 --- a/third_party/WebKit/Source/core/html/HTMLTrackElement.h +++ b/third_party/WebKit/Source/core/html/HTMLTrackElement.h
@@ -65,7 +65,7 @@ InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; bool isURLAttribute(const Attribute&) const override; // TextTrackLoaderClient
diff --git a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp index cd85476..9d3cf988c 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutTreeAsText.cpp
@@ -410,7 +410,7 @@ { writeIndent(ts, indent); ts << "+ "; - ts << box.boxName() << " {" << box.layoutObject().debugName() << "}" + ts << box.boxName() << " {" << box.lineLayoutItem().debugName() << "}" << " pos=(" << box.x() << "," << box.y() << ")" << " size=(" << box.width() << "," << box.height() << ")" << " baseline=" << box.baselinePosition(AlphabeticBaseline)
diff --git a/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h b/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h index 73d8d8283..7f4afcd4 100644 --- a/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h +++ b/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h
@@ -49,6 +49,11 @@ return m_layoutObject == layoutObject; } + String debugName() const + { + return m_layoutObject->debugName(); + } + bool needsLayout() const { return m_layoutObject->needsLayout();
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp index d323bb2b..1c33abe 100644 --- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp +++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -206,8 +206,8 @@ else newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeCORS); - m_fallbackRequestForServiceWorker = adoptPtr(new ResourceRequest(request)); - m_fallbackRequestForServiceWorker->setSkipServiceWorker(true); + m_fallbackRequestForServiceWorker = ResourceRequest(request); + m_fallbackRequestForServiceWorker.setSkipServiceWorker(true); loadRequest(newRequest, m_resourceLoaderOptions); return; @@ -260,21 +260,21 @@ } else { m_crossOriginNonSimpleRequest = true; - OwnPtr<ResourceRequest> crossOriginRequest = adoptPtr(new ResourceRequest(request)); - OwnPtr<ResourceLoaderOptions> crossOriginOptions = adoptPtr(new ResourceLoaderOptions(m_resourceLoaderOptions)); + ResourceRequest crossOriginRequest(request); + ResourceLoaderOptions crossOriginOptions(m_resourceLoaderOptions); // Do not set the Origin header for preflight requests. - updateRequestForAccessControl(*crossOriginRequest, 0, effectiveAllowCredentials()); - m_actualRequest = crossOriginRequest.release(); - m_actualOptions = crossOriginOptions.release(); + updateRequestForAccessControl(crossOriginRequest, 0, effectiveAllowCredentials()); + m_actualRequest = crossOriginRequest; + m_actualOptions = crossOriginOptions; bool shouldForcePreflight = InspectorInstrumentation::shouldForceCORSPreflight(m_document); - bool canSkipPreflight = CrossOriginPreflightResultCache::shared().canSkipPreflight(securityOrigin()->toString(), m_actualRequest->url(), effectiveAllowCredentials(), m_actualRequest->httpMethod(), m_actualRequest->httpHeaderFields()); + bool canSkipPreflight = CrossOriginPreflightResultCache::shared().canSkipPreflight(securityOrigin()->toString(), m_actualRequest.url(), effectiveAllowCredentials(), m_actualRequest.httpMethod(), m_actualRequest.httpHeaderFields()); if (canSkipPreflight && !shouldForcePreflight) { loadActualRequest(); } else { - ResourceRequest preflightRequest = createAccessControlPreflightRequest(*m_actualRequest, securityOrigin()); + ResourceRequest preflightRequest = createAccessControlPreflightRequest(m_actualRequest, securityOrigin()); // Create a ResourceLoaderOptions for preflight. - ResourceLoaderOptions preflightOptions = *m_actualOptions; + ResourceLoaderOptions preflightOptions = m_actualOptions; preflightOptions.allowCredentials = DoNotAllowStoredCredentials; loadRequest(preflightRequest, preflightOptions); } @@ -368,7 +368,7 @@ ASSERT_UNUSED(resource, resource == this->resource()); ASSERT(m_async); - if (m_actualRequest) { + if (!m_actualRequest.isNull()) { reportResponseReceived(resource->identifier(), redirectResponse); handlePreflightFailure(redirectResponse.url().string(), "Response for preflight is invalid (redirect)"); @@ -397,7 +397,7 @@ responseReceived(resource, redirectResponse, adoptPtr(new EmptyDataHandle())); if (m_client) { - ASSERT(!m_actualRequest); + ASSERT(m_actualRequest.isNull()); notifyFinished(resource); } @@ -508,7 +508,7 @@ { ASSERT(m_client); ASSERT_UNUSED(resource, resource == this->resource()); - ASSERT(!m_actualRequest); + ASSERT(m_actualRequest.isNull()); ASSERT(m_async); m_client->didDownloadData(dataLength); @@ -555,14 +555,14 @@ OwnPtr<CrossOriginPreflightResultCacheItem> preflightResult = adoptPtr(new CrossOriginPreflightResultCacheItem(effectiveAllowCredentials())); if (!preflightResult->parse(response, accessControlErrorDescription) - || !preflightResult->allowsCrossOriginMethod(m_actualRequest->httpMethod(), accessControlErrorDescription) - || !preflightResult->allowsCrossOriginHeaders(m_actualRequest->httpHeaderFields(), accessControlErrorDescription)) { + || !preflightResult->allowsCrossOriginMethod(m_actualRequest.httpMethod(), accessControlErrorDescription) + || !preflightResult->allowsCrossOriginHeaders(m_actualRequest.httpHeaderFields(), accessControlErrorDescription)) { handlePreflightFailure(response.url().string(), accessControlErrorDescription); // |this| may be dead here in async mode. return; } - CrossOriginPreflightResultCache::shared().appendEntry(securityOrigin()->toString(), m_actualRequest->url(), preflightResult.release()); + CrossOriginPreflightResultCache::shared().appendEntry(securityOrigin()->toString(), m_actualRequest.url(), preflightResult.release()); } void DocumentThreadableLoader::reportResponseReceived(unsigned long identifier, const ResourceResponse& response) @@ -578,7 +578,7 @@ { ASSERT(m_client); - if (m_actualRequest) { + if (!m_actualRequest.isNull()) { reportResponseReceived(identifier, response); handlePreflightResponse(response); // |this| may be dead here in async mode. @@ -589,19 +589,19 @@ // It's still possible to reach here with null m_fallbackRequestForServiceWorker // if the request was for main resource loading (i.e. for SharedWorker), for which // we create DocumentLoader before the controller ServiceWorker is set. - ASSERT(m_fallbackRequestForServiceWorker || m_requestContext == WebURLRequest::RequestContextSharedWorker); + ASSERT(!m_fallbackRequestForServiceWorker.isNull() || m_requestContext == WebURLRequest::RequestContextSharedWorker); if (response.wasFallbackRequiredByServiceWorker()) { // At this point we must have m_fallbackRequestForServiceWorker. // (For SharedWorker the request won't be CORS or CORS-with-preflight, // therefore fallback-to-network is handled in the browser process // when the ServiceWorker does not call respondWith().) - ASSERT(m_fallbackRequestForServiceWorker); + ASSERT(!m_fallbackRequestForServiceWorker.isNull()); reportResponseReceived(identifier, response); loadFallbackRequestForServiceWorker(); // |this| may be dead here in async mode. return; } - m_fallbackRequestForServiceWorker = nullptr; + m_fallbackRequestForServiceWorker = ResourceRequest(); m_client->didReceiveResponse(identifier, response, handle); return; } @@ -615,8 +615,8 @@ // loadFallbackRequestForServiceWorker(). // FIXME: We should use |m_sameOriginRequest| when we will support // Suborigins (crbug.com/336894) for Service Worker. - ASSERT(!m_fallbackRequestForServiceWorker || securityOrigin()->canRequest(m_fallbackRequestForServiceWorker->url())); - m_fallbackRequestForServiceWorker = nullptr; + ASSERT(m_fallbackRequestForServiceWorker.isNull() || securityOrigin()->canRequest(m_fallbackRequestForServiceWorker.url())); + m_fallbackRequestForServiceWorker = ResourceRequest(); if (!m_sameOriginRequest && m_options.crossOriginRequestPolicy == UseAccessControl) { String accessControlErrorDescription; @@ -636,7 +636,7 @@ void DocumentThreadableLoader::setSerializedCachedMetadata(Resource*, const char* data, size_t size) { - if (m_actualRequest) + if (!m_actualRequest.isNull()) return; m_client->didReceiveCachedMetadata(data, size); // |this| may be dead here. @@ -659,10 +659,10 @@ ASSERT(m_client); // Preflight data should be invisible to clients. - if (m_actualRequest) + if (!m_actualRequest.isNull()) return; - ASSERT(!m_fallbackRequestForServiceWorker); + ASSERT(m_fallbackRequestForServiceWorker.isNull()); m_client->didReceiveData(data, dataLength); // |this| may be dead here in async mode. @@ -685,9 +685,9 @@ void DocumentThreadableLoader::handleSuccessfulFinish(unsigned long identifier, double finishTime) { - ASSERT(!m_fallbackRequestForServiceWorker); + ASSERT(m_fallbackRequestForServiceWorker.isNull()); - if (m_actualRequest) { + if (!m_actualRequest.isNull()) { // FIXME: Timeout should be applied to whole fetch, not for each of // preflight and actual request. m_timeoutTimer.stop(); @@ -725,23 +725,24 @@ void DocumentThreadableLoader::loadFallbackRequestForServiceWorker() { clearResource(); - OwnPtr<ResourceRequest> fallbackRequest(m_fallbackRequestForServiceWorker.release()); - dispatchInitialRequest(*fallbackRequest); + ResourceRequest fallbackRequest(m_fallbackRequestForServiceWorker); + m_fallbackRequestForServiceWorker = ResourceRequest(); + dispatchInitialRequest(fallbackRequest); // |this| may be dead here in async mode. } void DocumentThreadableLoader::loadActualRequest() { - OwnPtr<ResourceRequest> actualRequest; - actualRequest.swap(m_actualRequest); - OwnPtr<ResourceLoaderOptions> actualOptions; - actualOptions.swap(m_actualOptions); + ResourceRequest actualRequest = m_actualRequest; + ResourceLoaderOptions actualOptions = m_actualOptions; + m_actualRequest = ResourceRequest(); + m_actualOptions = ResourceLoaderOptions(); - actualRequest->setHTTPOrigin(securityOrigin()); + actualRequest.setHTTPOrigin(securityOrigin()); clearResource(); - loadRequest(*actualRequest, *actualOptions); + loadRequest(actualRequest, actualOptions); } void DocumentThreadableLoader::handlePreflightFailure(const String& url, const String& errorDescription) @@ -749,7 +750,7 @@ ResourceError error(errorDomainBlinkInternal, 0, url, errorDescription); // Prevent handleSuccessfulFinish() from bypassing access check. - m_actualRequest = nullptr; + m_actualRequest = ResourceRequest(); ThreadableLoaderClient* client = m_client; clear(); @@ -782,7 +783,7 @@ resourceLoaderOptions.allowCredentials = DoNotAllowStoredCredentials; resourceLoaderOptions.securityOrigin = m_securityOrigin; if (m_async) { - if (m_actualRequest) + if (!m_actualRequest.isNull()) resourceLoaderOptions.dataBufferingPolicy = BufferData; if (m_options.timeoutMilliseconds > 0)
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h index d2702142..cd794c4 100644 --- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h +++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
@@ -179,12 +179,12 @@ // Holds the original request for fallback in case the Service Worker // does not respond. - OwnPtr<ResourceRequest> m_fallbackRequestForServiceWorker; + ResourceRequest m_fallbackRequestForServiceWorker; // Holds the original request and options for it during preflight // request handling phase. - OwnPtr<ResourceRequest> m_actualRequest; - OwnPtr<ResourceLoaderOptions> m_actualOptions; + ResourceRequest m_actualRequest; + ResourceLoaderOptions m_actualOptions; HTTPHeaderMap m_simpleRequestHeaders; // stores simple request headers in case of a cross-origin redirect. Timer<DocumentThreadableLoader> m_timeoutTimer;
diff --git a/third_party/WebKit/Source/core/loader/WorkerLoaderClientBridge.cpp b/third_party/WebKit/Source/core/loader/WorkerLoaderClientBridge.cpp index cd889bb..6377de6e 100644 --- a/third_party/WebKit/Source/core/loader/WorkerLoaderClientBridge.cpp +++ b/third_party/WebKit/Source/core/loader/WorkerLoaderClientBridge.cpp
@@ -67,8 +67,8 @@ static void workerGlobalScopeDidReceiveResponse(PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, unsigned long identifier, PassOwnPtr<CrossThreadResourceResponseData> responseData, PassOwnPtr<WebDataConsumerHandle> handle, ExecutionContext* context) { ASSERT_UNUSED(context, context->isWorkerGlobalScope()); - OwnPtr<ResourceResponse> response(ResourceResponse::adopt(responseData)); - workerClientWrapper->didReceiveResponse(identifier, *response, handle); + ResourceResponse response(responseData.get()); + workerClientWrapper->didReceiveResponse(identifier, response, handle); } void WorkerLoaderClientBridge::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle)
diff --git a/third_party/WebKit/Source/core/loader/WorkerLoaderClientBridgeSyncHelper.cpp b/third_party/WebKit/Source/core/loader/WorkerLoaderClientBridgeSyncHelper.cpp index 81bb1deb..1873aed8 100644 --- a/third_party/WebKit/Source/core/loader/WorkerLoaderClientBridgeSyncHelper.cpp +++ b/third_party/WebKit/Source/core/loader/WorkerLoaderClientBridgeSyncHelper.cpp
@@ -75,8 +75,8 @@ static void didReceiveResponseAdapter(ThreadableLoaderClientWrapper* client, unsigned long identifier, PassOwnPtr<CrossThreadResourceResponseData> responseData, PassOwnPtr<WebDataConsumerHandle> handle) { - OwnPtr<ResourceResponse> response(ResourceResponse::adopt(responseData)); - client->didReceiveResponse(identifier, *response, handle); + ResourceResponse response(responseData.get()); + client->didReceiveResponse(identifier, response, handle); } void WorkerLoaderClientBridgeSyncHelper::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle)
diff --git a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp index 1b28e4f..40a5c5c 100644 --- a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp +++ b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
@@ -142,14 +142,14 @@ ASSERT(isMainThread()); Document* document = toDocument(context); - OwnPtr<ResourceRequest> request(ResourceRequest::adopt(requestData)); - if (!request->didSetHTTPReferrer()) - request->setHTTPReferrer(SecurityPolicy::generateReferrer(referrerPolicy, request->url(), outgoingReferrer)); + ResourceRequest request(requestData.get()); + if (!request.didSetHTTPReferrer()) + request.setHTTPReferrer(SecurityPolicy::generateReferrer(referrerPolicy, request.url(), outgoingReferrer)); resourceLoaderOptions.requestInitiatorContext = WorkerContext; - m_mainThreadLoader = DocumentThreadableLoader::create(*document, this, *request, options, resourceLoaderOptions); + m_mainThreadLoader = DocumentThreadableLoader::create(*document, this, request, options, resourceLoaderOptions); if (!m_mainThreadLoader) { // DocumentThreadableLoader::create may return 0 when the document loader has been already changed. - didFail(ResourceError(errorDomainBlinkInternal, 0, request->url().string(), "Can't create DocumentThreadableLoader")); + didFail(ResourceError(errorDomainBlinkInternal, 0, request.url().string(), "Can't create DocumentThreadableLoader")); } }
diff --git a/third_party/WebKit/Source/core/svg/SVGElement.cpp b/third_party/WebKit/Source/core/svg/SVGElement.cpp index d545acb3..4f7fc016 100644 --- a/third_party/WebKit/Source/core/svg/SVGElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGElement.cpp
@@ -291,7 +291,7 @@ return InsertionDone; } -void SVGElement::removedFrom(ContainerNode* rootParent) +void SVGElement::removedFrom(ContainerNode* rootParent, Node* next) { bool wasInDocument = rootParent->inDocument(); @@ -309,7 +309,7 @@ ASSERT_WITH_SECURITY_IMPLICATION(!rootParent->isSVGElement() || !toSVGElement(rootParent)->m_elementsWithRelativeLengths.contains(this)); - Element::removedFrom(rootParent); + Element::removedFrom(rootParent, next); if (wasInDocument) { rebuildAllIncomingReferences();
diff --git a/third_party/WebKit/Source/core/svg/SVGElement.h b/third_party/WebKit/Source/core/svg/SVGElement.h index 4b9430e..649e589 100644 --- a/third_party/WebKit/Source/core/svg/SVGElement.h +++ b/third_party/WebKit/Source/core/svg/SVGElement.h
@@ -200,7 +200,7 @@ void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStylePropertySet*) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void childrenChanged(const ChildrenChange&) override; static CSSPropertyID cssPropertyIdForSVGAttributeName(const QualifiedName&);
diff --git a/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp b/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp index ec9b5cc5..36562bb 100644 --- a/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp
@@ -137,9 +137,9 @@ return InsertionDone; } -void SVGFEImageElement::removedFrom(ContainerNode* rootParent) +void SVGFEImageElement::removedFrom(ContainerNode* rootParent, Node* next) { - SVGFilterPrimitiveStandardAttributes::removedFrom(rootParent); + SVGFilterPrimitiveStandardAttributes::removedFrom(rootParent, next); if (rootParent->inDocument()) clearResourceReferences(); }
diff --git a/third_party/WebKit/Source/core/svg/SVGFEImageElement.h b/third_party/WebKit/Source/core/svg/SVGFEImageElement.h index fe54161..578a25db 100644 --- a/third_party/WebKit/Source/core/svg/SVGFEImageElement.h +++ b/third_party/WebKit/Source/core/svg/SVGFEImageElement.h
@@ -63,7 +63,7 @@ void buildPendingResource() override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; RefPtrWillBeMember<SVGAnimatedPreserveAspectRatio> m_preserveAspectRatio;
diff --git a/third_party/WebKit/Source/core/svg/SVGMPathElement.cpp b/third_party/WebKit/Source/core/svg/SVGMPathElement.cpp index cd071bcb..c2379aa 100644 --- a/third_party/WebKit/Source/core/svg/SVGMPathElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGMPathElement.cpp
@@ -90,9 +90,9 @@ return InsertionDone; } -void SVGMPathElement::removedFrom(ContainerNode* rootParent) +void SVGMPathElement::removedFrom(ContainerNode* rootParent, Node* next) { - SVGElement::removedFrom(rootParent); + SVGElement::removedFrom(rootParent, next); notifyParentOfPathChange(rootParent); if (rootParent->inDocument()) clearResourceReferences();
diff --git a/third_party/WebKit/Source/core/svg/SVGMPathElement.h b/third_party/WebKit/Source/core/svg/SVGMPathElement.h index a9cdc20..9f36fdc 100644 --- a/third_party/WebKit/Source/core/svg/SVGMPathElement.h +++ b/third_party/WebKit/Source/core/svg/SVGMPathElement.h
@@ -51,7 +51,7 @@ void buildPendingResource() override; void clearResourceReferences(); InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void svgAttributeChanged(const QualifiedName&) override;
diff --git a/third_party/WebKit/Source/core/svg/SVGPathElement.cpp b/third_party/WebKit/Source/core/svg/SVGPathElement.cpp index dc0b4b4..37350343 100644 --- a/third_party/WebKit/Source/core/svg/SVGPathElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGPathElement.cpp
@@ -137,9 +137,9 @@ return InsertionDone; } -void SVGPathElement::removedFrom(ContainerNode* rootParent) +void SVGPathElement::removedFrom(ContainerNode* rootParent, Node* next) { - SVGGeometryElement::removedFrom(rootParent); + SVGGeometryElement::removedFrom(rootParent, next); invalidateMPathDependencies(); }
diff --git a/third_party/WebKit/Source/core/svg/SVGPathElement.h b/third_party/WebKit/Source/core/svg/SVGPathElement.h index c50a3e5..2a55d593 100644 --- a/third_party/WebKit/Source/core/svg/SVGPathElement.h +++ b/third_party/WebKit/Source/core/svg/SVGPathElement.h
@@ -51,7 +51,7 @@ void svgAttributeChanged(const QualifiedName&) override; Node::InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void invalidateMPathDependencies();
diff --git a/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp b/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp index 8c4803a..4d1db6e2 100644 --- a/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp
@@ -548,7 +548,7 @@ return SVGGraphicsElement::insertedInto(rootParent); } -void SVGSVGElement::removedFrom(ContainerNode* rootParent) +void SVGSVGElement::removedFrom(ContainerNode* rootParent, Node* next) { if (rootParent->inDocument()) { SVGDocumentExtensions& svgExtensions = document().accessSVGExtensions(); @@ -556,7 +556,7 @@ svgExtensions.removeSVGRootWithRelativeLengthDescendents(this); } - SVGGraphicsElement::removedFrom(rootParent); + SVGGraphicsElement::removedFrom(rootParent, next); } void SVGSVGElement::pauseAnimations()
diff --git a/third_party/WebKit/Source/core/svg/SVGSVGElement.h b/third_party/WebKit/Source/core/svg/SVGSVGElement.h index f65eddc..23b2ddb 100644 --- a/third_party/WebKit/Source/core/svg/SVGSVGElement.h +++ b/third_party/WebKit/Source/core/svg/SVGSVGElement.h
@@ -130,7 +130,7 @@ LayoutObject* createLayoutObject(const ComputedStyle&) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void svgAttributeChanged(const QualifiedName&) override;
diff --git a/third_party/WebKit/Source/core/svg/SVGStyleElement.cpp b/third_party/WebKit/Source/core/svg/SVGStyleElement.cpp index 492f9f5..509dd9b9 100644 --- a/third_party/WebKit/Source/core/svg/SVGStyleElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGStyleElement.cpp
@@ -136,9 +136,9 @@ notifyLoadedSheetAndAllCriticalSubresources(ErrorOccurredLoadingSubresource); } -void SVGStyleElement::removedFrom(ContainerNode* insertionPoint) +void SVGStyleElement::removedFrom(ContainerNode* insertionPoint, Node* next) { - SVGElement::removedFrom(insertionPoint); + SVGElement::removedFrom(insertionPoint, next); StyleElement::removedFrom(this, insertionPoint); }
diff --git a/third_party/WebKit/Source/core/svg/SVGStyleElement.h b/third_party/WebKit/Source/core/svg/SVGStyleElement.h index 1c36a2f..28f6e64 100644 --- a/third_party/WebKit/Source/core/svg/SVGStyleElement.h +++ b/third_party/WebKit/Source/core/svg/SVGStyleElement.h
@@ -63,7 +63,7 @@ void parseAttribute(const QualifiedName&, const AtomicString&, const AtomicString&) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; void didNotifySubtreeInsertionsToDocument() override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void childrenChanged(const ChildrenChange&) override; void finishParsingChildren() override;
diff --git a/third_party/WebKit/Source/core/svg/SVGTextPathElement.cpp b/third_party/WebKit/Source/core/svg/SVGTextPathElement.cpp index 343cb34..f04e37e6 100644 --- a/third_party/WebKit/Source/core/svg/SVGTextPathElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGTextPathElement.cpp
@@ -150,9 +150,9 @@ return InsertionDone; } -void SVGTextPathElement::removedFrom(ContainerNode* rootParent) +void SVGTextPathElement::removedFrom(ContainerNode* rootParent, Node* next) { - SVGTextContentElement::removedFrom(rootParent); + SVGTextContentElement::removedFrom(rootParent, next); if (rootParent->inDocument()) clearResourceReferences(); }
diff --git a/third_party/WebKit/Source/core/svg/SVGTextPathElement.h b/third_party/WebKit/Source/core/svg/SVGTextPathElement.h index 5b88a78..880e5f3 100644 --- a/third_party/WebKit/Source/core/svg/SVGTextPathElement.h +++ b/third_party/WebKit/Source/core/svg/SVGTextPathElement.h
@@ -74,7 +74,7 @@ void buildPendingResource() override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void svgAttributeChanged(const QualifiedName&) override;
diff --git a/third_party/WebKit/Source/core/svg/SVGTitleElement.cpp b/third_party/WebKit/Source/core/svg/SVGTitleElement.cpp index a905ac6..e942204 100644 --- a/third_party/WebKit/Source/core/svg/SVGTitleElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGTitleElement.cpp
@@ -43,9 +43,9 @@ return InsertionDone; } -void SVGTitleElement::removedFrom(ContainerNode* rootParent) +void SVGTitleElement::removedFrom(ContainerNode* rootParent, Node* next) { - SVGElement::removedFrom(rootParent); + SVGElement::removedFrom(rootParent, next); if (rootParent->inDocument() && document().isSVGDocument()) document().removeTitle(this); }
diff --git a/third_party/WebKit/Source/core/svg/SVGTitleElement.h b/third_party/WebKit/Source/core/svg/SVGTitleElement.h index 31e9753..d1ae04a 100644 --- a/third_party/WebKit/Source/core/svg/SVGTitleElement.h +++ b/third_party/WebKit/Source/core/svg/SVGTitleElement.h
@@ -34,7 +34,7 @@ explicit SVGTitleElement(Document&); InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void childrenChanged(const ChildrenChange&) override; bool layoutObjectIsNeeded(const ComputedStyle&) override { return false; }
diff --git a/third_party/WebKit/Source/core/svg/SVGUseElement.cpp b/third_party/WebKit/Source/core/svg/SVGUseElement.cpp index d4e17161..d0e9f56 100644 --- a/third_party/WebKit/Source/core/svg/SVGUseElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGUseElement.cpp
@@ -120,9 +120,9 @@ return InsertionDone; } -void SVGUseElement::removedFrom(ContainerNode* rootParent) +void SVGUseElement::removedFrom(ContainerNode* rootParent, Node* next) { - SVGGraphicsElement::removedFrom(rootParent); + SVGGraphicsElement::removedFrom(rootParent, next); if (rootParent->inDocument()) { clearShadowTree(); cancelShadowTreeRecreation();
diff --git a/third_party/WebKit/Source/core/svg/SVGUseElement.h b/third_party/WebKit/Source/core/svg/SVGUseElement.h index ff14e9f..bee0903 100644 --- a/third_party/WebKit/Source/core/svg/SVGUseElement.h +++ b/third_party/WebKit/Source/core/svg/SVGUseElement.h
@@ -73,7 +73,7 @@ bool isStructurallyExternal() const override { return !hrefString().isNull() && isExternalURIReference(hrefString(), document()); } InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; void svgAttributeChanged(const QualifiedName&) override;
diff --git a/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp b/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp index 81a97be..ffefe25 100644 --- a/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp +++ b/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp
@@ -348,7 +348,7 @@ return InsertionDone; } -void SVGSMILElement::removedFrom(ContainerNode* rootParent) +void SVGSMILElement::removedFrom(ContainerNode* rootParent, Node* next) { if (rootParent->inDocument()) { clearResourceAndEventBaseReferences(); @@ -359,7 +359,7 @@ m_timeContainer = nullptr; } - SVGElement::removedFrom(rootParent); + SVGElement::removedFrom(rootParent, next); } bool SVGSMILElement::hasValidAttributeName()
diff --git a/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.h b/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.h index 0386af82..b5e4fcf 100644 --- a/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.h +++ b/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.h
@@ -53,7 +53,7 @@ void parseAttribute(const QualifiedName&, const AtomicString&, const AtomicString&) override; void svgAttributeChanged(const QualifiedName&) override; InsertionNotificationRequest insertedInto(ContainerNode*) override; - void removedFrom(ContainerNode*) override; + void removedFrom(ContainerNode* insertionPoint, Node* next) override; virtual bool hasValidAttributeType() = 0; virtual bool hasValidAttributeName();
diff --git a/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp b/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp index e8cd1ad..680c83e 100644 --- a/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp +++ b/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp
@@ -66,10 +66,7 @@ { m_url = url; - OwnPtr<ResourceRequest> request(createResourceRequest()); - if (!request) - return; - + ResourceRequest request(createResourceRequest()); ASSERT_WITH_SECURITY_IMPLICATION(executionContext.isWorkerGlobalScope()); ThreadableLoaderOptions options; @@ -80,7 +77,7 @@ ResourceLoaderOptions resourceLoaderOptions; resourceLoaderOptions.allowCredentials = AllowStoredCredentials; - WorkerThreadableLoader::loadResourceSynchronously(toWorkerGlobalScope(executionContext), *request, *this, options, resourceLoaderOptions); + WorkerThreadableLoader::loadResourceSynchronously(toWorkerGlobalScope(executionContext), request, *this, options, resourceLoaderOptions); } void WorkerScriptLoader::loadAsynchronously(ExecutionContext& executionContext, const KURL& url, CrossOriginRequestPolicy crossOriginRequestPolicy, PassOwnPtr<Closure> responseCallback, PassOwnPtr<Closure> finishedCallback) @@ -90,10 +87,7 @@ m_finishedCallback = finishedCallback; m_url = url; - OwnPtr<ResourceRequest> request(createResourceRequest()); - if (!request) - return; - + ResourceRequest request(createResourceRequest()); ThreadableLoaderOptions options; options.crossOriginRequestPolicy = crossOriginRequestPolicy; @@ -106,7 +100,7 @@ // (E.g. see crbug.com/524694 for why we can't easily remove this protect) RefPtr<WorkerScriptLoader> protect(this); m_needToCancel = true; - m_threadableLoader = ThreadableLoader::create(executionContext, this, *request, options, resourceLoaderOptions); + m_threadableLoader = ThreadableLoader::create(executionContext, this, request, options, resourceLoaderOptions); if (m_failed) notifyFinished(); } @@ -117,12 +111,12 @@ return m_responseURL; } -PassOwnPtr<ResourceRequest> WorkerScriptLoader::createResourceRequest() +ResourceRequest WorkerScriptLoader::createResourceRequest() { - OwnPtr<ResourceRequest> request = adoptPtr(new ResourceRequest(m_url)); - request->setHTTPMethod("GET"); - request->setRequestContext(m_requestContext); - return request.release(); + ResourceRequest request(m_url); + request.setHTTPMethod("GET"); + request.setRequestContext(m_requestContext); + return request; } void WorkerScriptLoader::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle)
diff --git a/third_party/WebKit/Source/core/workers/WorkerScriptLoader.h b/third_party/WebKit/Source/core/workers/WorkerScriptLoader.h index feccac7b..a4e1d5b 100644 --- a/third_party/WebKit/Source/core/workers/WorkerScriptLoader.h +++ b/third_party/WebKit/Source/core/workers/WorkerScriptLoader.h
@@ -96,7 +96,7 @@ WorkerScriptLoader(); ~WorkerScriptLoader() override; - PassOwnPtr<ResourceRequest> createResourceRequest(); + ResourceRequest createResourceRequest(); void notifyError(); void notifyFinished();
diff --git a/third_party/WebKit/Source/devtools/devtools.gypi b/third_party/WebKit/Source/devtools/devtools.gypi index 99df49a..7fa2d34 100644 --- a/third_party/WebKit/Source/devtools/devtools.gypi +++ b/third_party/WebKit/Source/devtools/devtools.gypi
@@ -368,7 +368,6 @@ 'devtools_animation_js_files': [ 'front_end/animation/animationScreenshotPopover.css', 'front_end/animation/animationTimeline.css', - 'front_end/animation/AnimationControlPane.js', 'front_end/animation/AnimationGroupPreviewUI.js', 'front_end/animation/AnimationModel.js', 'front_end/animation/AnimationScreenshotPopover.js',
diff --git a/third_party/WebKit/Source/devtools/front_end/animation/AnimationControlPane.js b/third_party/WebKit/Source/devtools/front_end/animation/AnimationControlPane.js deleted file mode 100644 index f2c7298..0000000 --- a/third_party/WebKit/Source/devtools/front_end/animation/AnimationControlPane.js +++ /dev/null
@@ -1,148 +0,0 @@ -// Copyright (c) 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @constructor - * @extends {WebInspector.ElementsPanel.BaseToolbarPaneWidget} - */ -WebInspector.AnimationControlPane = function(toolbarItem) -{ - WebInspector.ElementsPanel.BaseToolbarPaneWidget.call(this, toolbarItem); - this._animationsPaused = false; - this._animationsPlaybackRate = 1; - - this.element.className = "styles-animations-controls-pane"; - this.element.createChild("div").createTextChild("Animations"); - var container = this.element.createChild("div", "animations-controls"); - - var toolbar = new WebInspector.Toolbar(""); - this._animationsPauseButton = new WebInspector.ToolbarButton("", "pause-toolbar-item"); - toolbar.appendToolbarItem(this._animationsPauseButton); - this._animationsPauseButton.addEventListener("click", this._pauseButtonHandler.bind(this)); - container.appendChild(toolbar.element); - - this._animationsPlaybackSlider = container.createChild("input"); - this._animationsPlaybackSlider.type = "range"; - this._animationsPlaybackSlider.min = 0; - this._animationsPlaybackSlider.max = WebInspector.AnimationTimeline.GlobalPlaybackRates.length - 1; - this._animationsPlaybackSlider.value = this._animationsPlaybackSlider.max; - this._animationsPlaybackSlider.addEventListener("input", this._playbackSliderInputHandler.bind(this)); - - this._animationsPlaybackLabel = container.createChild("div", "playback-label"); - this._animationsPlaybackLabel.createTextChild("1x"); -} - -WebInspector.AnimationControlPane.prototype = { - /** - * @param {!Event} event - */ - _playbackSliderInputHandler: function (event) - { - this._animationsPlaybackRate = WebInspector.AnimationTimeline.GlobalPlaybackRates[event.target.value]; - WebInspector.AnimationModel.fromTarget(this._target).setPlaybackRate(this._animationsPaused ? 0 : this._animationsPlaybackRate); - this._animationsPlaybackLabel.textContent = this._animationsPlaybackRate + "x"; - WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.AnimationsPlaybackRateChanged); - }, - - _pauseButtonHandler: function () - { - this._animationsPaused = !this._animationsPaused; - WebInspector.AnimationModel.fromTarget(this._target).setPlaybackRate(this._animationsPaused ? 0 : this._animationsPlaybackRate); - WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.AnimationsPlaybackRateChanged); - this._animationsPauseButton.element.classList.toggle("pause-toolbar-item"); - this._animationsPauseButton.element.classList.toggle("play-toolbar-item"); - }, - - /** - * @override - * @return {!Promise<?>} - */ - doUpdate: function() - { - if (!this._target) - return Promise.resolve(); - - /** - * @param {number} playbackRate - * @this {WebInspector.AnimationControlPane} - */ - function setPlaybackRate(playbackRate) - { - this._animationsPlaybackSlider.value = WebInspector.AnimationTimeline.GlobalPlaybackRates.indexOf(playbackRate); - this._animationsPlaybackLabel.textContent = playbackRate + "x"; - } - - return WebInspector.AnimationModel.fromTarget(this._target).playbackRatePromise().then(setPlaybackRate.bind(this)); - }, - - /** - * @override - * @param {?WebInspector.DOMNode} node - */ - onNodeChanged: function(node) - { - if (!node) - return; - - if (this._target) - this._target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this.update, this); - - this._target = node.target(); - this._target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this.update, this); - this.update(); - }, - - __proto__: WebInspector.ElementsPanel.BaseToolbarPaneWidget.prototype -} - -/** - * @constructor - * @implements {WebInspector.ToolbarItem.Provider} - */ -WebInspector.AnimationControlPane.ButtonProvider = function() -{ - this._button = new WebInspector.ToolbarButton(WebInspector.UIString("Toggle animation controls"), "animation-toolbar-item"); - this._button.addEventListener("click", this._clicked, this); - WebInspector.context.addFlavorChangeListener(WebInspector.DOMNode, this._nodeChanged, this); - this._nodeChanged(); -} - -WebInspector.AnimationControlPane.ButtonProvider.prototype = { - /** - * @param {boolean} toggleOn - */ - _toggleAnimationControlPaneMode: function(toggleOn) - { - if (!this._animationsControlPane) - this._animationsControlPane = new WebInspector.AnimationControlPane(this.item()); - WebInspector.ElementsPanel.instance().showToolbarPane(toggleOn ? this._animationsControlPane : null); - }, - - _clicked: function() - { - if (Runtime.experiments.isEnabled("animationInspection")) - WebInspector.inspectorView.showViewInDrawer("animations"); - else - this._toggleAnimationControlPaneMode(!this._button.toggled()); - }, - - _nodeChanged: function() - { - var node = WebInspector.context.flavor(WebInspector.DOMNode); - if (!Runtime.experiments.isEnabled("animationInspection")) { - this._button.setEnabled(!!node); - if (!node) - this._toggleAnimationControlPaneMode(false); - } - }, - - /** - * @override - * @return {!WebInspector.ToolbarItem} - */ - item: function() - { - return this._button; - } -} \ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/animation/AnimationTimeline.js b/third_party/WebKit/Source/devtools/front_end/animation/AnimationTimeline.js index 188e4dc..55e5d7c 100644 --- a/third_party/WebKit/Source/devtools/front_end/animation/AnimationTimeline.js +++ b/third_party/WebKit/Source/devtools/front_end/animation/AnimationTimeline.js
@@ -27,7 +27,6 @@ this._nodesMap = new Map(); this._uiAnimations = []; this._groupBuffer = []; - this._groupBufferSize = 8; /** @type {!Map.<!WebInspector.AnimationModel.AnimationGroup, !WebInspector.AnimationGroupPreviewUI>} */ this._previewMap = new Map(); this._symbol = Symbol("animationTimeline"); @@ -371,11 +370,11 @@ this._previewMap.get(group).replay(); return; } - this._groupBuffer.push(group); this._groupBuffer.sort(startTimeComparator); // Discard oldest groups from buffer if necessary var groupsToDiscard = []; - while (this._groupBuffer.length > this._groupBufferSize) { + var bufferSize = this.width() / 50; + while (this._groupBuffer.length > bufferSize) { var toDiscard = this._groupBuffer.splice(this._groupBuffer[0] === this._selectedGroup ? 1 : 0, 1); groupsToDiscard.push(toDiscard[0]); } @@ -386,6 +385,7 @@ } // Generate preview var preview = new WebInspector.AnimationGroupPreviewUI(group); + this._groupBuffer.push(group); this._previewMap.set(group, preview); this._previewContainer.appendChild(preview.element); preview.removeButton().addEventListener("click", this._removeAnimationGroup.bind(this, group)); @@ -710,6 +710,8 @@ this._node = node; this._nodeChanged(); this._description.appendChild(WebInspector.DOMPresentationUtils.linkifyNodeReference(node)); + if (!node.ownerDocument) + this.nodeRemoved(); }, /** @@ -723,6 +725,7 @@ nodeRemoved: function() { this.element.classList.add("animation-node-removed"); + this._node = null; }, _nodeChanged: function() @@ -755,3 +758,29 @@ return new WebInspector.AnimationTimeline.StepTimingFunction(parseInt(match[1], 10), match[2]); return null; } + +/** + * @constructor + * @implements {WebInspector.ToolbarItem.Provider} + */ +WebInspector.AnimationTimeline.ButtonProvider = function() +{ + this._button = new WebInspector.ToolbarButton(WebInspector.UIString("Toggle animation controls"), "animation-toolbar-item"); + this._button.addEventListener("click", this._clicked, this); +} + +WebInspector.AnimationTimeline.ButtonProvider.prototype = { + _clicked: function() + { + WebInspector.inspectorView.showViewInDrawer("animations"); + }, + + /** + * @override + * @return {!WebInspector.ToolbarItem} + */ + item: function() + { + return this._button; + } +} \ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/animation/AnimationUI.js b/third_party/WebKit/Source/devtools/front_end/animation/AnimationUI.js index 3d37639..679971f 100644 --- a/third_party/WebKit/Source/devtools/front_end/animation/AnimationUI.js +++ b/third_party/WebKit/Source/devtools/front_end/animation/AnimationUI.js
@@ -22,9 +22,9 @@ this._svg = parentElement.createSVGChild("svg", "animation-ui"); this._svg.setAttribute("height", WebInspector.AnimationUI.Options.AnimationSVGHeight); this._svg.style.marginLeft = "-" + WebInspector.AnimationUI.Options.AnimationMargin + "px"; - this._svg.addEventListener("mousedown", this._mouseDown.bind(this, WebInspector.AnimationUI.MouseEvents.AnimationDrag, null)); this._svg.addEventListener("contextmenu", this._onContextMenu.bind(this)); this._activeIntervalGroup = this._svg.createSVGChild("g"); + WebInspector.installDragHandle(this._activeIntervalGroup, this._mouseDown.bind(this, WebInspector.AnimationUI.MouseEvents.AnimationDrag, null), this._mouseMove.bind(this), this._mouseUp.bind(this), "-webkit-grabbing", "-webkit-grab"); /** @type {!Array.<{group: ?Element, animationLine: ?Element, keyframePoints: !Object.<number, !Element>, keyframeRender: !Object.<number, !Element>}>} */ this._cachedElements = []; @@ -138,13 +138,14 @@ if (!attachEvents) return; - if (keyframeIndex === 0) { - circle.addEventListener("mousedown", this._mouseDown.bind(this, WebInspector.AnimationUI.MouseEvents.StartEndpointMove, keyframeIndex)); - } else if (keyframeIndex === -1) { - circle.addEventListener("mousedown", this._mouseDown.bind(this, WebInspector.AnimationUI.MouseEvents.FinishEndpointMove, keyframeIndex)); - } else { - circle.addEventListener("mousedown", this._mouseDown.bind(this, WebInspector.AnimationUI.MouseEvents.KeyframeMove, keyframeIndex)); - } + var eventType; + if (keyframeIndex === 0) + eventType = WebInspector.AnimationUI.MouseEvents.StartEndpointMove; + else if (keyframeIndex === -1) + eventType = WebInspector.AnimationUI.MouseEvents.FinishEndpointMove; + else + eventType = WebInspector.AnimationUI.MouseEvents.KeyframeMove; + WebInspector.installDragHandle(circle, this._mouseDown.bind(this, eventType, keyframeIndex), this._mouseMove.bind(this), this._mouseUp.bind(this), "ew-resize"); }, /** @@ -201,7 +202,6 @@ var durationWithDelay = this._delay() + this._duration() * this._animation.source().iterations() + this._animation.source().endDelay(); var maxWidth = this._timeline.width() - WebInspector.AnimationUI.Options.AnimationMargin; - this._svg.classList.toggle("animation-ui-canceled", this._animation.playState() === "idle"); this._svg.setAttribute("width", (maxWidth + 2 * WebInspector.AnimationUI.Options.AnimationMargin).toFixed(2)); this._activeIntervalGroup.style.transform = "translateX(" + (this._delay() * this._timeline.pixelMsRatio()).toFixed(2) + "px)"; @@ -306,21 +306,16 @@ _mouseDown: function(mouseEventType, keyframeIndex, event) { if (event.buttons == 2) - return; - if (this._animation.playState() === "idle") - return; + return false; + if (this._svg.enclosingNodeOrSelfWithClass("animation-node-removed")) + return false; this._mouseEventType = mouseEventType; this._keyframeMoved = keyframeIndex; this._downMouseX = event.clientX; - this._mouseMoveHandler = this._mouseMove.bind(this); - this._mouseUpHandler = this._mouseUp.bind(this); - this._parentElement.ownerDocument.addEventListener("mousemove", this._mouseMoveHandler); - this._parentElement.ownerDocument.addEventListener("mouseup", this._mouseUpHandler); - event.preventDefault(); - event.stopPropagation(); - + event.consume(true); if (this._node) WebInspector.Revealer.reveal(this._node); + return true; }, /** @@ -350,10 +345,6 @@ this._movementInMs = 0; this.redraw(); - this._parentElement.ownerDocument.removeEventListener("mousemove", this._mouseMoveHandler); - this._parentElement.ownerDocument.removeEventListener("mouseup", this._mouseUpHandler); - delete this._mouseMoveHandler; - delete this._mouseUpHandler; delete this._mouseEventType; delete this._downMouseX; delete this._keyframeMoved;
diff --git a/third_party/WebKit/Source/devtools/front_end/animation/animationTimeline.css b/third_party/WebKit/Source/devtools/front_end/animation/animationTimeline.css index bdd8388..6d8bd65 100644 --- a/third_party/WebKit/Source/devtools/front_end/animation/animationTimeline.css +++ b/third_party/WebKit/Source/devtools/front_end/animation/animationTimeline.css
@@ -38,7 +38,11 @@ } path.animation-keyframe { - fill-opacity: 0.3; + fill-opacity: 0.2; +} + +svg.animation-ui g:first-child:hover path.animation-keyframe { + fill-opacity: 0.4; } .animation-node-selected path.animation-keyframe { @@ -223,8 +227,9 @@ max-height: 100%; } -.animation-node-row.animation-node-removed { - background-color: hsla(0, 100%, 50%, 0.1); +.animation-node-removed { + -webkit-filter: saturate(0); + cursor: not-allowed; } svg.animation-ui g:first-child {
diff --git a/third_party/WebKit/Source/devtools/front_end/animation/module.json b/third_party/WebKit/Source/devtools/front_end/animation/module.json index 6dcb9ab..236b476 100644 --- a/third_party/WebKit/Source/devtools/front_end/animation/module.json +++ b/third_party/WebKit/Source/devtools/front_end/animation/module.json
@@ -2,7 +2,7 @@ "extensions": [ { "type": "@WebInspector.ToolbarItem.Provider", - "className": "WebInspector.AnimationControlPane.ButtonProvider", + "className": "WebInspector.AnimationTimeline.ButtonProvider", "order": 2, "location": "styles-sidebarpane-toolbar" }, @@ -23,8 +23,7 @@ "AnimationGroupPreviewUI.js", "AnimationScreenshotPopover.js", "AnimationTimeline.js", - "AnimationUI.js", - "AnimationControlPane.js" + "AnimationUI.js" ], "resources": [ "animationScreenshotPopover.css",
diff --git a/third_party/WebKit/Source/devtools/front_end/common/Settings.js b/third_party/WebKit/Source/devtools/front_end/common/Settings.js index 544b58e..cfa0b15 100644 --- a/third_party/WebKit/Source/devtools/front_end/common/Settings.js +++ b/third_party/WebKit/Source/devtools/front_end/common/Settings.js
@@ -399,7 +399,7 @@ } WebInspector.VersionController._currentVersionName = "inspectorVersion"; -WebInspector.VersionController.currentVersion = 16; +WebInspector.VersionController.currentVersion = 17; WebInspector.VersionController.prototype = { updateVersion: function() @@ -668,6 +668,20 @@ setting.set(tabOrders); }, + _updateVersionFrom16To17: function() + { + var setting = WebInspector.settings.createSetting("networkConditionsCustomProfiles", []); + var oldValue = setting.get(); + var newValue = []; + if (Array.isArray(oldValue)) { + for (var preset of oldValue) { + if (typeof preset.title === "string" && typeof preset.value === "object" && typeof preset.value.throughput === "number" && typeof preset.value.latency === "number") + newValue.push({title: preset.title, value: {download: preset.value.throughput, upload: preset.value.throughput, latency: preset.value.latency}}); + } + } + setting.set(newValue); + }, + _migrateSettingsFromLocalStorage: function() { // This step migrates all the settings except for the ones below into the browser profile.
diff --git a/third_party/WebKit/Source/devtools/front_end/components/NetworkConditionsSelector.js b/third_party/WebKit/Source/devtools/front_end/components/NetworkConditionsSelector.js index 330bda28..ba97f49e 100644 --- a/third_party/WebKit/Source/devtools/front_end/components/NetworkConditionsSelector.js +++ b/third_party/WebKit/Source/devtools/front_end/components/NetworkConditionsSelector.js
@@ -12,8 +12,8 @@ this._selectElement.addEventListener("change", this._optionSelected.bind(this), false); this._customSetting = WebInspector.moduleSetting("networkConditionsCustomProfiles"); this._customSetting.addChangeListener(this._populateOptions, this); - this._setting = WebInspector.moduleSetting("networkConditions"); - this._setting.addChangeListener(this._settingChanged, this); + this._manager = WebInspector.multitargetNetworkManager; + this._manager.addEventListener(WebInspector.MultitargetNetworkManager.Events.ConditionsChanged, this._conditionsChanged, this); this._populateOptions(); } @@ -21,32 +21,32 @@ WebInspector.NetworkConditionsProfile; /** - * @param {!WebInspector.NetworkManager.Conditions} conditions + * @param {number} throughput * @return {string} */ -WebInspector.NetworkConditionsSelector.throughputText = function(conditions) +WebInspector.NetworkConditionsSelector.throughputText = function(throughput) { - if (conditions.throughput < 0) + if (throughput < 0) return ""; - var throughputInKbps = conditions.throughput / (1024 / 8); + var throughputInKbps = throughput / (1024 / 8); return (throughputInKbps < 1024) ? WebInspector.UIString("%d kb/s", throughputInKbps) : WebInspector.UIString("%d Mb/s", (throughputInKbps / 1024) | 0); } /** @type {!Array.<!WebInspector.NetworkConditionsProfile>} */ WebInspector.NetworkConditionsSelector._networkConditionsPresets = [ - {title: "Offline", value: {throughput: 0 * 1024 / 8, latency: 0}}, - {title: "GPRS", value: {throughput: 50 * 1024 / 8, latency: 500}}, - {title: "Regular 2G", value: {throughput: 250 * 1024 / 8, latency: 300}}, - {title: "Good 2G", value: {throughput: 450 * 1024 / 8, latency: 150}}, - {title: "Regular 3G", value: {throughput: 750 * 1024 / 8, latency: 100}}, - {title: "Good 3G", value: {throughput: 1.5 * 1024 * 1024 / 8, latency: 40}}, - {title: "Regular 4G", value: {throughput: 4 * 1024 * 1024 / 8, latency: 20}}, - {title: "DSL", value: {throughput: 2 * 1024 * 1024 / 8, latency: 5}}, - {title: "WiFi", value: {throughput: 30 * 1024 * 1024 / 8, latency: 2}} + {title: "Offline", value: {download: 0 * 1024 / 8, upload: 0 * 1024 / 8, latency: 0}}, + {title: "GPRS", value: {download: 50 * 1024 / 8, upload: 20 * 1024 / 8, latency: 500}}, + {title: "Regular 2G", value: {download: 250 * 1024 / 8, upload: 50 * 1024 / 8, latency: 300}}, + {title: "Good 2G", value: {download: 450 * 1024 / 8, upload: 150 * 1024 / 8, latency: 150}}, + {title: "Regular 3G", value: {download: 750 * 1024 / 8, upload: 250 * 1024 / 8, latency: 100}}, + {title: "Good 3G", value: {download: 1.5 * 1024 * 1024 / 8, upload: 750 * 1024 / 8, latency: 40}}, + {title: "Regular 4G", value: {download: 4 * 1024 * 1024 / 8, upload: 3 * 1024 * 1024 / 8, latency: 20}}, + {title: "DSL", value: {download: 2 * 1024 * 1024 / 8, upload: 1 * 1024 * 1024 / 8, latency: 5}}, + {title: "WiFi", value: {download: 30 * 1024 * 1024 / 8, upload: 15 * 1024 * 1024 / 8, latency: 2}} ]; /** @type {!WebInspector.NetworkConditionsProfile} */ -WebInspector.NetworkConditionsSelector._disabledPreset = {title: "No throttling", value: {throughput: -1, latency: 0}}; +WebInspector.NetworkConditionsSelector._disabledPreset = {title: "No throttling", value: {download: -1, upload: -1, latency: 0}}; WebInspector.NetworkConditionsSelector.prototype = { _populateOptions: function() @@ -59,7 +59,7 @@ this._addGroup(WebInspector.NetworkConditionsSelector._networkConditionsPresets, WebInspector.UIString("Presets")); this._addGroup([WebInspector.NetworkConditionsSelector._disabledPreset], WebInspector.UIString("Disabled")); - this._settingChanged(); + this._conditionsChanged(); }, /** @@ -73,19 +73,21 @@ groupElement.label = groupName; for (var i = 0; i < presets.length; ++i) { var preset = presets[i]; - var throughputInKbps = preset.value.throughput / (1024 / 8); - var isThrottling = (throughputInKbps > 0) || preset.value.latency; + var downloadInKbps = preset.value.download / (1024 / 8); + var uploadInKbps = preset.value.upload / (1024 / 8); + var isThrottling = (downloadInKbps >= 0) || (uploadInKbps >= 0) || (preset.value.latency > 0); var option; var presetTitle = WebInspector.UIString(preset.title); if (!isThrottling) { option = new Option(presetTitle, presetTitle); } else { - var throughputText = WebInspector.NetworkConditionsSelector.throughputText(preset.value); - var title = WebInspector.UIString("%s (%s %dms RTT)", presetTitle, throughputText, preset.value.latency); + var downloadText = WebInspector.NetworkConditionsSelector.throughputText(preset.value.download); + var uploadText = WebInspector.NetworkConditionsSelector.throughputText(preset.value.upload); + var title = WebInspector.UIString("%s (%s\u2b07 %s\u2b06 %dms RTT)", presetTitle, downloadText, uploadText, preset.value.latency); option = new Option(title, presetTitle); - option.title = WebInspector.UIString("Maximum download throughput: %s.\r\nMinimum round-trip time: %dms.", throughputText, preset.value.latency); + option.title = WebInspector.UIString("Maximum download throughput: %s.\r\nMaximum upload throughput: %s.\r\nMinimum round-trip time: %dms.", downloadText, uploadText, preset.value.latency); } - option.settingValue = preset.value; + option.conditions = preset.value; groupElement.appendChild(option); } return groupElement; @@ -95,22 +97,22 @@ { if (this._selectElement.selectedIndex === 0) { WebInspector.Revealer.reveal(this._customSetting); - this._settingChanged(); + this._conditionsChanged(); return; } - this._setting.removeChangeListener(this._settingChanged, this); - this._setting.set(this._selectElement.options[this._selectElement.selectedIndex].settingValue); - this._setting.addChangeListener(this._settingChanged, this); + this._manager.removeEventListener(WebInspector.MultitargetNetworkManager.Events.ConditionsChanged, this._conditionsChanged, this); + this._manager.setNetworkConditions(this._selectElement.options[this._selectElement.selectedIndex].conditions); + this._manager.addEventListener(WebInspector.MultitargetNetworkManager.Events.ConditionsChanged, this._conditionsChanged, this); }, - _settingChanged: function() + _conditionsChanged: function() { - var value = this._setting.get(); + var value = this._manager.networkConditions(); var options = this._selectElement.options; for (var index = 1; index < options.length; ++index) { var option = options[index]; - if (option.settingValue.throughput === value.throughput && option.settingValue.latency === value.latency) + if (option.conditions.download === value.download && option.conditions.upload === value.upload && option.conditions.latency === value.latency) this._selectElement.selectedIndex = index; } } @@ -171,7 +173,7 @@ _addButtonClicked: function() { - this._list.addNewItem(this._customSetting.get().length, {title: "", value: {throughput: 0, latency: 0}}); + this._list.addNewItem(this._customSetting.get().length, {title: "", value: {download: -1, upload: -1, latency: 0}}); }, /** @@ -189,7 +191,9 @@ titleText.textContent = conditions.title; titleText.title = conditions.title; element.createChild("div", "conditions-list-separator"); - element.createChild("div", "conditions-list-text").textContent = WebInspector.NetworkConditionsSelector.throughputText(conditions.value); + element.createChild("div", "conditions-list-text").textContent = WebInspector.NetworkConditionsSelector.throughputText(conditions.value.download); + element.createChild("div", "conditions-list-separator"); + element.createChild("div", "conditions-list-text").textContent = WebInspector.NetworkConditionsSelector.throughputText(conditions.value.upload); element.createChild("div", "conditions-list-separator"); element.createChild("div", "conditions-list-text").textContent = WebInspector.UIString("%dms", conditions.value.latency); return element; @@ -217,8 +221,10 @@ { var conditions = /** @type {?WebInspector.NetworkConditionsProfile} */ (item); conditions.title = editor.control("title").value.trim(); - var throughput = editor.control("throughput").value.trim(); - conditions.value.throughput = throughput ? parseInt(throughput, 10) * (1024 / 8) : -1; + var download = editor.control("download").value.trim(); + conditions.value.download = download ? parseInt(download, 10) * (1024 / 8) : -1; + var upload = editor.control("upload").value.trim(); + conditions.value.upload = upload ? parseInt(upload, 10) * (1024 / 8) : -1; var latency = editor.control("latency").value.trim(); conditions.value.latency = latency ? parseInt(latency, 10) : 0; @@ -238,7 +244,8 @@ var conditions = /** @type {?WebInspector.NetworkConditionsProfile} */ (item); var editor = this._createEditor(); editor.control("title").value = conditions.title; - editor.control("throughput").value = conditions.value.throughput <= 0 ? "" : String(conditions.value.throughput / (1024 / 8)); + editor.control("download").value = conditions.value.download <= 0 ? "" : String(conditions.value.download / (1024 / 8)); + editor.control("upload").value = conditions.value.upload <= 0 ? "" : String(conditions.value.upload / (1024 / 8)); editor.control("latency").value = conditions.value.latency ? String(conditions.value.latency) : ""; return editor; }, @@ -258,7 +265,9 @@ var titles = content.createChild("div", "conditions-edit-row"); titles.createChild("div", "conditions-list-text conditions-list-title").textContent = WebInspector.UIString("Profile Name"); titles.createChild("div", "conditions-list-separator conditions-list-separator-invisible"); - titles.createChild("div", "conditions-list-text").textContent = WebInspector.UIString("Throughput"); + titles.createChild("div", "conditions-list-text").textContent = WebInspector.UIString("Download"); + titles.createChild("div", "conditions-list-separator conditions-list-separator-invisible"); + titles.createChild("div", "conditions-list-text").textContent = WebInspector.UIString("Upload"); titles.createChild("div", "conditions-list-separator conditions-list-separator-invisible"); titles.createChild("div", "conditions-list-text").textContent = WebInspector.UIString("Latency"); @@ -267,7 +276,12 @@ fields.createChild("div", "conditions-list-separator conditions-list-separator-invisible"); var cell = fields.createChild("div", "conditions-list-text"); - cell.appendChild(editor.createInput("throughput", "text", WebInspector.UIString("kb/s"), throughputValidator)); + cell.appendChild(editor.createInput("download", "text", WebInspector.UIString("kb/s"), throughputValidator)); + cell.createChild("div", "conditions-edit-optional").textContent = WebInspector.UIString("optional"); + fields.createChild("div", "conditions-list-separator conditions-list-separator-invisible"); + + cell = fields.createChild("div", "conditions-list-text"); + cell.appendChild(editor.createInput("upload", "text", WebInspector.UIString("kb/s"), throughputValidator)); cell.createChild("div", "conditions-edit-optional").textContent = WebInspector.UIString("optional"); fields.createChild("div", "conditions-list-separator conditions-list-separator-invisible");
diff --git a/third_party/WebKit/Source/devtools/front_end/devtools.js b/third_party/WebKit/Source/devtools/front_end/devtools.js index 68d826b..5891324f 100644 --- a/third_party/WebKit/Source/devtools/front_end/devtools.js +++ b/third_party/WebKit/Source/devtools/front_end/devtools.js
@@ -945,3 +945,13 @@ } })(window); + +if (!DOMTokenList.prototype.__originalDOMTokenListToggle) { + DOMTokenList.prototype.__originalDOMTokenListToggle = DOMTokenList.prototype.toggle; + DOMTokenList.prototype.toggle = function(token, force) + { + if (arguments.length === 1) + force = !this.contains(token); + return this.__originalDOMTokenListToggle(token, !!force); + } +} \ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/PropertiesWidget.js b/third_party/WebKit/Source/devtools/front_end/elements/PropertiesWidget.js index 6b4578c..49531a6 100644 --- a/third_party/WebKit/Source/devtools/front_end/elements/PropertiesWidget.js +++ b/third_party/WebKit/Source/devtools/front_end/elements/PropertiesWidget.js
@@ -158,6 +158,7 @@ this.element.appendChild(section.element); if (expanded[this.sections.length - 1]) section.expand(); + section.addEventListener(TreeOutline.Events.ElementExpanded, this._propertyExpanded, this); } } }, @@ -165,6 +166,14 @@ /** * @param {!WebInspector.Event} event */ + _propertyExpanded: function(event) + { + WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.DOMPropertiesExpanded); + }, + + /** + * @param {!WebInspector.Event} event + */ _onNodeChange: function(event) { if (!this._node)
diff --git a/third_party/WebKit/Source/devtools/front_end/host/UserMetrics.js b/third_party/WebKit/Source/devtools/front_end/host/UserMetrics.js index cff03af0..5f0ccb789 100644 --- a/third_party/WebKit/Source/devtools/front_end/host/UserMetrics.js +++ b/third_party/WebKit/Source/devtools/front_end/host/UserMetrics.js
@@ -55,7 +55,8 @@ RevisionApplied: 12, FileSystemDirectoryContentReceived: 13, StyleRuleEdited: 14, - CommandEvaluatedInConsolePanel: 15 + CommandEvaluatedInConsolePanel: 15, + DOMPropertiesExpanded: 16 } WebInspector.UserMetrics._PanelCodes = {
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js index 74b420c..8fd9bbd7 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/Main.js +++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -103,7 +103,6 @@ _initializeExperiments: function(prefs) { Runtime.experiments.register("accessibilityInspection", "Accessibility Inspection"); - Runtime.experiments.register("animationInspection", "Animation Inspection"); Runtime.experiments.register("applyCustomStylesheet", "Allow custom UI themes"); Runtime.experiments.register("blackboxJSFramesOnTimeline", "Blackbox JavaScript frames on Timeline", true); Runtime.experiments.register("colorContrastRatio", "Contrast ratio line in color picker", true); @@ -149,7 +148,6 @@ } Runtime.experiments.setDefaultExperiments([ - "animationInspection", "deviceMode", "securityPanel" ]); @@ -946,16 +944,15 @@ */ WebInspector.NetworkPanelIndicator = function() { - var networkConditionsSetting = WebInspector.moduleSetting("networkConditions"); - networkConditionsSetting.set({ "throughput": -1, "latency": 0 }); - networkConditionsSetting.addChangeListener(updateVisibility); + var manager = WebInspector.multitargetNetworkManager; + manager.addEventListener(WebInspector.MultitargetNetworkManager.Events.ConditionsChanged, updateVisibility); var blockedURLsSetting = WebInspector.moduleSetting("blockedURLs"); blockedURLsSetting.addChangeListener(updateVisibility); updateVisibility(); function updateVisibility() { - if (WebInspector.NetworkManager.IsThrottlingEnabled(networkConditionsSetting.get())) { + if (manager.isThrottling()) { WebInspector.inspectorView.setPanelIcon("network", "warning-icon", WebInspector.UIString("Network throttling is enabled")); } else if (blockedURLsSetting.get().length) { WebInspector.inspectorView.setPanelIcon("network", "warning-icon", WebInspector.UIString("Requests may be blocked"));
diff --git a/third_party/WebKit/Source/devtools/front_end/main/module.json b/third_party/WebKit/Source/devtools/front_end/main/module.json index a98ff95..e82f50b 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/module.json +++ b/third_party/WebKit/Source/devtools/front_end/main/module.json
@@ -221,12 +221,6 @@ }, { "type": "setting", - "settingName": "networkConditions", - "settingType": "object", - "defaultValue": { "throughput": -1, "latency": 0 } - }, - { - "type": "setting", "category": "", "title": "Disable JavaScript", "settingName": "javaScriptDisabled",
diff --git a/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js b/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js index 4c9a9f6..9e4ea5c 100644 --- a/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js +++ b/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
@@ -5,14 +5,40 @@ WebInspector.SASSSupport = {} /** - * @constructor + * @param {!WebInspector.CSSParser} parser * @param {string} url * @param {string} text + * @return {!Promise<!WebInspector.SASSSupport.AST>} */ -WebInspector.SASSSupport.ASTDocument = function(url, text) +WebInspector.SASSSupport.parseCSS = function(parser, url, text) { - this.url = url; - this.text = text; + return parser.parsePromise(text) + .then(onParsed); + + /** + * @param {!Array.<!WebInspector.CSSParser.Rule>} parsedCSS + * @return {!WebInspector.SASSSupport.AST} + */ + function onParsed(parsedCSS) + { + var document = new WebInspector.SASSSupport.ASTDocument(url, text); + var rules = []; + for (var i = 0; i < parsedCSS.length; ++i) { + var rule = parsedCSS[i]; + if (!rule.properties) + continue; + var properties = []; + for (var j = 0; j < rule.properties.length; ++j) { + var cssProperty = rule.properties[j]; + var name = new WebInspector.SASSSupport.TextNode(document, cssProperty.name, WebInspector.TextRange.fromObject(cssProperty.nameRange)); + var value = new WebInspector.SASSSupport.TextNode(document, cssProperty.value, WebInspector.TextRange.fromObject(cssProperty.valueRange)); + var property = new WebInspector.SASSSupport.Property(document, name, value, WebInspector.TextRange.fromObject(cssProperty.range), !!cssProperty.disabled); + properties.push(property); + } + rules.push(new WebInspector.SASSSupport.Rule(document, rule.selectorText, properties)); + } + return new WebInspector.SASSSupport.AST(document, rules); + } } /** @@ -208,6 +234,17 @@ /** * @constructor + * @param {string} url + * @param {string} text + */ +WebInspector.SASSSupport.ASTDocument = function(url, text) +{ + this.url = url; + this.text = text; +} + +/** + * @constructor * @param {!WebInspector.SASSSupport.ASTDocument} document */ WebInspector.SASSSupport.Node = function(document)
diff --git a/third_party/WebKit/Source/devtools/front_end/sass/module.json b/third_party/WebKit/Source/devtools/front_end/sass/module.json index fccff85d..21761c54 100644 --- a/third_party/WebKit/Source/devtools/front_end/sass/module.json +++ b/third_party/WebKit/Source/devtools/front_end/sass/module.json
@@ -1,5 +1,5 @@ { - "dependencies": ["platform", "common", "diff"], + "dependencies": ["platform", "common", "diff", "sdk"], "scripts": [ "SASSSupport.js" ]
diff --git a/third_party/WebKit/Source/devtools/front_end/script_formatter_worker/ScriptFormatterWorker.js b/third_party/WebKit/Source/devtools/front_end/script_formatter_worker/ScriptFormatterWorker.js index e0921ba7..9af72ef5f 100644 --- a/third_party/WebKit/Source/devtools/front_end/script_formatter_worker/ScriptFormatterWorker.js +++ b/third_party/WebKit/Source/devtools/front_end/script_formatter_worker/ScriptFormatterWorker.js
@@ -286,7 +286,7 @@ break; case FormatterWorker.CSSParserStates.PropertyName: if (tokenValue === ":" && tokenType === UndefTokenType) { - property.name = property.name.trim(); + property.name = property.name; property.nameRange.endLine = lineNumber; property.nameRange.endColumn = column; property.valueRange = createRange(lineNumber, newColumn); @@ -297,7 +297,7 @@ break; case FormatterWorker.CSSParserStates.PropertyValue: if ((tokenValue === ";" || tokenValue === "}") && tokenType === UndefTokenType) { - property.value = property.value.trim(); + property.value = property.value; property.valueRange.endLine = lineNumber; property.valueRange.endColumn = column; property.range.endLine = lineNumber; @@ -328,6 +328,7 @@ for (lineNumber = 0; lineNumber < lines.length; ++lineNumber) { var line = lines[lineNumber]; tokenizer(line, processToken); + processToken("\n", null, line.length, line.length + 1); } chunkCallback({ chunk: rules, isLastChunk: true });
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/CSSParser.js b/third_party/WebKit/Source/devtools/front_end/sdk/CSSParser.js index a09318c..e19aefb 100644 --- a/third_party/WebKit/Source/devtools/front_end/sdk/CSSParser.js +++ b/third_party/WebKit/Source/devtools/front_end/sdk/CSSParser.js
@@ -42,6 +42,25 @@ this._innerParse(text); }, + /** + * @param {string} text + * @return {!Promise<!Array.<!WebInspector.CSSParser.Rule>>} + */ + parsePromise: function(text) + { + return new Promise(promiseConstructor.bind(this)); + + /** + * @param {function()} succ + * @param {function()} fail + * @this {WebInspector.CSSParser} + */ + function promiseConstructor(succ, fail) + { + this.parse(text, succ); + } + }, + dispose: function() { if (this._worker) {
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/ConsoleModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/ConsoleModel.js index acc0d6b..a814dca6b 100644 --- a/third_party/WebKit/Source/devtools/front_end/sdk/ConsoleModel.js +++ b/third_party/WebKit/Source/devtools/front_end/sdk/ConsoleModel.js
@@ -189,7 +189,6 @@ */ WebInspector.ConsoleModel.evaluateCommandInConsole = function(executionContext, text, useCommandLineAPI) { - useCommandLineAPI = !!useCommandLineAPI; var target = executionContext.target(); var commandMessage = new WebInspector.ConsoleMessage(target, WebInspector.ConsoleMessage.MessageSource.JS, null, text, WebInspector.ConsoleMessage.MessageType.Command); @@ -213,8 +212,9 @@ target.consoleModel.dispatchEventToListeners(WebInspector.ConsoleModel.Events.CommandEvaluated, {result: result, wasThrown: wasThrown, text: text, commandMessage: commandMessage, exceptionDetails: exceptionDetails}); } } - - executionContext.evaluate(text, "console", useCommandLineAPI, false, false, true, printResult); + if (/^\s*\{/.test(text) && /\}\s*$/.test(text)) + text = '(' + text + ')'; + executionContext.evaluate(text, "console", !!useCommandLineAPI, false, false, true, printResult); WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.ConsoleEvaluated); }
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/NetworkManager.js b/third_party/WebKit/Source/devtools/front_end/sdk/NetworkManager.js index b0622e08..a4a945f 100644 --- a/third_party/WebKit/Source/devtools/front_end/sdk/NetworkManager.js +++ b/third_party/WebKit/Source/devtools/front_end/sdk/NetworkManager.js
@@ -44,7 +44,6 @@ this._networkAgent.setCacheDisabled(true); if (WebInspector.moduleSetting("monitoringXHREnabled").get()) this._networkAgent.setMonitoringXHREnabled(true); - this._initNetworkConditions(); this._networkAgent.enable(); /** @type {!Map<!NetworkAgent.CertificateId, !Promise<!NetworkAgent.CertificateDetails>>} */ @@ -72,18 +71,9 @@ "text/vtt": {"texttrack": true}, } -/** @typedef {{throughput: number, latency: number}} */ +/** @typedef {{download: number, upload: number, latency: number}} */ WebInspector.NetworkManager.Conditions; -/** - * @param {!WebInspector.NetworkManager.Conditions} conditions - * @return {boolean} - */ -WebInspector.NetworkManager.IsThrottlingEnabled = function(conditions) -{ - return conditions.throughput >= 0; -} - WebInspector.NetworkManager.prototype = { /** * @param {string} url @@ -108,46 +98,6 @@ WebInspector.moduleSetting("cacheDisabled").removeChangeListener(this._cacheDisabledSettingChanged, this); }, - _initNetworkConditions: function() - { - this._networkAgent.canEmulateNetworkConditions(callback.bind(this)); - - /** - * @this {WebInspector.NetworkManager} - */ - function callback(error, canEmulate) - { - if (error || !canEmulate) - return; - WebInspector.moduleSetting("networkConditions").addChangeListener(this._networkConditionsSettingChanged, this); - var conditions = WebInspector.moduleSetting("networkConditions").get(); - if (conditions.throughput < 0) - return; - this._updateNetworkConditions(conditions); - } - }, - - /** - * @param {!WebInspector.NetworkManager.Conditions} conditions - */ - _updateNetworkConditions: function(conditions) - { - if (conditions.throughput < 0) { - this._networkAgent.emulateNetworkConditions(false, 0, 0, 0); - } else { - var offline = !conditions.throughput && !conditions.latency; - this._networkAgent.emulateNetworkConditions(!!offline, conditions.latency, conditions.throughput, conditions.throughput); - } - }, - - /** - * @param {!WebInspector.Event} event - */ - _networkConditionsSettingChanged: function(event) - { - this._updateNetworkConditions(/** @type {!WebInspector.NetworkManager.Conditions} */ (event.data)); - }, - /** * @param {!NetworkAgent.CertificateId} certificateId * @return {!Promise<!NetworkAgent.CertificateDetails>} @@ -701,9 +651,14 @@ this._updateBlockedURLs(); this._userAgentOverride = ""; + /** @type {!Set<!Protocol.NetworkAgent>} */ + this._agentsCapableOfEmulation = new Set(); + /** @type {!WebInspector.NetworkManager.Conditions} */ + this._networkConditions = { download: -1, upload: -1, latency: 0 }; } WebInspector.MultitargetNetworkManager.Events = { + ConditionsChanged: "ConditionsChanged", UserAgentChanged: "UserAgentChanged" } @@ -721,6 +676,20 @@ networkAgent.setUserAgentOverride(this._currentUserAgent()); for (var url of this._blockedURLs) networkAgent.addBlockedURL(url); + + networkAgent.canEmulateNetworkConditions(callback.bind(this)); + + /** + * @this {WebInspector.MultitargetNetworkManager} + */ + function callback(error, canEmulate) + { + if (error || !canEmulate) + return; + this._agentsCapableOfEmulation.add(networkAgent); + if (this.isThrottling()) + this._updateNetworkConditions(networkAgent); + } }, /** @@ -729,6 +698,55 @@ */ targetRemoved: function(target) { + this._agentsCapableOfEmulation.delete(target.networkAgent()); + }, + + /** + * @return {boolean} + */ + isThrottling: function() + { + return this._networkConditions.download >= 0 || this._networkConditions.upload >= 0 || this._networkConditions.latency > 0; + }, + + /** + * @return {boolean} + */ + isOffline: function() + { + return !this._networkConditions.download && !this._networkConditions.upload; + }, + + /** + * @param {!WebInspector.NetworkManager.Conditions} conditions + */ + setNetworkConditions: function(conditions) + { + this._networkConditions = conditions; + for (var agent of this._agentsCapableOfEmulation) + this._updateNetworkConditions(agent); + this.dispatchEventToListeners(WebInspector.MultitargetNetworkManager.Events.ConditionsChanged); + }, + + /** + * @return {!WebInspector.NetworkManager.Conditions} + */ + networkConditions: function() + { + return this._networkConditions; + }, + + /** + * @param {!Protocol.NetworkAgent} networkAgent + */ + _updateNetworkConditions: function(networkAgent) + { + var conditions = this._networkConditions; + if (!this.isThrottling()) { + networkAgent.emulateNetworkConditions(false, 0, 0, 0); + } else { + networkAgent.emulateNetworkConditions(this.isOffline(), conditions.latency, conditions.download < 0 ? 0 : conditions.download, conditions.upload < 0 ? 0 : conditions.upload); + } }, /**
diff --git a/third_party/WebKit/Source/modules/speech/SpeechSynthesis.cpp b/third_party/WebKit/Source/modules/speech/SpeechSynthesis.cpp index 454956d..8fdff01 100644 --- a/third_party/WebKit/Source/modules/speech/SpeechSynthesis.cpp +++ b/third_party/WebKit/Source/modules/speech/SpeechSynthesis.cpp
@@ -26,7 +26,6 @@ #include "config.h" #include "modules/speech/SpeechSynthesis.h" -#include "bindings/core/v8/ExceptionState.h" #include "core/dom/ExecutionContext.h" #include "modules/speech/SpeechSynthesisEvent.h" #include "platform/speech/PlatformSpeechSynthesisVoice.h" @@ -106,12 +105,9 @@ m_platformSpeechSynthesizer->speak(utterance->platformUtterance()); } -void SpeechSynthesis::speak(SpeechSynthesisUtterance* utterance, ExceptionState& exceptionState) +void SpeechSynthesis::speak(SpeechSynthesisUtterance* utterance) { - if (!utterance) { - exceptionState.throwTypeError("Invalid utterance argument"); - return; - } + ASSERT(utterance); m_utteranceQueue.append(utterance);
diff --git a/third_party/WebKit/Source/modules/speech/SpeechSynthesis.h b/third_party/WebKit/Source/modules/speech/SpeechSynthesis.h index 7a1b6a18..50284c4 100644 --- a/third_party/WebKit/Source/modules/speech/SpeechSynthesis.h +++ b/third_party/WebKit/Source/modules/speech/SpeechSynthesis.h
@@ -37,7 +37,6 @@ namespace blink { -class ExceptionState; class PlatformSpeechSynthesizerClient; class MODULES_EXPORT SpeechSynthesis final : public RefCountedGarbageCollectedEventTargetWithInlineData<SpeechSynthesis>, public PlatformSpeechSynthesizerClient, public ContextLifecycleObserver { @@ -51,7 +50,7 @@ bool speaking() const; bool paused() const; - void speak(SpeechSynthesisUtterance*, ExceptionState&); + void speak(SpeechSynthesisUtterance*); void cancel(); void pause(); void resume();
diff --git a/third_party/WebKit/Source/modules/speech/SpeechSynthesis.idl b/third_party/WebKit/Source/modules/speech/SpeechSynthesis.idl index 1c2960fc..17fa33a7 100644 --- a/third_party/WebKit/Source/modules/speech/SpeechSynthesis.idl +++ b/third_party/WebKit/Source/modules/speech/SpeechSynthesis.idl
@@ -31,7 +31,7 @@ readonly attribute boolean speaking; readonly attribute boolean paused; - [RaisesException, LegacyInterfaceTypeChecking] void speak(SpeechSynthesisUtterance utterance); + void speak(SpeechSynthesisUtterance utterance); void cancel(); void pause(); void resume();
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn index fa91981..6da7207 100644 --- a/third_party/WebKit/Source/platform/BUILD.gn +++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -335,15 +335,6 @@ } } -# TODO(GYP): Delete this after we've converted everything to GN. -# The _run targets exist only for compatibility w/ GYP. -group("blink_heap_unittests_run") { - testonly = true - deps = [ - ":blink_heap_unittests", - ] -} - # GYP: blink_heap_unittests test("blink_heap_unittests") { visibility = [] # Allow re-assignment of list. @@ -379,15 +370,6 @@ } } -# TODO(GYP): Delete this after we've converted everything to GN. -# The _run targets exist only for compatibility w/ GYP. -group("blink_platform_unittests_run") { - testonly = true - deps = [ - ":blink_platform_unittests", - ] -} - test("blink_platform_unittests") { visibility = [] # Allow re-assignment of list. visibility = [ "*" ]
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h index ee9f73e..c0aaded 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h +++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h
@@ -279,7 +279,6 @@ // for testing friend class CompositedLayerMappingTest; friend class FakeGraphicsLayerFactory; - friend class CompositedLayerMappingTest; private: // Adds a child without calling updateChildList(), so that adding children
diff --git a/third_party/WebKit/Source/platform/network/ContentSecurityPolicyResponseHeaders.h b/third_party/WebKit/Source/platform/network/ContentSecurityPolicyResponseHeaders.h index 2ffe7c1..b5a0635 100644 --- a/third_party/WebKit/Source/platform/network/ContentSecurityPolicyResponseHeaders.h +++ b/third_party/WebKit/Source/platform/network/ContentSecurityPolicyResponseHeaders.h
@@ -27,13 +27,15 @@ #define ContentSecurityPolicyResponseHeaders_h #include "platform/PlatformExport.h" +#include "wtf/Allocator.h" #include "wtf/text/WTFString.h" namespace blink { class ResourceResponse; -class PLATFORM_EXPORT ContentSecurityPolicyResponseHeaders { +class PLATFORM_EXPORT ContentSecurityPolicyResponseHeaders final { + STACK_ALLOCATED(); public: ContentSecurityPolicyResponseHeaders() { } explicit ContentSecurityPolicyResponseHeaders(const ResourceResponse&);
diff --git a/third_party/WebKit/Source/platform/network/EncodedFormData.h b/third_party/WebKit/Source/platform/network/EncodedFormData.h index 750d8aa..6bac443 100644 --- a/third_party/WebKit/Source/platform/network/EncodedFormData.h +++ b/third_party/WebKit/Source/platform/network/EncodedFormData.h
@@ -22,6 +22,7 @@ #include "platform/blob/BlobData.h" #include "platform/weborigin/KURL.h" +#include "wtf/Allocator.h" #include "wtf/Forward.h" #include "wtf/RefCounted.h" #include "wtf/Vector.h" @@ -32,6 +33,7 @@ class BlobDataHandle; class PLATFORM_EXPORT FormDataElement final { + DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); public: FormDataElement() : m_type(data) { } explicit FormDataElement(const Vector<char>& array) : m_type(data), m_data(array) { }
diff --git a/third_party/WebKit/Source/platform/network/FormDataEncoder.h b/third_party/WebKit/Source/platform/network/FormDataEncoder.h index 3d02571..b2688c0 100644 --- a/third_party/WebKit/Source/platform/network/FormDataEncoder.h +++ b/third_party/WebKit/Source/platform/network/FormDataEncoder.h
@@ -22,6 +22,7 @@ #define FormDataEncoder_h #include "platform/network/EncodedFormData.h" +#include "wtf/Allocator.h" #include "wtf/Forward.h" namespace WTF { @@ -31,7 +32,7 @@ namespace blink { class PLATFORM_EXPORT FormDataEncoder { - WTF_MAKE_NONCOPYABLE(FormDataEncoder); + STATIC_ONLY(FormDataEncoder); public: static WTF::TextEncoding encodingFromAcceptCharset(const String& acceptCharset, const String& charset, const String& defaultCharset); @@ -46,9 +47,6 @@ // Helper functions used by HTMLFormElement for non multi-part form data static void addKeyValuePairAsFormData(Vector<char>&, const CString& key, const CString& value, EncodedFormData::EncodingType = EncodedFormData::FormURLEncoded); static void encodeStringAsFormData(Vector<char>&, const CString&); - -private: - FormDataEncoder() { } }; }
diff --git a/third_party/WebKit/Source/platform/network/HTTPHeaderMap.cpp b/third_party/WebKit/Source/platform/network/HTTPHeaderMap.cpp index 75ebe1d..e90f702 100644 --- a/third_party/WebKit/Source/platform/network/HTTPHeaderMap.cpp +++ b/third_party/WebKit/Source/platform/network/HTTPHeaderMap.cpp
@@ -65,6 +65,7 @@ // Adapter that allows the HashMap to take C strings as keys. struct CaseFoldingCStringTranslator { + STATIC_ONLY(CaseFoldingCStringTranslator); static unsigned hash(const char* cString) { return CaseFoldingHash::hash(cString, strlen(cString));
diff --git a/third_party/WebKit/Source/platform/network/HTTPHeaderMap.h b/third_party/WebKit/Source/platform/network/HTTPHeaderMap.h index 43d5ff3..a68d59a 100644 --- a/third_party/WebKit/Source/platform/network/HTTPHeaderMap.h +++ b/third_party/WebKit/Source/platform/network/HTTPHeaderMap.h
@@ -28,6 +28,7 @@ #define HTTPHeaderMap_h #include "platform/PlatformExport.h" +#include "wtf/Allocator.h" #include "wtf/HashMap.h" #include "wtf/PassOwnPtr.h" #include "wtf/Vector.h" @@ -41,7 +42,8 @@ typedef Vector<std::pair<String, String>> CrossThreadHTTPHeaderMapData; // FIXME: Not every header fits into a map. Notably, multiple Set-Cookie header fields are needed to set multiple cookies. -class PLATFORM_EXPORT HTTPHeaderMap { +class PLATFORM_EXPORT HTTPHeaderMap final { + DISALLOW_NEW(); public: HTTPHeaderMap(); ~HTTPHeaderMap();
diff --git a/third_party/WebKit/Source/platform/network/HTTPParsers.h b/third_party/WebKit/Source/platform/network/HTTPParsers.h index 7bad5d8..34e9f96c 100644 --- a/third_party/WebKit/Source/platform/network/HTTPParsers.h +++ b/third_party/WebKit/Source/platform/network/HTTPParsers.h
@@ -32,6 +32,7 @@ #define HTTPParsers_h #include "platform/PlatformExport.h" +#include "wtf/Allocator.h" #include "wtf/Forward.h" #include "wtf/HashSet.h" #include "wtf/Vector.h" @@ -71,6 +72,7 @@ using CommaDelimitedHeaderSet = HashSet<String, CaseFoldingHash>; struct CacheControlHeader { + DISALLOW_NEW(); bool parsed : 1; bool containsNoCache : 1; bool containsNoStore : 1;
diff --git a/third_party/WebKit/Source/platform/network/ParsedContentType.cpp b/third_party/WebKit/Source/platform/network/ParsedContentType.cpp index 013bd74..8586c02 100644 --- a/third_party/WebKit/Source/platform/network/ParsedContentType.cpp +++ b/third_party/WebKit/Source/platform/network/ParsedContentType.cpp
@@ -37,7 +37,8 @@ namespace blink { -class DummyParsedContentType { +class DummyParsedContentType final { + STACK_ALLOCATED(); public: void setContentType(const SubstringRange&) const { } void setContentTypeParameter(const SubstringRange&, const SubstringRange&) const { }
diff --git a/third_party/WebKit/Source/platform/network/ParsedContentType.h b/third_party/WebKit/Source/platform/network/ParsedContentType.h index 9226ed3..a31edfd 100644 --- a/third_party/WebKit/Source/platform/network/ParsedContentType.h +++ b/third_party/WebKit/Source/platform/network/ParsedContentType.h
@@ -33,6 +33,7 @@ #define ParsedContentType_h #include "platform/PlatformExport.h" +#include "wtf/Allocator.h" #include "wtf/HashMap.h" #include "wtf/text/StringHash.h" @@ -43,7 +44,8 @@ PLATFORM_EXPORT bool isValidContentType(const String&); // FIXME: add support for comments. -class PLATFORM_EXPORT ParsedContentType { +class PLATFORM_EXPORT ParsedContentType final { + STACK_ALLOCATED(); public: explicit ParsedContentType(const String&);
diff --git a/third_party/WebKit/Source/platform/network/ResourceError.h b/third_party/WebKit/Source/platform/network/ResourceError.h index f3baec9..ab9a60f 100644 --- a/third_party/WebKit/Source/platform/network/ResourceError.h +++ b/third_party/WebKit/Source/platform/network/ResourceError.h
@@ -28,13 +28,15 @@ #define ResourceError_h #include "platform/PlatformExport.h" +#include "wtf/Allocator.h" #include "wtf/text/WTFString.h" namespace blink { PLATFORM_EXPORT extern const char errorDomainBlinkInternal[]; // Used for errors that won't be exposed to clients. -class PLATFORM_EXPORT ResourceError { +class PLATFORM_EXPORT ResourceError final { + DISALLOW_NEW(); public: static ResourceError cancelledError(const String& failingURL); static ResourceError cancelledDueToAccessCheckError(const String& failingURL);
diff --git a/third_party/WebKit/Source/platform/network/ResourceLoadPriority.h b/third_party/WebKit/Source/platform/network/ResourceLoadPriority.h index 2a2b2d3..d1918ff9 100644 --- a/third_party/WebKit/Source/platform/network/ResourceLoadPriority.h +++ b/third_party/WebKit/Source/platform/network/ResourceLoadPriority.h
@@ -26,6 +26,8 @@ #ifndef ResourceLoadPriority_h #define ResourceLoadPriority_h +#include "wtf/Allocator.h" + namespace blink { enum ResourceLoadPriority { @@ -41,7 +43,8 @@ ResourceLoadPriorityHighest = ResourceLoadPriorityVeryHigh, }; -struct ResourcePriority { +struct ResourcePriority final { + STACK_ALLOCATED(); public: enum VisibilityStatus { NotVisible,
diff --git a/third_party/WebKit/Source/platform/network/ResourceRequest.cpp b/third_party/WebKit/Source/platform/network/ResourceRequest.cpp index 5ee3653..196d080 100644 --- a/third_party/WebKit/Source/platform/network/ResourceRequest.cpp +++ b/third_party/WebKit/Source/platform/network/ResourceRequest.cpp
@@ -33,44 +33,43 @@ double ResourceRequest::s_defaultTimeoutInterval = INT_MAX; -PassOwnPtr<ResourceRequest> ResourceRequest::adopt(PassOwnPtr<CrossThreadResourceRequestData> data) +ResourceRequest::ResourceRequest(CrossThreadResourceRequestData* data) + : ResourceRequest() { - OwnPtr<ResourceRequest> request = adoptPtr(new ResourceRequest()); - request->setURL(data->m_url); - request->setCachePolicy(data->m_cachePolicy); - request->setTimeoutInterval(data->m_timeoutInterval); - request->setFirstPartyForCookies(data->m_firstPartyForCookies); - request->setRequestorOrigin(data->m_requestorOrigin); - request->setHTTPMethod(AtomicString(data->m_httpMethod)); - request->setPriority(data->m_priority, data->m_intraPriorityValue); + setURL(data->m_url); + setCachePolicy(data->m_cachePolicy); + setTimeoutInterval(data->m_timeoutInterval); + setFirstPartyForCookies(data->m_firstPartyForCookies); + setRequestorOrigin(data->m_requestorOrigin); + setHTTPMethod(AtomicString(data->m_httpMethod)); + setPriority(data->m_priority, data->m_intraPriorityValue); - request->m_httpHeaderFields.adopt(data->m_httpHeaders.release()); + m_httpHeaderFields.adopt(data->m_httpHeaders.release()); - request->setHTTPBody(data->m_httpBody); - request->setAllowStoredCredentials(data->m_allowStoredCredentials); - request->setReportUploadProgress(data->m_reportUploadProgress); - request->setHasUserGesture(data->m_hasUserGesture); - request->setDownloadToFile(data->m_downloadToFile); - request->setUseStreamOnResponse(data->m_useStreamOnResponse); - request->setSkipServiceWorker(data->m_skipServiceWorker); - request->setShouldResetAppCache(data->m_shouldResetAppCache); - request->setRequestorID(data->m_requestorID); - request->setRequestorProcessID(data->m_requestorProcessID); - request->setAppCacheHostID(data->m_appCacheHostID); - request->setRequestContext(data->m_requestContext); - request->setFrameType(data->m_frameType); - request->setFetchRequestMode(data->m_fetchRequestMode); - request->setFetchCredentialsMode(data->m_fetchCredentialsMode); - request->setFetchRedirectMode(data->m_fetchRedirectMode); - request->setLoFiState(data->m_loFiState); - request->m_referrerPolicy = data->m_referrerPolicy; - request->m_didSetHTTPReferrer = data->m_didSetHTTPReferrer; - request->m_checkForBrowserSideNavigation = data->m_checkForBrowserSideNavigation; - request->m_uiStartTime = data->m_uiStartTime; - request->m_originatesFromReservedIPRange = data->m_originatesFromReservedIPRange; - request->m_inputPerfMetricReportPolicy = data->m_inputPerfMetricReportPolicy; - request->m_followedRedirect = data->m_followedRedirect; - return request.release(); + setHTTPBody(data->m_httpBody); + setAllowStoredCredentials(data->m_allowStoredCredentials); + setReportUploadProgress(data->m_reportUploadProgress); + setHasUserGesture(data->m_hasUserGesture); + setDownloadToFile(data->m_downloadToFile); + setUseStreamOnResponse(data->m_useStreamOnResponse); + setSkipServiceWorker(data->m_skipServiceWorker); + setShouldResetAppCache(data->m_shouldResetAppCache); + setRequestorID(data->m_requestorID); + setRequestorProcessID(data->m_requestorProcessID); + setAppCacheHostID(data->m_appCacheHostID); + setRequestContext(data->m_requestContext); + setFrameType(data->m_frameType); + setFetchRequestMode(data->m_fetchRequestMode); + setFetchCredentialsMode(data->m_fetchCredentialsMode); + setFetchRedirectMode(data->m_fetchRedirectMode); + setLoFiState(data->m_loFiState); + m_referrerPolicy = data->m_referrerPolicy; + m_didSetHTTPReferrer = data->m_didSetHTTPReferrer; + m_checkForBrowserSideNavigation = data->m_checkForBrowserSideNavigation; + m_uiStartTime = data->m_uiStartTime; + m_originatesFromReservedIPRange = data->m_originatesFromReservedIPRange; + m_inputPerfMetricReportPolicy = data->m_inputPerfMetricReportPolicy; + m_followedRedirect = data->m_followedRedirect; } PassOwnPtr<CrossThreadResourceRequestData> ResourceRequest::copyData() const
diff --git a/third_party/WebKit/Source/platform/network/ResourceRequest.h b/third_party/WebKit/Source/platform/network/ResourceRequest.h index e4649d0..93da157 100644 --- a/third_party/WebKit/Source/platform/network/ResourceRequest.h +++ b/third_party/WebKit/Source/platform/network/ResourceRequest.h
@@ -65,8 +65,8 @@ struct CrossThreadResourceRequestData; -class PLATFORM_EXPORT ResourceRequest { - USING_FAST_MALLOC(ResourceRequest); +class PLATFORM_EXPORT ResourceRequest final { + DISALLOW_NEW(); public: class ExtraData : public RefCounted<ExtraData> { public: @@ -88,7 +88,7 @@ initialize(url); } - static PassOwnPtr<ResourceRequest> adopt(PassOwnPtr<CrossThreadResourceRequestData>); + explicit ResourceRequest(CrossThreadResourceRequestData*); // Gets a copy of the data suitable for passing to another thread. PassOwnPtr<CrossThreadResourceRequestData> copyData() const;
diff --git a/third_party/WebKit/Source/platform/network/ResourceRequestTest.cpp b/third_party/WebKit/Source/platform/network/ResourceRequestTest.cpp index 19e4583..c3339b8 100644 --- a/third_party/WebKit/Source/platform/network/ResourceRequestTest.cpp +++ b/third_party/WebKit/Source/platform/network/ResourceRequestTest.cpp
@@ -76,49 +76,49 @@ EXPECT_EQ(ReferrerPolicyDefault, original.referrerPolicy()); OwnPtr<CrossThreadResourceRequestData> data1(original.copyData()); - OwnPtr<ResourceRequest> copy1(ResourceRequest::adopt(data1.release())); + ResourceRequest copy1(data1.get()); - EXPECT_STREQ("http://www.example.com/test.htm", copy1->url().string().utf8().data()); - EXPECT_EQ(UseProtocolCachePolicy, copy1->cachePolicy()); - EXPECT_EQ(10, copy1->timeoutInterval()); - EXPECT_STREQ("http://www.example.com/first_party.htm", copy1->firstPartyForCookies().string().utf8().data()); - EXPECT_STREQ("www.example.com", copy1->requestorOrigin()->host().utf8().data()); - EXPECT_STREQ("GET", copy1->httpMethod().utf8().data()); - EXPECT_STREQ("Bar", copy1->httpHeaderFields().get("Foo").utf8().data()); - EXPECT_EQ(ResourceLoadPriorityLow, copy1->priority()); - EXPECT_STREQ("Test Body", copy1->httpBody()->flattenToString().utf8().data()); - EXPECT_FALSE(copy1->allowStoredCredentials()); - EXPECT_FALSE(copy1->reportUploadProgress()); - EXPECT_FALSE(copy1->hasUserGesture()); - EXPECT_FALSE(copy1->downloadToFile()); - EXPECT_FALSE(copy1->skipServiceWorker()); - EXPECT_EQ(WebURLRequest::FetchRequestModeCORS, copy1->fetchRequestMode()); - EXPECT_EQ(WebURLRequest::FetchCredentialsModeSameOrigin, copy1->fetchCredentialsMode()); - EXPECT_EQ(30, copy1->requestorID()); - EXPECT_EQ(40, copy1->requestorProcessID()); - EXPECT_EQ(50, copy1->appCacheHostID()); - EXPECT_EQ(WebURLRequest::RequestContextAudio, copy1->requestContext()); - EXPECT_EQ(WebURLRequest::FrameTypeNested, copy1->frameType()); - EXPECT_STREQ("http://www.example.com/referrer.htm", copy1->httpReferrer().utf8().data()); - EXPECT_EQ(ReferrerPolicyDefault, copy1->referrerPolicy()); + EXPECT_STREQ("http://www.example.com/test.htm", copy1.url().string().utf8().data()); + EXPECT_EQ(UseProtocolCachePolicy, copy1.cachePolicy()); + EXPECT_EQ(10, copy1.timeoutInterval()); + EXPECT_STREQ("http://www.example.com/first_party.htm", copy1.firstPartyForCookies().string().utf8().data()); + EXPECT_STREQ("www.example.com", copy1.requestorOrigin()->host().utf8().data()); + EXPECT_STREQ("GET", copy1.httpMethod().utf8().data()); + EXPECT_STREQ("Bar", copy1.httpHeaderFields().get("Foo").utf8().data()); + EXPECT_EQ(ResourceLoadPriorityLow, copy1.priority()); + EXPECT_STREQ("Test Body", copy1.httpBody()->flattenToString().utf8().data()); + EXPECT_FALSE(copy1.allowStoredCredentials()); + EXPECT_FALSE(copy1.reportUploadProgress()); + EXPECT_FALSE(copy1.hasUserGesture()); + EXPECT_FALSE(copy1.downloadToFile()); + EXPECT_FALSE(copy1.skipServiceWorker()); + EXPECT_EQ(WebURLRequest::FetchRequestModeCORS, copy1.fetchRequestMode()); + EXPECT_EQ(WebURLRequest::FetchCredentialsModeSameOrigin, copy1.fetchCredentialsMode()); + EXPECT_EQ(30, copy1.requestorID()); + EXPECT_EQ(40, copy1.requestorProcessID()); + EXPECT_EQ(50, copy1.appCacheHostID()); + EXPECT_EQ(WebURLRequest::RequestContextAudio, copy1.requestContext()); + EXPECT_EQ(WebURLRequest::FrameTypeNested, copy1.frameType()); + EXPECT_STREQ("http://www.example.com/referrer.htm", copy1.httpReferrer().utf8().data()); + EXPECT_EQ(ReferrerPolicyDefault, copy1.referrerPolicy()); - copy1->setAllowStoredCredentials(true); - copy1->setReportUploadProgress(true); - copy1->setHasUserGesture(true); - copy1->setDownloadToFile(true); - copy1->setSkipServiceWorker(true); - copy1->setFetchRequestMode(WebURLRequest::FetchRequestModeNoCORS); - copy1->setFetchCredentialsMode(WebURLRequest::FetchCredentialsModeInclude); + copy1.setAllowStoredCredentials(true); + copy1.setReportUploadProgress(true); + copy1.setHasUserGesture(true); + copy1.setDownloadToFile(true); + copy1.setSkipServiceWorker(true); + copy1.setFetchRequestMode(WebURLRequest::FetchRequestModeNoCORS); + copy1.setFetchCredentialsMode(WebURLRequest::FetchCredentialsModeInclude); - OwnPtr<CrossThreadResourceRequestData> data2(copy1->copyData()); - OwnPtr<ResourceRequest> copy2(ResourceRequest::adopt(data2.release())); - EXPECT_TRUE(copy2->allowStoredCredentials()); - EXPECT_TRUE(copy2->reportUploadProgress()); - EXPECT_TRUE(copy2->hasUserGesture()); - EXPECT_TRUE(copy2->downloadToFile()); - EXPECT_TRUE(copy2->skipServiceWorker()); - EXPECT_EQ(WebURLRequest::FetchRequestModeNoCORS, copy1->fetchRequestMode()); - EXPECT_EQ(WebURLRequest::FetchCredentialsModeInclude, copy1->fetchCredentialsMode()); + OwnPtr<CrossThreadResourceRequestData> data2(copy1.copyData()); + ResourceRequest copy2(data2.get()); + EXPECT_TRUE(copy2.allowStoredCredentials()); + EXPECT_TRUE(copy2.reportUploadProgress()); + EXPECT_TRUE(copy2.hasUserGesture()); + EXPECT_TRUE(copy2.downloadToFile()); + EXPECT_TRUE(copy2.skipServiceWorker()); + EXPECT_EQ(WebURLRequest::FetchRequestModeNoCORS, copy1.fetchRequestMode()); + EXPECT_EQ(WebURLRequest::FetchCredentialsModeInclude, copy1.fetchCredentialsMode()); } TEST(ResourceRequestTest, SetHasUserGesture)
diff --git a/third_party/WebKit/Source/platform/network/ResourceResponse.cpp b/third_party/WebKit/Source/platform/network/ResourceResponse.cpp index 1ba750e5..1129c67 100644 --- a/third_party/WebKit/Source/platform/network/ResourceResponse.cpp +++ b/third_party/WebKit/Source/platform/network/ResourceResponse.cpp
@@ -102,51 +102,49 @@ { } -PassOwnPtr<ResourceResponse> ResourceResponse::adopt(PassOwnPtr<CrossThreadResourceResponseData> data) +ResourceResponse::ResourceResponse(CrossThreadResourceResponseData* data) + : ResourceResponse() { - OwnPtr<ResourceResponse> response = adoptPtr(new ResourceResponse); - response->setURL(data->m_url); - response->setMimeType(AtomicString(data->m_mimeType)); - response->setExpectedContentLength(data->m_expectedContentLength); - response->setTextEncodingName(AtomicString(data->m_textEncodingName)); - response->setSuggestedFilename(data->m_suggestedFilename); + setURL(data->m_url); + setMimeType(AtomicString(data->m_mimeType)); + setExpectedContentLength(data->m_expectedContentLength); + setTextEncodingName(AtomicString(data->m_textEncodingName)); + setSuggestedFilename(data->m_suggestedFilename); - response->setHTTPStatusCode(data->m_httpStatusCode); - response->setHTTPStatusText(AtomicString(data->m_httpStatusText)); + setHTTPStatusCode(data->m_httpStatusCode); + setHTTPStatusText(AtomicString(data->m_httpStatusText)); - response->m_httpHeaderFields.adopt(data->m_httpHeaders.release()); - response->setLastModifiedDate(data->m_lastModifiedDate); - response->setResourceLoadTiming(data->m_resourceLoadTiming.release()); - response->m_securityInfo = data->m_securityInfo; - response->m_hasMajorCertificateErrors = data->m_hasMajorCertificateErrors; - response->m_securityStyle = data->m_securityStyle; - response->m_securityDetails.protocol = data->m_securityDetails.protocol; - response->m_securityDetails.cipher = data->m_securityDetails.cipher; - response->m_securityDetails.keyExchange = data->m_securityDetails.keyExchange; - response->m_securityDetails.mac = data->m_securityDetails.mac; - response->m_securityDetails.certID = data->m_securityDetails.certID; - response->m_httpVersion = data->m_httpVersion; - response->m_appCacheID = data->m_appCacheID; - response->m_appCacheManifestURL = data->m_appCacheManifestURL.copy(); - response->m_isMultipartPayload = data->m_isMultipartPayload; - response->m_wasFetchedViaSPDY = data->m_wasFetchedViaSPDY; - response->m_wasNpnNegotiated = data->m_wasNpnNegotiated; - response->m_wasAlternateProtocolAvailable = data->m_wasAlternateProtocolAvailable; - response->m_wasFetchedViaProxy = data->m_wasFetchedViaProxy; - response->m_wasFetchedViaServiceWorker = data->m_wasFetchedViaServiceWorker; - response->m_wasFallbackRequiredByServiceWorker = data->m_wasFallbackRequiredByServiceWorker; - response->m_serviceWorkerResponseType = data->m_serviceWorkerResponseType; - response->m_originalURLViaServiceWorker = data->m_originalURLViaServiceWorker; - response->m_responseTime = data->m_responseTime; - response->m_remoteIPAddress = AtomicString(data->m_remoteIPAddress); - response->m_remotePort = data->m_remotePort; - response->m_downloadedFilePath = data->m_downloadedFilePath; - response->m_downloadedFileHandle = data->m_downloadedFileHandle; + m_httpHeaderFields.adopt(data->m_httpHeaders.release()); + setLastModifiedDate(data->m_lastModifiedDate); + setResourceLoadTiming(data->m_resourceLoadTiming.release()); + m_securityInfo = data->m_securityInfo; + m_hasMajorCertificateErrors = data->m_hasMajorCertificateErrors; + m_securityStyle = data->m_securityStyle; + m_securityDetails.protocol = data->m_securityDetails.protocol; + m_securityDetails.cipher = data->m_securityDetails.cipher; + m_securityDetails.keyExchange = data->m_securityDetails.keyExchange; + m_securityDetails.mac = data->m_securityDetails.mac; + m_securityDetails.certID = data->m_securityDetails.certID; + m_httpVersion = data->m_httpVersion; + m_appCacheID = data->m_appCacheID; + m_appCacheManifestURL = data->m_appCacheManifestURL.copy(); + m_isMultipartPayload = data->m_isMultipartPayload; + m_wasFetchedViaSPDY = data->m_wasFetchedViaSPDY; + m_wasNpnNegotiated = data->m_wasNpnNegotiated; + m_wasAlternateProtocolAvailable = data->m_wasAlternateProtocolAvailable; + m_wasFetchedViaProxy = data->m_wasFetchedViaProxy; + m_wasFetchedViaServiceWorker = data->m_wasFetchedViaServiceWorker; + m_wasFallbackRequiredByServiceWorker = data->m_wasFallbackRequiredByServiceWorker; + m_serviceWorkerResponseType = data->m_serviceWorkerResponseType; + m_originalURLViaServiceWorker = data->m_originalURLViaServiceWorker; + m_responseTime = data->m_responseTime; + m_remoteIPAddress = AtomicString(data->m_remoteIPAddress); + m_remotePort = data->m_remotePort; + m_downloadedFilePath = data->m_downloadedFilePath; + m_downloadedFileHandle = data->m_downloadedFileHandle; // Bug https://bugs.webkit.org/show_bug.cgi?id=60397 this doesn't support // whatever values may be present in the opaque m_extraData structure. - - return response.release(); } PassOwnPtr<CrossThreadResourceResponseData> ResourceResponse::copyData() const
diff --git a/third_party/WebKit/Source/platform/network/ResourceResponse.h b/third_party/WebKit/Source/platform/network/ResourceResponse.h index 9c19606..483895c 100644 --- a/third_party/WebKit/Source/platform/network/ResourceResponse.h +++ b/third_party/WebKit/Source/platform/network/ResourceResponse.h
@@ -43,8 +43,8 @@ struct CrossThreadResourceResponseData; -class PLATFORM_EXPORT ResourceResponse { - USING_FAST_MALLOC(ResourceResponse); +class PLATFORM_EXPORT ResourceResponse final { + DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); public: enum HTTPVersion { HTTPVersionUnknown, HTTPVersion_0_9, @@ -60,6 +60,7 @@ }; struct SecurityDetails { + DISALLOW_NEW(); SecurityDetails() : certID(0) {} // All strings are human-readable values. String protocol; @@ -76,7 +77,7 @@ virtual ~ExtraData() { } }; - static PassOwnPtr<ResourceResponse> adopt(PassOwnPtr<CrossThreadResourceResponseData>); + explicit ResourceResponse(CrossThreadResourceResponseData*); // Gets a copy of the data suitable for passing to another thread. PassOwnPtr<CrossThreadResourceResponseData> copyData() const;
diff --git a/third_party/WebKit/Source/platform/network/ResourceTimingInfo.cpp b/third_party/WebKit/Source/platform/network/ResourceTimingInfo.cpp index 1915cc6..a1faa42 100644 --- a/third_party/WebKit/Source/platform/network/ResourceTimingInfo.cpp +++ b/third_party/WebKit/Source/platform/network/ResourceTimingInfo.cpp
@@ -14,10 +14,10 @@ OwnPtr<ResourceTimingInfo> info = ResourceTimingInfo::create(AtomicString(data->m_type), data->m_initialTime, data->m_isMainResource); info->m_originalTimingAllowOrigin = AtomicString(data->m_originalTimingAllowOrigin); info->m_loadFinishTime = data->m_loadFinishTime; - info->m_initialRequest = *ResourceRequest::adopt(data->m_initialRequest.release()); - info->m_finalResponse = *ResourceResponse::adopt(data->m_finalResponse.release()); + info->m_initialRequest = ResourceRequest(data->m_initialRequest.get()); + info->m_finalResponse = ResourceResponse(data->m_finalResponse.get()); for (auto& responseData : data->m_redirectChain) - info->m_redirectChain.append(*ResourceResponse::adopt(responseData.release())); + info->m_redirectChain.append(ResourceResponse(responseData.get())); return info.release(); }
diff --git a/third_party/WebKit/Source/platform/network/ResourceTimingInfo.h b/third_party/WebKit/Source/platform/network/ResourceTimingInfo.h index a0f08da1..08d660cf 100644 --- a/third_party/WebKit/Source/platform/network/ResourceTimingInfo.h +++ b/third_party/WebKit/Source/platform/network/ResourceTimingInfo.h
@@ -34,6 +34,8 @@ #include "platform/CrossThreadCopier.h" #include "platform/network/ResourceRequest.h" #include "platform/network/ResourceResponse.h" +#include "wtf/Allocator.h" +#include "wtf/Noncopyable.h" #include "wtf/text/AtomicString.h" namespace blink { @@ -41,6 +43,8 @@ struct CrossThreadResourceTimingInfoData; class PLATFORM_EXPORT ResourceTimingInfo { + USING_FAST_MALLOC(ResourceTimingInfo); + WTF_MAKE_NONCOPYABLE(ResourceTimingInfo); public: static PassOwnPtr<ResourceTimingInfo> create(const AtomicString& type, const double time, bool isMainResource) {
diff --git a/third_party/WebKit/Source/platform/network/WebSocketHandshakeRequest.h b/third_party/WebKit/Source/platform/network/WebSocketHandshakeRequest.h index c7aa094..f6a006c 100644 --- a/third_party/WebKit/Source/platform/network/WebSocketHandshakeRequest.h +++ b/third_party/WebKit/Source/platform/network/WebSocketHandshakeRequest.h
@@ -42,7 +42,7 @@ class HTTPHeaderMap; -class PLATFORM_EXPORT WebSocketHandshakeRequest : public RefCounted<WebSocketHandshakeRequest> { +class PLATFORM_EXPORT WebSocketHandshakeRequest final : public RefCounted<WebSocketHandshakeRequest> { public: static PassRefPtr<WebSocketHandshakeRequest> create(const KURL& url) { return adoptRef(new WebSocketHandshakeRequest(url)); } static PassRefPtr<WebSocketHandshakeRequest> create() { return adoptRef(new WebSocketHandshakeRequest); }
diff --git a/third_party/WebKit/Source/platform/network/WebSocketHandshakeResponse.h b/third_party/WebKit/Source/platform/network/WebSocketHandshakeResponse.h index 64bdc099..832311b 100644 --- a/third_party/WebKit/Source/platform/network/WebSocketHandshakeResponse.h +++ b/third_party/WebKit/Source/platform/network/WebSocketHandshakeResponse.h
@@ -37,7 +37,7 @@ namespace blink { -class PLATFORM_EXPORT WebSocketHandshakeResponse { +class PLATFORM_EXPORT WebSocketHandshakeResponse final { public: WebSocketHandshakeResponse(); ~WebSocketHandshakeResponse();
diff --git a/third_party/WebKit/Source/web/BUILD.gn b/third_party/WebKit/Source/web/BUILD.gn index caa4ea1..14d51c1 100644 --- a/third_party/WebKit/Source/web/BUILD.gn +++ b/third_party/WebKit/Source/web/BUILD.gn
@@ -97,15 +97,6 @@ } } -# TODO(GYP): Delete this after we've converted everything to GN. -# The _run targets exist only for compatibility w/ GYP. -group("webkit_unit_tests_run") { - testonly = true - deps = [ - ":webkit_unit_tests", - ] -} - # GYP version: WebKit/Source/web/web_tests.gyp:webkit_unit_tests test("webkit_unit_tests") { visibility = [] # Allow re-assignment of list.
diff --git a/third_party/WebKit/Source/wtf/BUILD.gn b/third_party/WebKit/Source/wtf/BUILD.gn index 5db6483a..f4e21d7 100644 --- a/third_party/WebKit/Source/wtf/BUILD.gn +++ b/third_party/WebKit/Source/wtf/BUILD.gn
@@ -95,15 +95,6 @@ } } -# TODO(GYP): Delete this after we've converted everything to GN. -# The _run targets exist only for compatibility w/ GYP. -group("wtf_unittests_run") { - testonly = true - deps = [ - ":wtf_unittests", - ] -} - test("wtf_unittests") { visibility = [] # Allow re-assignment of list. visibility = [ "*" ]
diff --git a/third_party/mojo/mojo_edk_system_impl.gypi b/third_party/mojo/mojo_edk_system_impl.gypi index fc455ed2..bdb629c7 100644 --- a/third_party/mojo/mojo_edk_system_impl.gypi +++ b/third_party/mojo/mojo_edk_system_impl.gypi
@@ -130,6 +130,8 @@ 'src/mojo/edk/system/transport_data.h', 'src/mojo/edk/system/unique_identifier.cc', 'src/mojo/edk/system/unique_identifier.h', + 'src/mojo/edk/system/wait_set_dispatcher.cc', + 'src/mojo/edk/system/wait_set_dispatcher.h', 'src/mojo/edk/system/waiter.cc', 'src/mojo/edk/system/waiter.h', # Test-only code:
diff --git a/third_party/mojo/mojo_edk_tests.gyp b/third_party/mojo/mojo_edk_tests.gyp index c02e21d5..c0916bf 100644 --- a/third_party/mojo/mojo_edk_tests.gyp +++ b/third_party/mojo/mojo_edk_tests.gyp
@@ -218,6 +218,7 @@ 'src/mojo/edk/system/test_utils.h', 'src/mojo/edk/system/thread_annotations_unittest.cc', 'src/mojo/edk/system/unique_identifier_unittest.cc', + 'src/mojo/edk/system/wait_set_dispatcher_unittest.cc', 'src/mojo/edk/system/waiter_test_utils.cc', 'src/mojo/edk/system/waiter_test_utils.h', 'src/mojo/edk/system/waiter_unittest.cc',
diff --git a/third_party/mojo/src/mojo/edk/system/BUILD.gn b/third_party/mojo/src/mojo/edk/system/BUILD.gn index 71dcac2..656ac72 100644 --- a/third_party/mojo/src/mojo/edk/system/BUILD.gn +++ b/third_party/mojo/src/mojo/edk/system/BUILD.gn
@@ -110,6 +110,8 @@ "transport_data.h", "unique_identifier.cc", "unique_identifier.h", + "wait_set_dispatcher.cc", + "wait_set_dispatcher.h", "waiter.cc", "waiter.h", ] @@ -210,6 +212,7 @@ "test_channel_endpoint_client.h", "thread_annotations_unittest.cc", "unique_identifier_unittest.cc", + "wait_set_dispatcher_unittest.cc", "waiter_test_utils.cc", "waiter_test_utils.h", "waiter_unittest.cc",
diff --git a/third_party/mojo/src/mojo/edk/system/core.cc b/third_party/mojo/src/mojo/edk/system/core.cc index d82c845..a11798f7 100644 --- a/third_party/mojo/src/mojo/edk/system/core.cc +++ b/third_party/mojo/src/mojo/edk/system/core.cc
@@ -4,8 +4,10 @@ #include "third_party/mojo/src/mojo/edk/system/core.h" +#include <utility> #include <vector> +#include "base/containers/stack_container.h" #include "base/logging.h" #include "base/time/time.h" #include "mojo/public/c/system/macros.h" @@ -23,6 +25,7 @@ #include "third_party/mojo/src/mojo/edk/system/message_pipe.h" #include "third_party/mojo/src/mojo/edk/system/message_pipe_dispatcher.h" #include "third_party/mojo/src/mojo/edk/system/shared_buffer_dispatcher.h" +#include "third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.h" #include "third_party/mojo/src/mojo/edk/system/waiter.h" namespace mojo { @@ -189,7 +192,16 @@ if (wait_set_handle.IsNull()) return MOJO_RESULT_INVALID_ARGUMENT; - return MOJO_RESULT_UNIMPLEMENTED; + scoped_refptr<WaitSetDispatcher> dispatcher = new WaitSetDispatcher(); + MojoHandle h = AddDispatcher(dispatcher); + if (h == MOJO_HANDLE_INVALID) { + LOG(ERROR) << "Handle table full"; + dispatcher->Close(); + return MOJO_RESULT_RESOURCE_EXHAUSTED; + } + + wait_set_handle.Put(h); + return MOJO_RESULT_OK; } MojoResult Core::AddHandle(MojoHandle wait_set_handle, @@ -203,7 +215,7 @@ if (!dispatcher) return MOJO_RESULT_INVALID_ARGUMENT; - return MOJO_RESULT_UNIMPLEMENTED; + return wait_set_dispatcher->AddWaitingDispatcher(dispatcher, signals, handle); } MojoResult Core::RemoveHandle(MojoHandle wait_set_handle, @@ -216,7 +228,7 @@ if (!dispatcher) return MOJO_RESULT_INVALID_ARGUMENT; - return MOJO_RESULT_UNIMPLEMENTED; + return wait_set_dispatcher->RemoveWaitingDispatcher(dispatcher); } MojoResult Core::GetReadyHandles( @@ -225,14 +237,29 @@ UserPointer<MojoHandle> handles, UserPointer<MojoResult> results, UserPointer<MojoHandleSignalsState> signals_states) { + if (count.IsNull() || !count.Get() || handles.IsNull() || results.IsNull()) + return MOJO_RESULT_INVALID_ARGUMENT; + scoped_refptr<Dispatcher> wait_set_dispatcher(GetDispatcher(wait_set_handle)); if (!wait_set_dispatcher) return MOJO_RESULT_INVALID_ARGUMENT; - if (count.IsNull() || !count.Get() || handles.IsNull() || results.IsNull()) - return MOJO_RESULT_INVALID_ARGUMENT; + const uint32_t in_count = count.Get(); + DispatcherVector awoken_dispatchers; + base::StackVector<uintptr_t, 16> contexts; + contexts->assign(in_count, MOJO_HANDLE_INVALID); - return MOJO_RESULT_UNIMPLEMENTED; + MojoResult result = wait_set_dispatcher->GetReadyDispatchers( + count, &awoken_dispatchers, results, MakeUserPointer(contexts->data())); + + const uint32_t out_count = count.Get(); + for (uint32_t i = 0; i < out_count; i++) { + handles.At(i).Put(static_cast<MojoHandle>(contexts[i])); + if (!signals_states.IsNull()) + signals_states.At(i).Put(awoken_dispatchers[i]->GetHandleSignalsState()); + } + + return result; } MojoResult Core::CreateMessagePipe(
diff --git a/third_party/mojo/src/mojo/edk/system/dispatcher.cc b/third_party/mojo/src/mojo/edk/system/dispatcher.cc index 2c11407292..ba4fe18a 100644 --- a/third_party/mojo/src/mojo/edk/system/dispatcher.cc +++ b/third_party/mojo/src/mojo/edk/system/dispatcher.cc
@@ -74,6 +74,7 @@ size_t size, embedder::PlatformHandleVector* platform_handles) { switch (static_cast<Dispatcher::Type>(type)) { + case Type::WAIT_SET: case Type::UNKNOWN: DVLOG(2) << "Deserializing invalid handle"; return nullptr; @@ -250,6 +251,37 @@ RemoveAwakableImplNoLock(awakable, handle_signals_state); } +MojoResult Dispatcher::AddWaitingDispatcher( + const scoped_refptr<Dispatcher>& dispatcher, + MojoHandleSignals signals, + uintptr_t context) { + MutexLocker locker(&mutex_); + if (is_closed_) + return MOJO_RESULT_INVALID_ARGUMENT; + + return AddWaitingDispatcherImplNoLock(dispatcher, signals, context); +} + +MojoResult Dispatcher::RemoveWaitingDispatcher( + const scoped_refptr<Dispatcher>& dispatcher) { + MutexLocker locker(&mutex_); + if (is_closed_) + return MOJO_RESULT_INVALID_ARGUMENT; + + return RemoveWaitingDispatcherImplNoLock(dispatcher); +} + +MojoResult Dispatcher::GetReadyDispatchers(UserPointer<uint32_t> count, + DispatcherVector* dispatchers, + UserPointer<MojoResult> results, + UserPointer<uintptr_t> contexts) { + MutexLocker locker(&mutex_); + if (is_closed_) + return MOJO_RESULT_INVALID_ARGUMENT; + + return GetReadyDispatchersImplNoLock(count, dispatchers, results, contexts); +} + Dispatcher::Dispatcher() : is_closed_(false) { } @@ -389,6 +421,35 @@ return MOJO_RESULT_FAILED_PRECONDITION; } +MojoResult Dispatcher::AddWaitingDispatcherImplNoLock( + const scoped_refptr<Dispatcher>& /*dispatcher*/, + MojoHandleSignals /*signals*/, + uintptr_t /*context*/) { + mutex_.AssertHeld(); + DCHECK(!is_closed_); + // By default, not supported. Only needed for wait set dispatchers. + return MOJO_RESULT_INVALID_ARGUMENT; +} + +MojoResult Dispatcher::RemoveWaitingDispatcherImplNoLock( + const scoped_refptr<Dispatcher>& /*dispatcher*/) { + mutex_.AssertHeld(); + DCHECK(!is_closed_); + // By default, not supported. Only needed for wait set dispatchers. + return MOJO_RESULT_INVALID_ARGUMENT; +} + +MojoResult Dispatcher::GetReadyDispatchersImplNoLock( + UserPointer<uint32_t> /*count*/, + DispatcherVector* /*dispatchers*/, + UserPointer<MojoResult> /*results*/, + UserPointer<uintptr_t> /*contexts*/) { + mutex_.AssertHeld(); + DCHECK(!is_closed_); + // By default, not supported. Only needed for wait set dispatchers. + return MOJO_RESULT_INVALID_ARGUMENT; +} + void Dispatcher::RemoveAwakableImplNoLock(Awakable* /*awakable*/, HandleSignalsState* signals_state) { mutex_.AssertHeld();
diff --git a/third_party/mojo/src/mojo/edk/system/dispatcher.h b/third_party/mojo/src/mojo/edk/system/dispatcher.h index c0bb69ba..e9af1c00 100644 --- a/third_party/mojo/src/mojo/edk/system/dispatcher.h +++ b/third_party/mojo/src/mojo/edk/system/dispatcher.h
@@ -66,6 +66,7 @@ DATA_PIPE_PRODUCER, DATA_PIPE_CONSUMER, SHARED_BUFFER, + WAIT_SET, // "Private" types (not exposed via the public interface): PLATFORM_HANDLE = -1 @@ -153,6 +154,25 @@ // |*signals_state| will be set to the current handle signals state. void RemoveAwakable(Awakable* awakable, HandleSignalsState* signals_state); + // Adds a dispatcher to wait on. When the dispatcher satisfies |signals|, it + // will be returned in the next call to |GetReadyDispatchers()|. If + // |dispatcher| has been added, it must be removed before adding again, + // otherwise |MOJO_RESULT_ALREADY_EXISTS| will be returned. + MojoResult AddWaitingDispatcher(const scoped_refptr<Dispatcher>& dispatcher, + MojoHandleSignals signals, + uintptr_t context); + // Removes a dispatcher to wait on. If |dispatcher| has not been added, + // |MOJO_RESULT_NOT_FOUND| will be returned. + MojoResult RemoveWaitingDispatcher( + const scoped_refptr<Dispatcher>& dispatcher); + // Returns a set of ready dispatchers. |*count| is the maximum number of + // dispatchers to return, and will contain the number of dispatchers returned + // in |dispatchers| on completion. + MojoResult GetReadyDispatchers(UserPointer<uint32_t> count, + DispatcherVector* dispatchers, + UserPointer<MojoResult> results, + UserPointer<uintptr_t> contexts); + // A dispatcher must be put into a special state in order to be sent across a // message pipe. Outside of tests, only |HandleTableAccess| is allowed to do // this, since there are requirements on the handle table (see below). @@ -284,6 +304,18 @@ virtual void RemoveAwakableImplNoLock(Awakable* awakable, HandleSignalsState* signals_state) MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); + virtual MojoResult AddWaitingDispatcherImplNoLock( + const scoped_refptr<Dispatcher>& dispatcher, + MojoHandleSignals signals, + uintptr_t context) MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); + virtual MojoResult RemoveWaitingDispatcherImplNoLock( + const scoped_refptr<Dispatcher>& dispatcher) + MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); + virtual MojoResult GetReadyDispatchersImplNoLock( + UserPointer<uint32_t> count, + DispatcherVector* dispatchers, + UserPointer<MojoResult> results, + UserPointer<uintptr_t> contexts) MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); // These implement the API used to serialize dispatchers to a |Channel| // (described below). They will only be called on a dispatcher that's attached
diff --git a/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.cc b/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.cc new file mode 100644 index 0000000..45518e7e --- /dev/null +++ b/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.cc
@@ -0,0 +1,277 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.h" + +#include <algorithm> +#include <utility> + +#include "base/logging.h" +#include "third_party/mojo/src/mojo/edk/system/awakable.h" + +namespace mojo { +namespace system { + +class WaitSetDispatcher::Waiter final : public Awakable { + public: + explicit Waiter(WaitSetDispatcher* dispatcher) : dispatcher_(dispatcher) {} + ~Waiter() {} + + // |Awakable| implementation. + bool Awake(MojoResult result, uintptr_t context) override { + // Note: This is called with various Mojo locks held. + dispatcher_->WakeDispatcher(result, context); + // Removes |this| from the dispatcher's list of waiters. + return false; + } + + private: + WaitSetDispatcher* const dispatcher_; +}; + +WaitSetDispatcher::WaitSetDispatcher() + : waiter_(new WaitSetDispatcher::Waiter(this)) {} + +WaitSetDispatcher::~WaitSetDispatcher() { + DCHECK(waiting_dispatchers_.empty()); + DCHECK(awoken_queue_.empty()); + DCHECK(processed_dispatchers_.empty()); +} + +Dispatcher::Type WaitSetDispatcher::GetType() const { + return Type::WAIT_SET; +} + +void WaitSetDispatcher::CloseImplNoLock() { + mutex().AssertHeld(); + for (const auto& entry : waiting_dispatchers_) + entry.second.dispatcher->RemoveAwakable(waiter_.get(), nullptr); + waiting_dispatchers_.clear(); + + MutexLocker locker(&awoken_mutex_); + awoken_queue_.clear(); + processed_dispatchers_.clear(); +} + +MojoResult WaitSetDispatcher::AddWaitingDispatcherImplNoLock( + const scoped_refptr<Dispatcher>& dispatcher, + MojoHandleSignals signals, + uintptr_t context) { + mutex().AssertHeld(); + if (dispatcher == this) + return MOJO_RESULT_INVALID_ARGUMENT; + + uintptr_t dispatcher_handle = reinterpret_cast<uintptr_t>(dispatcher.get()); + auto it = waiting_dispatchers_.find(dispatcher_handle); + if (it != waiting_dispatchers_.end()) { + return MOJO_RESULT_ALREADY_EXISTS; + } + + const MojoResult result = dispatcher->AddAwakable(waiter_.get(), signals, + dispatcher_handle, nullptr); + if (result == MOJO_RESULT_INVALID_ARGUMENT) { + // Dispatcher is closed. + return result; + } else if (result != MOJO_RESULT_OK) { + WakeDispatcher(result, dispatcher_handle); + } + + WaitState state; + state.dispatcher = dispatcher; + state.context = context; + state.signals = signals; + bool inserted = + waiting_dispatchers_.insert(std::make_pair(dispatcher_handle, state)) + .second; + DCHECK(inserted); + + return MOJO_RESULT_OK; +} + +MojoResult WaitSetDispatcher::RemoveWaitingDispatcherImplNoLock( + const scoped_refptr<Dispatcher>& dispatcher) { + mutex().AssertHeld(); + uintptr_t dispatcher_handle = reinterpret_cast<uintptr_t>(dispatcher.get()); + auto it = waiting_dispatchers_.find(dispatcher_handle); + if (it == waiting_dispatchers_.end()) + return MOJO_RESULT_NOT_FOUND; + + dispatcher->RemoveAwakable(waiter_.get(), nullptr); + // At this point, it should not be possible for |waiter_| to be woken with + // |dispatcher|. + waiting_dispatchers_.erase(it); + + MutexLocker locker(&awoken_mutex_); + int num_erased = 0; + for (auto it = awoken_queue_.begin(); it != awoken_queue_.end();) { + if (it->first == dispatcher_handle) { + it = awoken_queue_.erase(it); + num_erased++; + } else { + ++it; + } + } + // The dispatcher should only exist in the queue once. + DCHECK_LE(num_erased, 1); + processed_dispatchers_.erase( + std::remove(processed_dispatchers_.begin(), processed_dispatchers_.end(), + dispatcher_handle), + processed_dispatchers_.end()); + + return MOJO_RESULT_OK; +} + +MojoResult WaitSetDispatcher::GetReadyDispatchersImplNoLock( + UserPointer<uint32_t> count, + DispatcherVector* dispatchers, + UserPointer<MojoResult> results, + UserPointer<uintptr_t> contexts) { + mutex().AssertHeld(); + dispatchers->clear(); + + // Re-queue any already retrieved dispatchers. These should be the dispatchers + // that were returned on the last call to this function. This loop is + // necessary to preserve the logically level-triggering behaviour of waiting + // in Mojo. In particular, if no action is taken on a signal, that signal + // continues to be satisfied, and therefore a |MojoWait()| on that + // handle/signal continues to return immediately. + std::deque<uintptr_t> pending; + { + MutexLocker locker(&awoken_mutex_); + pending.swap(processed_dispatchers_); + } + for (uintptr_t d : pending) { + auto it = waiting_dispatchers_.find(d); + // Anything in |processed_dispatchers_| should also be in + // |waiting_dispatchers_| since dispatchers are removed from both in + // |RemoveWaitingDispatcherImplNoLock()|. + DCHECK(it != waiting_dispatchers_.end()); + + // |awoken_mutex_| cannot be held here because + // |Dispatcher::AddAwakable()| acquires the Dispatcher's mutex. This + // mutex is held while running |WakeDispatcher()| below, which needs to + // acquire |awoken_mutex_|. Holding |awoken_mutex_| here would result in + // a deadlock. + const MojoResult result = it->second.dispatcher->AddAwakable( + waiter_.get(), it->second.signals, d, nullptr); + + if (result == MOJO_RESULT_INVALID_ARGUMENT) { + // Dispatcher is closed. Implicitly remove it from the wait set since + // it may be impossible to remove using |MojoRemoveHandle()|. + waiting_dispatchers_.erase(it); + } else if (result != MOJO_RESULT_OK) { + WakeDispatcher(result, d); + } + } + + const uint32_t max_woken = count.Get(); + uint32_t num_woken = 0; + + MutexLocker locker(&awoken_mutex_); + while (!awoken_queue_.empty() && num_woken < max_woken) { + uintptr_t d = awoken_queue_.front().first; + MojoResult result = awoken_queue_.front().second; + awoken_queue_.pop_front(); + + auto it = waiting_dispatchers_.find(d); + DCHECK(it != waiting_dispatchers_.end()); + + results.At(num_woken).Put(result); + dispatchers->push_back(it->second.dispatcher); + if (!contexts.IsNull()) + contexts.At(num_woken).Put(it->second.context); + + if (result != MOJO_RESULT_CANCELLED) { + processed_dispatchers_.push_back(d); + } else { + waiting_dispatchers_.erase(it); + } + + num_woken++; + } + + count.Put(num_woken); + if (!num_woken) + return MOJO_RESULT_SHOULD_WAIT; + + return MOJO_RESULT_OK; +} + +void WaitSetDispatcher::CancelAllAwakablesNoLock() { + mutex().AssertHeld(); + MutexLocker locker(&awakable_mutex_); + awakable_list_.CancelAll(); +} + +MojoResult WaitSetDispatcher::AddAwakableImplNoLock( + Awakable* awakable, + MojoHandleSignals signals, + uintptr_t context, + HandleSignalsState* signals_state) { + mutex().AssertHeld(); + + HandleSignalsState state(GetHandleSignalsStateImplNoLock()); + if (state.satisfies(signals)) { + if (signals_state) + *signals_state = state; + return MOJO_RESULT_ALREADY_EXISTS; + } + if (!state.can_satisfy(signals)) { + if (signals_state) + *signals_state = state; + return MOJO_RESULT_FAILED_PRECONDITION; + } + + MutexLocker locker(&awakable_mutex_); + awakable_list_.Add(awakable, signals, context); + return MOJO_RESULT_OK; +} + +void WaitSetDispatcher::RemoveAwakableImplNoLock( + Awakable* awakable, + HandleSignalsState* signals_state) { + mutex().AssertHeld(); + MutexLocker locker(&awakable_mutex_); + awakable_list_.Remove(awakable); + if (signals_state) + *signals_state = GetHandleSignalsStateImplNoLock(); +} + +HandleSignalsState WaitSetDispatcher::GetHandleSignalsStateImplNoLock() const { + mutex().AssertHeld(); + HandleSignalsState rv; + rv.satisfiable_signals = MOJO_HANDLE_SIGNAL_READABLE; + MutexLocker locker(&awoken_mutex_); + if (!awoken_queue_.empty() || !processed_dispatchers_.empty()) + rv.satisfied_signals = MOJO_HANDLE_SIGNAL_READABLE; + return rv; +} + +scoped_refptr<Dispatcher> +WaitSetDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() { + mutex().AssertHeld(); + LOG(ERROR) << "Attempting to serialize WaitSet"; + CloseImplNoLock(); + return new WaitSetDispatcher(); +} + +void WaitSetDispatcher::WakeDispatcher(MojoResult result, uintptr_t context) { + { + MutexLocker locker(&awoken_mutex_); + + if (result == MOJO_RESULT_ALREADY_EXISTS) + result = MOJO_RESULT_OK; + + awoken_queue_.push_back(std::make_pair(context, result)); + } + + MutexLocker locker(&awakable_mutex_); + HandleSignalsState signals_state; + signals_state.satisfiable_signals = MOJO_HANDLE_SIGNAL_READABLE; + signals_state.satisfied_signals = MOJO_HANDLE_SIGNAL_READABLE; + awakable_list_.AwakeForStateChange(signals_state); +} + +} // namespace system +} // namespace mojo
diff --git a/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.h b/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.h new file mode 100644 index 0000000..a53f61a --- /dev/null +++ b/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.h
@@ -0,0 +1,94 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_MOJO_SRC_MOJO_EDK_SYSTEM_WAIT_SET_DISPATCHER_H_ +#define THIRD_PARTY_MOJO_SRC_MOJO_EDK_SYSTEM_WAIT_SET_DISPATCHER_H_ + +#include <deque> +#include <map> +#include <utility> + +#include "base/memory/scoped_ptr.h" +#include "mojo/public/cpp/system/macros.h" +#include "third_party/mojo/src/mojo/edk/system/awakable_list.h" +#include "third_party/mojo/src/mojo/edk/system/dispatcher.h" +#include "third_party/mojo/src/mojo/edk/system/mutex.h" +#include "third_party/mojo/src/mojo/edk/system/system_impl_export.h" + +namespace mojo { +namespace system { + +class MOJO_SYSTEM_IMPL_EXPORT WaitSetDispatcher : public Dispatcher { + public: + WaitSetDispatcher(); + ~WaitSetDispatcher() override; + + // |Dispatcher| public methods: + Type GetType() const override; + + private: + // Internal implementation of Awakable. + class Waiter; + + struct WaitState { + scoped_refptr<Dispatcher> dispatcher; + MojoHandleSignals signals; + uintptr_t context; + }; + + // |Dispatcher| protected methods: + void CloseImplNoLock() override; + void CancelAllAwakablesNoLock() override; + MojoResult AddAwakableImplNoLock(Awakable* awakable, + MojoHandleSignals signals, + uintptr_t context, + HandleSignalsState* signals_state) override; + void RemoveAwakableImplNoLock(Awakable* awakable, + HandleSignalsState* signals_state) override; + MojoResult AddWaitingDispatcherImplNoLock( + const scoped_refptr<Dispatcher>& dispatcher, + MojoHandleSignals signals, + uintptr_t context) override; + MojoResult RemoveWaitingDispatcherImplNoLock( + const scoped_refptr<Dispatcher>& dispatcher) override; + MojoResult GetReadyDispatchersImplNoLock( + UserPointer<uint32_t> count, + DispatcherVector* dispatchers, + UserPointer<MojoResult> results, + UserPointer<uintptr_t> contexts) override; + HandleSignalsState GetHandleSignalsStateImplNoLock() const override; + scoped_refptr<Dispatcher> CreateEquivalentDispatcherAndCloseImplNoLock() + override; + + // Signal that the dispatcher indexed by |context| has been woken up with + // |result| and is now ready. + void WakeDispatcher(MojoResult result, uintptr_t context); + + // Map of dispatchers being waited on. Key is a Dispatcher* casted to a + // uintptr_t, and should be treated as an opaque value and not casted back. + std::map<uintptr_t, WaitState> waiting_dispatchers_ MOJO_GUARDED_BY(mutex()); + + // Separate mutex that can be locked without locking |mutex()|. + mutable Mutex awoken_mutex_ MOJO_ACQUIRED_AFTER(mutex()); + // List of dispatchers that have been woken up. Any dispatcher in this queue + // will NOT currently be waited on. + std::deque<std::pair<uintptr_t, MojoResult>> awoken_queue_ + MOJO_GUARDED_BY(awoken_mutex_); + // List of dispatchers that have been woken up and retrieved on the last call + // to |GetReadyDispatchers()|. + std::deque<uintptr_t> processed_dispatchers_ MOJO_GUARDED_BY(awoken_mutex_); + + // Separate mutex that can be locked without locking |mutex()|. + Mutex awakable_mutex_ MOJO_ACQUIRED_AFTER(mutex()); + // List of dispatchers being waited on. + AwakableList awakable_list_ MOJO_GUARDED_BY(awakable_mutex_); + + // Waiter used to wait on dispatchers. + scoped_ptr<Waiter> waiter_; +}; + +} // namespace system +} // namespace mojo + +#endif // THIRD_PARTY_MOJO_SRC_MOJO_EDK_SYSTEM_WAIT_SET_DISPATCHER_H_
diff --git a/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher_unittest.cc b/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher_unittest.cc new file mode 100644 index 0000000..86f5e36 --- /dev/null +++ b/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher_unittest.cc
@@ -0,0 +1,459 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.h" + +#include <algorithm> + +#include "base/memory/ref_counted.h" +#include "mojo/public/cpp/system/macros.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/mojo/src/mojo/edk/system/message_pipe.h" +#include "third_party/mojo/src/mojo/edk/system/message_pipe_dispatcher.h" +#include "third_party/mojo/src/mojo/edk/system/test_utils.h" +#include "third_party/mojo/src/mojo/edk/system/waiter.h" + +namespace mojo { +namespace system { +namespace { + +class WaitSetDispatcherTest : public ::testing::Test { + public: + WaitSetDispatcherTest() {} + ~WaitSetDispatcherTest() override {} + + void SetUp() override { + dispatcher0_ = MessagePipeDispatcher::Create( + MessagePipeDispatcher::kDefaultCreateOptions); + dispatcher1_ = MessagePipeDispatcher::Create( + MessagePipeDispatcher::kDefaultCreateOptions); + + scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); + dispatcher0_->Init(mp, 0); + dispatcher1_->Init(mp, 1); + + dispatchers_to_close_.push_back(dispatcher0_); + dispatchers_to_close_.push_back(dispatcher1_); + } + + void TearDown() override { + for (auto& d : dispatchers_to_close_) + d->Close(); + } + + MojoResult GetOneReadyDispatcher( + const scoped_refptr<WaitSetDispatcher>& wait_set, + scoped_refptr<Dispatcher>* ready_dispatcher, + uintptr_t* context) { + uint32_t count = 1; + MojoResult dispatcher_result = MOJO_RESULT_UNKNOWN; + DispatcherVector dispatchers; + MojoResult result = wait_set->GetReadyDispatchers( + MakeUserPointer(&count), + &dispatchers, + MakeUserPointer(&dispatcher_result), + MakeUserPointer(context)); + if (result == MOJO_RESULT_OK) { + CHECK_EQ(1u, dispatchers.size()); + *ready_dispatcher = dispatchers[0]; + return dispatcher_result; + } + return result; + } + + void CloseOnShutdown(const scoped_refptr<Dispatcher>& dispatcher) { + dispatchers_to_close_.push_back(dispatcher); + } + + protected: + scoped_refptr<MessagePipeDispatcher> dispatcher0_; + scoped_refptr<MessagePipeDispatcher> dispatcher1_; + + DispatcherVector dispatchers_to_close_; + + DISALLOW_COPY_AND_ASSIGN(WaitSetDispatcherTest); +}; + +TEST_F(WaitSetDispatcherTest, Basic) { + scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); + CloseOnShutdown(wait_set); + ASSERT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(dispatcher0_, + MOJO_HANDLE_SIGNAL_READABLE, 1)); + ASSERT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(dispatcher1_, + MOJO_HANDLE_SIGNAL_WRITABLE, 2)); + + Waiter w; + uintptr_t context = 0; + w.Init(); + HandleSignalsState hss; + // |dispatcher1_| should already be writable. + EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); + + scoped_refptr<Dispatcher> woken_dispatcher; + EXPECT_EQ(MOJO_RESULT_OK, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); + EXPECT_EQ(dispatcher1_, woken_dispatcher); + EXPECT_EQ(2u, context); + // If a ready dispatcher isn't removed, it will continue to be returned. + EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); + woken_dispatcher = nullptr; + context = 0; + EXPECT_EQ(MOJO_RESULT_OK, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); + EXPECT_EQ(dispatcher1_, woken_dispatcher); + EXPECT_EQ(2u, context); + ASSERT_EQ(MOJO_RESULT_OK, wait_set->RemoveWaitingDispatcher(dispatcher1_)); + + // No ready dispatcher. + hss = HandleSignalsState(); + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); + EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); + EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); + + // Write to |dispatcher1_|, which should make |dispatcher0_| readable. + char buffer[] = "abcd"; + w.Init(); + ASSERT_EQ(MOJO_RESULT_OK, + dispatcher1_->WriteMessage(UserPointer<const void>(buffer), + sizeof(buffer), nullptr, + MOJO_WRITE_MESSAGE_FLAG_NONE)); + EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); + woken_dispatcher = nullptr; + context = 0; + EXPECT_EQ(MOJO_RESULT_OK, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); + EXPECT_EQ(dispatcher0_, woken_dispatcher); + EXPECT_EQ(1u, context); + + // Again, if a ready dispatcher isn't removed, it will continue to be + // returned. + woken_dispatcher = nullptr; + EXPECT_EQ(MOJO_RESULT_OK, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); + EXPECT_EQ(dispatcher0_, woken_dispatcher); + + wait_set->RemoveAwakable(&w, nullptr); +} + +TEST_F(WaitSetDispatcherTest, HandleWithoutRemoving) { + scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); + CloseOnShutdown(wait_set); + ASSERT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(dispatcher0_, + MOJO_HANDLE_SIGNAL_READABLE, 1)); + + Waiter w; + uintptr_t context = 0; + w.Init(); + HandleSignalsState hss; + // No ready dispatcher. + hss = HandleSignalsState(); + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); + EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); + scoped_refptr<Dispatcher> woken_dispatcher; + EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); + + // The tested behaviour below should be repeatable. + for (size_t i = 0; i < 3; i++) { + // Write to |dispatcher1_|, which should make |dispatcher0_| readable. + char buffer[] = "abcd"; + w.Init(); + ASSERT_EQ(MOJO_RESULT_OK, + dispatcher1_->WriteMessage(UserPointer<const void>(buffer), + sizeof(buffer), nullptr, + MOJO_WRITE_MESSAGE_FLAG_NONE)); + EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); + woken_dispatcher = nullptr; + context = 0; + EXPECT_EQ(MOJO_RESULT_OK, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); + EXPECT_EQ(dispatcher0_, woken_dispatcher); + EXPECT_EQ(1u, context); + + // Read from |dispatcher0_| which should change it's state to non-readable. + char read_buffer[sizeof(buffer) + 5]; + uint32_t num_bytes = sizeof(read_buffer); + ASSERT_EQ(MOJO_RESULT_OK, + dispatcher0_->ReadMessage(UserPointer<void>(read_buffer), + MakeUserPointer(&num_bytes), + nullptr, nullptr, + MOJO_READ_MESSAGE_FLAG_NONE)); + EXPECT_EQ(sizeof(buffer), num_bytes); + + // No dispatchers are ready. + w.Init(); + woken_dispatcher = nullptr; + context = 0; + EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); + EXPECT_EQ(nullptr, woken_dispatcher); + EXPECT_EQ(0u, context); + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); + } + + wait_set->RemoveAwakable(&w, nullptr); +} + +TEST_F(WaitSetDispatcherTest, MultipleReady) { + scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); + CloseOnShutdown(wait_set); + + scoped_refptr<MessagePipeDispatcher> mp1_dispatcher0 = + MessagePipeDispatcher::Create( + MessagePipeDispatcher::kDefaultCreateOptions); + scoped_refptr<MessagePipeDispatcher> mp1_dispatcher1 = + MessagePipeDispatcher::Create( + MessagePipeDispatcher::kDefaultCreateOptions); + CloseOnShutdown(mp1_dispatcher0); + CloseOnShutdown(mp1_dispatcher1); + { + scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); + mp1_dispatcher0->Init(mp, 0); + mp1_dispatcher1->Init(mp, 1); + } + + ASSERT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(dispatcher0_, + MOJO_HANDLE_SIGNAL_READABLE, 0)); + ASSERT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(dispatcher1_, + MOJO_HANDLE_SIGNAL_WRITABLE, 0)); + ASSERT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(mp1_dispatcher0, + MOJO_HANDLE_SIGNAL_WRITABLE, 0)); + ASSERT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(mp1_dispatcher1, + MOJO_HANDLE_SIGNAL_WRITABLE, 0)); + + Waiter w; + w.Init(); + HandleSignalsState hss; + // The three writable dispatchers should be ready. + EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); + + scoped_refptr<Dispatcher> woken_dispatcher; + EXPECT_EQ(MOJO_RESULT_OK, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); + // Don't know which dispatcher was returned, just that it was one of the + // writable ones. + EXPECT_TRUE(woken_dispatcher == dispatcher1_ || + woken_dispatcher == mp1_dispatcher0 || + woken_dispatcher == mp1_dispatcher1); + + DispatcherVector dispatchers_vector; + uint32_t count = 4; + MojoResult results[4]; + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->GetReadyDispatchers(MakeUserPointer(&count), + &dispatchers_vector, + MakeUserPointer(results), + MakeUserPointer<uintptr_t>(nullptr))); + EXPECT_EQ(3u, count); + std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); + DispatcherVector expected_dispatchers; + expected_dispatchers.push_back(dispatcher1_); + expected_dispatchers.push_back(mp1_dispatcher0); + expected_dispatchers.push_back(mp1_dispatcher1); + std::sort(expected_dispatchers.begin(), expected_dispatchers.end()); + EXPECT_EQ(expected_dispatchers, dispatchers_vector); + + // If a ready dispatcher isn't removed, it will continue to be returned. + EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); + count = 4; + dispatchers_vector.clear(); + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->GetReadyDispatchers(MakeUserPointer(&count), + &dispatchers_vector, + MakeUserPointer(results), + MakeUserPointer<uintptr_t>(nullptr))); + EXPECT_EQ(3u, count); + std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); + EXPECT_EQ(expected_dispatchers, dispatchers_vector); + + // Remove one. It shouldn't be returned any longer. + ASSERT_EQ(MOJO_RESULT_OK, + wait_set->RemoveWaitingDispatcher(expected_dispatchers.back())); + expected_dispatchers.pop_back(); + EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); + count = 4; + dispatchers_vector.clear(); + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->GetReadyDispatchers(MakeUserPointer(&count), + &dispatchers_vector, + MakeUserPointer(results), + MakeUserPointer<uintptr_t>(nullptr))); + EXPECT_EQ(2u, count); + std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); + EXPECT_EQ(expected_dispatchers, dispatchers_vector); + + // Write to |dispatcher1_|, which should make |dispatcher0_| readable. + char buffer[] = "abcd"; + w.Init(); + ASSERT_EQ(MOJO_RESULT_OK, + dispatcher1_->WriteMessage(UserPointer<const void>(buffer), + sizeof(buffer), nullptr, + MOJO_WRITE_MESSAGE_FLAG_NONE)); + expected_dispatchers.push_back(dispatcher0_); + std::sort(expected_dispatchers.begin(), expected_dispatchers.end()); + EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); + count = 4; + dispatchers_vector.clear(); + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->GetReadyDispatchers(MakeUserPointer(&count), + &dispatchers_vector, + MakeUserPointer(results), + MakeUserPointer<uintptr_t>(nullptr))); + EXPECT_EQ(3u, count); + std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); + EXPECT_EQ(expected_dispatchers, dispatchers_vector); +} + +TEST_F(WaitSetDispatcherTest, InvalidParams) { + scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); + + // Can't add a wait set to itself. + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, + wait_set->AddWaitingDispatcher(wait_set, + MOJO_HANDLE_SIGNAL_READABLE, 0)); + + // Can't add twice. + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(dispatcher0_, + MOJO_HANDLE_SIGNAL_READABLE, 0)); + EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, + wait_set->AddWaitingDispatcher(dispatcher0_, + MOJO_HANDLE_SIGNAL_READABLE, 0)); + + // Remove a dispatcher that wasn't added. + EXPECT_EQ(MOJO_RESULT_NOT_FOUND, + wait_set->RemoveWaitingDispatcher(dispatcher1_)); + + // Add to a closed wait set. + wait_set->Close(); + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, + wait_set->AddWaitingDispatcher(dispatcher0_, + MOJO_HANDLE_SIGNAL_READABLE, 0)); +} + +TEST_F(WaitSetDispatcherTest, NotSatisfiable) { + scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); + CloseOnShutdown(wait_set); + + // Wait sets can only satisfy MOJO_HANDLE_SIGNAL_READABLE. + Waiter w; + w.Init(); + HandleSignalsState hss; + EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); + + hss = HandleSignalsState(); + EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 0, &hss)); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); +} + +TEST_F(WaitSetDispatcherTest, ClosedDispatchers) { + scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); + CloseOnShutdown(wait_set); + + Waiter w; + w.Init(); + HandleSignalsState hss; + // A dispatcher that was added and then closed will be cancelled. + ASSERT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(dispatcher0_, + MOJO_HANDLE_SIGNAL_READABLE, 0)); + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); + dispatcher0_->Close(); + EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); + EXPECT_TRUE(wait_set->GetHandleSignalsState().satisfies( + MOJO_HANDLE_SIGNAL_READABLE)); + scoped_refptr<Dispatcher> woken_dispatcher; + EXPECT_EQ(MOJO_RESULT_CANCELLED, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); + EXPECT_EQ(dispatcher0_, woken_dispatcher); + + // Dispatcher will be implicitly removed because it may be impossible to + // remove explicitly. + woken_dispatcher = nullptr; + EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); + EXPECT_EQ(MOJO_RESULT_NOT_FOUND, + wait_set->RemoveWaitingDispatcher(dispatcher0_)); + + // A dispatcher that's not satisfiable should give an error. + w.Init(); + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(dispatcher1_, + MOJO_HANDLE_SIGNAL_READABLE, 0)); + EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); + EXPECT_TRUE(wait_set->GetHandleSignalsState().satisfies( + MOJO_HANDLE_SIGNAL_READABLE)); + EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); + EXPECT_EQ(dispatcher1_, woken_dispatcher); + + wait_set->RemoveAwakable(&w, nullptr); +} + +TEST_F(WaitSetDispatcherTest, NestedSets) { + scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); + CloseOnShutdown(wait_set); + scoped_refptr<WaitSetDispatcher> nested_wait_set = new WaitSetDispatcher(); + CloseOnShutdown(nested_wait_set); + + Waiter w; + w.Init(); + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->AddWaitingDispatcher(nested_wait_set, + MOJO_HANDLE_SIGNAL_READABLE, 0)); + EXPECT_EQ(MOJO_RESULT_OK, + wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, nullptr)); + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); + + // Writable signal is immediately satisfied by the message pipe. + w.Init(); + EXPECT_EQ(MOJO_RESULT_OK, + nested_wait_set->AddWaitingDispatcher( + dispatcher0_, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); + EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); + scoped_refptr<Dispatcher> woken_dispatcher; + EXPECT_EQ(MOJO_RESULT_OK, + GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); + EXPECT_EQ(nested_wait_set, woken_dispatcher); + + wait_set->RemoveAwakable(&w, nullptr); +} + +} // namespace +} // namespace system +} // namespace mojo
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/.bower.json b/third_party/polymer/v1_0/components-chromium/iron-collapse/.bower.json index 2a3d0332..dca5d44 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-collapse/.bower.json +++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/.bower.json
@@ -1,6 +1,6 @@ { "name": "iron-collapse", - "version": "1.0.4", + "version": "1.0.5", "description": "Provides a collapsable container", "authors": [ "The Polymer Authors" @@ -28,11 +28,12 @@ "paper-styles": "PolymerElements/paper-styles#^1.0.0", "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" }, - "_release": "1.0.4", + "main": "iron-collapse.html", + "_release": "1.0.5", "_resolution": { "type": "version", - "tag": "v1.0.4", - "commit": "10cd9980f7198b39bec7aa5bb7f9c7c6357bb467" + "tag": "v1.0.5", + "commit": "4d489766568b823d39e5032e2cbb4b85758f1a88" }, "_source": "git://github.com/PolymerElements/iron-collapse.git", "_target": "^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/CONTRIBUTING.md b/third_party/polymer/v1_0/components-chromium/iron-collapse/CONTRIBUTING.md new file mode 100644 index 0000000..7b101415 --- /dev/null +++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/CONTRIBUTING.md
@@ -0,0 +1,72 @@ + +<!-- +This file is autogenerated based on +https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md + +If you edit that file, it will get updated everywhere else. +If you edit this file, your changes will get overridden :) +--> +# Polymer Elements +## Guide for Contributors + +Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: + +### Filing Issues + +**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: + + 1. **Who will use the feature?** _“As someone filling out a form…”_ + 2. **When will they use the feature?** _“When I enter an invalid value…”_ + 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ + +**If you are filing an issue to report a bug**, please provide: + + 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: + + ```markdown + The `paper-foo` element causes the page to turn pink when clicked. + + ## Expected outcome + + The page stays the same color. + + ## Actual outcome + + The page turns pink. + + ## Steps to reproduce + + 1. Put a `paper-foo` element in the page. + 2. Open the page in a web browser. + 3. Click the `paper-foo` element. + ``` + + 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). + + 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. + +### Submitting Pull Requests + +**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. + +When submitting pull requests, please provide: + + 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: + + ```markdown + (For a single issue) + Fixes #20 + + (For multiple issues) + Fixes #32, #40 + ``` + + 2. **A succinct description of the design** used to fix any related issues. For example: + + ```markdown + This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. + ``` + + 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. + +If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/README.md b/third_party/polymer/v1_0/components-chromium/iron-collapse/README.md index b11ac66..1857979 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-collapse/README.md +++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/README.md
@@ -1,37 +1,52 @@ -# iron-collapse + +<!--- + +This README is automatically generated from the comments in these files: +iron-collapse.html + +Edit those files, and our readme bot will duplicate them over here! +Edit this file, and the bot will squash your changes :) + +--> + +[](https://travis-ci.org/PolymerElements/iron-collapse) + +_[Demo and API Docs](https://elements.polymer-project.org/elements/iron-collapse)_ + + +##<iron-collapse> + `iron-collapse` creates a collapsible block of content. By default, the content will be collapsed. Use `opened` or `toggle()` to show/hide the content. -```html -<button on-click="toggle">toggle collapse</button> + <button on-click="toggle">toggle collapse</button> -<iron-collapse id="collapse"> - <div>Content goes here...</div> -</iron-collapse> -``` + <iron-collapse id="collapse"> + <div>Content goes here...</div> + </iron-collapse> -```javascript -toggle: function() { - this.$.collapse.toggle(); -} -``` + ... + + toggle: function() { + this.$.collapse.toggle(); + } `iron-collapse` adjusts the height/width of the collapsible element to show/hide the content. So avoid putting padding/margin/border on the collapsible directly, and instead put a div inside and style that. -```html -<style> - .collapse-content { - padding: 15px; - border: 1px solid #dedede; - } -</style> + <style> + .collapse-content { + padding: 15px; + border: 1px solid #dedede; + } + </style> -<iron-collapse> - <div class="collapse-content"> - <div>Content goes here...</div> - </div> -</iron-collapse> -``` + <iron-collapse> + <div class="collapse-content"> + <div>Content goes here...</div> + </div> + </iron-collapse> + +
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/bower.json b/third_party/polymer/v1_0/components-chromium/iron-collapse/bower.json index 3fe807b3..5353380 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-collapse/bower.json +++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/bower.json
@@ -1,6 +1,6 @@ { "name": "iron-collapse", - "version": "1.0.4", + "version": "1.0.5", "description": "Provides a collapsable container", "authors": [ "The Polymer Authors" @@ -27,5 +27,6 @@ "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", "paper-styles": "PolymerElements/paper-styles#^1.0.0", "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" - } + }, + "main": "iron-collapse.html" }
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse-extracted.js index 99945f9b..bcb1cc7 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse-extracted.js
@@ -25,12 +25,22 @@ value: false, notify: true, observer: '_openedChanged' - } + }, + + /** + * Set noAnimation to true to disable animations + * + * @attribute noAnimation + */ + noAnimation: { + type: Boolean + }, }, hostAttributes: { role: 'group', + 'aria-hidden': 'true', 'aria-expanded': 'false' }, @@ -38,10 +48,9 @@ transitionend: '_transitionEnd' }, - ready: function() { - // Avoid transition at the beginning e.g. page loads and enable - // transitions only after the element is rendered and ready. - this._enableTransition = true; + attached: function() { + // It will take care of setting correct classes and styles. + this._transitionEnd(); }, /** @@ -54,25 +63,56 @@ }, show: function() { - this.opened = true; + this.opened = true; }, hide: function() { - this.opened = false; + this.opened = false; }, updateSize: function(size, animated) { - this.enableTransition(animated); - var s = this.style; - var nochange = s[this.dimension] === size; - s[this.dimension] = size; - if (animated && nochange) { - this._transitionEnd(); + // No change! + if (this.style[this.dimension] === size) { + return; } + + this._updateTransition(false); + // If we can animate, must do some prep work. + if (animated && !this.noAnimation) { + // Animation will start at the current size. + var startSize = this._calcSize(); + // For `auto` we must calculate what is the final size for the animation. + // After the transition is done, _transitionEnd will set the size back to `auto`. + if (size === 'auto') { + this.style[this.dimension] = size; + size = this._calcSize(); + } + // Go to startSize without animation. + this.style[this.dimension] = startSize; + // Force layout to ensure transition will go. Set offsetHeight to itself + // so that compilers won't remove it. + this.offsetHeight = this.offsetHeight; + // Enable animation. + this._updateTransition(true); + } + // Set the final size. + this.style[this.dimension] = size; }, + /** + * enableTransition() is deprecated, but left over so it doesn't break existing code. + * Please use `noAnimation` property instead. + * + * @method enableTransition + * @deprecated since version 1.0.4 + */ enableTransition: function(enabled) { - this.style.transitionDuration = (enabled && this._enableTransition) ? '' : '0s'; + console.warn('`enableTransition()` is deprecated, use `noAnimation` instead.'); + this.noAnimation = !enabled; + }, + + _updateTransition: function(enabled) { + this.style.transitionDuration = (enabled && !this.noAnimation) ? '' : '0s'; }, _horizontalChanged: function() { @@ -81,43 +121,33 @@ }, _openedChanged: function() { + this.setAttribute('aria-expanded', this.opened); + this.setAttribute('aria-hidden', !this.opened); + + this.toggleClass('iron-collapse-closed', false); + this.toggleClass('iron-collapse-opened', false); + this.updateSize(this.opened ? 'auto' : '0px', true); + + // Focus the current collapse. if (this.opened) { - this.setAttribute('aria-expanded', 'true'); - this.setAttribute('aria-hidden', 'false'); - - this.toggleClass('iron-collapse-closed', false); - this.updateSize('auto', false); - var s = this._calcSize(); - this.updateSize('0px', false); - // force layout to ensure transition will go - /** @suppress {suspiciousCode} */ this.offsetHeight; - this.updateSize(s, true); - // focus the current collapse this.focus(); - } else { - this.setAttribute('aria-expanded', 'false'); - this.setAttribute('aria-hidden', 'true'); - - this.toggleClass('iron-collapse-opened', false); - this.updateSize(this._calcSize(), false); - // force layout to ensure transition will go - /** @suppress {suspiciousCode} */ this.offsetHeight; - this.updateSize('0px', true); + } + if (this.noAnimation) { + this._transitionEnd(); } }, _transitionEnd: function() { if (this.opened) { - this.updateSize('auto', false); + this.style[this.dimension] = 'auto'; } this.toggleClass('iron-collapse-closed', !this.opened); this.toggleClass('iron-collapse-opened', this.opened); - this.enableTransition(false); + this._updateTransition(false); }, _calcSize: function() { return this.getBoundingClientRect()[this.dimension] + 'px'; - }, - + } }); \ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse.html b/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse.html index 698ddd34..8835252b 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse.html +++ b/third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse.html
@@ -54,16 +54,13 @@ :host { display: block; transition-duration: 300ms; + overflow: auto; } :host(.iron-collapse-closed) { display: none; } - :host(:not(.iron-collapse-opened)) { - overflow: hidden; - } - </style> <template>
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/.bower.json b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/.bower.json index 3911d545..22433e626 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/.bower.json +++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/.bower.json
@@ -1,6 +1,6 @@ { "name": "iron-overlay-behavior", - "version": "1.1.1", + "version": "1.1.2", "license": "http://polymer.github.io/LICENSE.txt", "description": "Provides a behavior for making an element an overlay", "private": true, @@ -34,11 +34,11 @@ }, "ignore": [], "homepage": "https://github.com/PolymerElements/iron-overlay-behavior", - "_release": "1.1.1", + "_release": "1.1.2", "_resolution": { "type": "version", - "tag": "v1.1.1", - "commit": "1ed1603ce820456feab3f62ae86f8f3ec801d131" + "tag": "v1.1.2", + "commit": "40e39a971474f48f5c2c8ee7b8568a0ad5426bd8" }, "_source": "git://github.com/PolymerElements/iron-overlay-behavior.git", "_target": "^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json index 0066027..a21be7fe 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json +++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/bower.json
@@ -1,6 +1,6 @@ { "name": "iron-overlay-behavior", - "version": "1.1.1", + "version": "1.1.2", "license": "http://polymer.github.io/LICENSE.txt", "description": "Provides a behavior for making an element an overlay", "private": true,
diff --git a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js index 5ce3274..da018bd 100644 --- a/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js
@@ -122,7 +122,6 @@ }, listeners: { - 'tap': '_onClick', 'iron-resize': '_onIronResize' }, @@ -144,6 +143,10 @@ ready: function() { this._ensureSetup(); + }, + + attached: function() { + // Call _openedChanged here so that position can be computed correctly. if (this._callOpenedWhenReady) { this._openedChanged(); } @@ -375,20 +378,10 @@ }, _onCaptureClick: function(event) { - // attempt to close asynchronously and prevent the close of a tap event is immediately heard - // on target. This is because in shadow dom due to event retargetting event.target is not - // useful. - if (!this.noCancelOnOutsideClick && (this._manager.currentOverlay() == this)) { - this._cancelJob = this.async(function() { - this.cancel(); - }, 10); - } - }, - - _onClick: function(event) { - if (this._cancelJob) { - this.cancelAsync(this._cancelJob); - this._cancelJob = null; + if (!this.noCancelOnOutsideClick && + this._manager.currentOverlay() === this && + Polymer.dom(event).path.indexOf(this) === -1) { + this.cancel(); } }, @@ -397,6 +390,7 @@ if (!this.noCancelOnEscKey && (event.keyCode === ESC)) { this.cancel(); event.stopPropagation(); + event.stopImmediatePropagation(); } },
diff --git a/third_party/polymer/v1_0/components-chromium/paper-button/.bower.json b/third_party/polymer/v1_0/components-chromium/paper-button/.bower.json index 27d4feb1..3a4aa67 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-button/.bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-button/.bower.json
@@ -1,6 +1,6 @@ { "name": "paper-button", - "version": "1.0.10", + "version": "1.0.11", "description": "Material design button", "authors": [ "The Polymer Authors" @@ -39,11 +39,11 @@ "paper-styles": "polymerelements/paper-styles#^1.0.0" }, "ignore": [], - "_release": "1.0.10", + "_release": "1.0.11", "_resolution": { "type": "version", - "tag": "v1.0.10", - "commit": "53d833818fa738a5160177f9f834a08c839ab2be" + "tag": "v1.0.11", + "commit": "7d0f75300372d91835ae7298593d50987d4a610f" }, "_source": "git://github.com/PolymerElements/paper-button.git", "_target": "^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/paper-button/bower.json b/third_party/polymer/v1_0/components-chromium/paper-button/bower.json index 0a2e87a2..bcb07a8 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-button/bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-button/bower.json
@@ -1,6 +1,6 @@ { "name": "paper-button", - "version": "1.0.10", + "version": "1.0.11", "description": "Material design button", "authors": [ "The Polymer Authors"
diff --git a/third_party/polymer/v1_0/components-chromium/paper-button/paper-button-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-button/paper-button-extracted.js index e0678f37..defbf02 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-button/paper-button-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/paper-button/paper-button-extracted.js
@@ -19,7 +19,7 @@ _calculateElevation: function() { if (!this.raised) { - this.elevation = 0; + this._setElevation(0); } else { Polymer.PaperButtonBehaviorImpl._calculateElevation.apply(this); }
diff --git a/third_party/polymer/v1_0/components-chromium/paper-checkbox/.bower.json b/third_party/polymer/v1_0/components-chromium/paper-checkbox/.bower.json index 89fe199..f8b0f98d 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-checkbox/.bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-checkbox/.bower.json
@@ -1,6 +1,6 @@ { "name": "paper-checkbox", - "version": "1.0.16", + "version": "1.1.0", "description": "A material design checkbox", "authors": [ "The Polymer Authors" @@ -37,11 +37,11 @@ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0" }, "main": "paper-checkbox.html", - "_release": "1.0.16", + "_release": "1.1.0", "_resolution": { "type": "version", - "tag": "v1.0.16", - "commit": "5bfe12e9a096664c3f199d654c890d2a8d2def31" + "tag": "v1.1.0", + "commit": "ee47421a36034bdf540fabeea713b4b11a7c11ac" }, "_source": "git://github.com/PolymerElements/paper-checkbox.git", "_target": "^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/paper-checkbox/bower.json b/third_party/polymer/v1_0/components-chromium/paper-checkbox/bower.json index 6233cb91..344cbbc 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-checkbox/bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-checkbox/bower.json
@@ -1,6 +1,6 @@ { "name": "paper-checkbox", - "version": "1.0.16", + "version": "1.1.0", "description": "A material design checkbox", "authors": [ "The Polymer Authors"
diff --git a/third_party/polymer/v1_0/components-chromium/paper-checkbox/paper-checkbox.html b/third_party/polymer/v1_0/components-chromium/paper-checkbox/paper-checkbox.html index 7cd8436..0f53b7f6 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-checkbox/paper-checkbox.html +++ b/third_party/polymer/v1_0/components-chromium/paper-checkbox/paper-checkbox.html
@@ -42,6 +42,7 @@ `--paper-checkbox-label-color` | Label color | `--primary-text-color` `--paper-checkbox-label-spacing` | Spacing between the label and the checkbox | `8px` `--paper-checkbox-error-color` | Checkbox color when invalid | `--google-red-500` +`--paper-checkbox-size` | Size of the checkbox | `18px` @demo demo/index.html --> @@ -53,6 +54,7 @@ display: inline-block; white-space: nowrap; cursor: pointer; + --calculated-paper-checkbox-size: var(--paper-checkbox-size, 18px); } :host(:focus) { @@ -66,26 +68,29 @@ #checkboxContainer { display: inline-block; position: relative; - width: 18px; - height: 18px; - min-width: 18px; + width: var(--calculated-paper-checkbox-size); + height: var(--calculated-paper-checkbox-size); + min-width: var(--calculated-paper-checkbox-size); vertical-align: middle; background-color: var(--paper-checkbox-unchecked-background-color, transparent); } #ink { position: absolute; - top: -15px; - left: -15px; - width: 48px; - height: 48px; + + /* Center the ripple in the checkbox by negative offsetting it by + * (inkWidth - rippleWidth) / 2 */ + top: calc(0px - (2.66 * var(--calculated-paper-checkbox-size) - var(--calculated-paper-checkbox-size)) / 2); + left: calc(0px - (2.66 * var(--calculated-paper-checkbox-size) - var(--calculated-paper-checkbox-size)) / 2); + width: calc(2.66 * var(--calculated-paper-checkbox-size)); + height: calc(2.66 * var(--calculated-paper-checkbox-size)); color: var(--paper-checkbox-unchecked-ink-color, --primary-text-color); opacity: 0.6; pointer-events: none; } :host-context([dir="rtl"]) #ink { - right: -15px; + right: calc(0px - (2.66 * var(--calculated-paper-checkbox-size) - var(--calculated-paper-checkbox-size)) / 2); left: auto; } @@ -136,18 +141,23 @@ #checkmark { position: absolute; - width: 5px; - height: 10px; + width: 36%; + height: 70%; border-style: solid; border-top: none; border-left: none; - border-right-width: 2px; - border-bottom-width: 2px; + border-right-width: calc(2/15 * var(--calculated-paper-checkbox-size)); + border-bottom-width: calc(2/15 * var(--calculated-paper-checkbox-size)); border-color: var(--paper-checkbox-checkmark-color, white); transform-origin: 97% 86%; -webkit-transform-origin: 97% 86%; } + :host-context([dir="rtl"]) #checkmark { + transform-origin: 50% 14%; + -webkit-transform-origin: 50% 14%; + } + /* label */ #checkboxLabel { position: relative;
diff --git a/third_party/polymer/v1_0/components-chromium/paper-fab/.bower.json b/third_party/polymer/v1_0/components-chromium/paper-fab/.bower.json index 9e3d4ae2..85326d3 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-fab/.bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-fab/.bower.json
@@ -1,6 +1,6 @@ { "name": "paper-fab", - "version": "1.1.0", + "version": "1.1.1", "description": "A material design floating action button", "authors": [ "The Polymer Authors" @@ -31,16 +31,17 @@ }, "devDependencies": { "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", "paper-styles": "PolymerElements/paper-styles#^1.0.0", "test-fixture": "PolymerElements/test-fixture#^1.0.0", "web-component-tester": "polymer/web-component-tester#^3.4.0", "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" }, - "_release": "1.1.0", + "_release": "1.1.1", "_resolution": { "type": "version", - "tag": "v1.1.0", - "commit": "03fd1462029c2dd0b9208b6f6511af8d78eb91bd" + "tag": "v1.1.1", + "commit": "400347d218d5beaba2897c71288c8cd55ba0a46e" }, "_source": "git://github.com/PolymerElements/paper-fab.git", "_target": "^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/paper-fab/bower.json b/third_party/polymer/v1_0/components-chromium/paper-fab/bower.json index e5ac070..8576db1a 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-fab/bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-fab/bower.json
@@ -1,6 +1,6 @@ { "name": "paper-fab", - "version": "1.1.0", + "version": "1.1.1", "description": "A material design floating action button", "authors": [ "The Polymer Authors" @@ -31,6 +31,7 @@ }, "devDependencies": { "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", "paper-styles": "PolymerElements/paper-styles#^1.0.0", "test-fixture": "PolymerElements/test-fixture#^1.0.0", "web-component-tester": "polymer/web-component-tester#^3.4.0",
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/.bower.json b/third_party/polymer/v1_0/components-chromium/paper-input/.bower.json index 824aa9a..b59e0b67 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/.bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-input/.bower.json
@@ -1,6 +1,6 @@ { "name": "paper-input", - "version": "1.1.2", + "version": "1.1.3", "description": "Material design text fields", "authors": [ "The Polymer Authors" @@ -37,19 +37,20 @@ }, "devDependencies": { "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", "iron-icon": "PolymerElements/iron-icon#^1.0.0", "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0", "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "web-component-tester": "Polymer/web-component-tester#^3.3.0", + "web-component-tester": "Polymer/web-component-tester#^3.4.0", "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" }, - "_release": "1.1.2", + "_release": "1.1.3", "_resolution": { "type": "version", - "tag": "v1.1.2", - "commit": "6c6ba4b5e3e4b18ee387d2b922e00e3edfe0e347" + "tag": "v1.1.3", + "commit": "f070288446f9e78fbe16b032ddb429a8e8015ee7" }, "_source": "git://github.com/PolymerElements/paper-input.git", "_target": "^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/README.md b/third_party/polymer/v1_0/components-chromium/paper-input/README.md index bda60de..6e98590 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/README.md +++ b/third_party/polymer/v1_0/components-chromium/paper-input/README.md
@@ -151,6 +151,7 @@ `--paper-input-container-disabled` | Mixin applied to the container when it's disabled | `{}` `--paper-input-container-label` | Mixin applied to the label | `{}` `--paper-input-container-label-focus` | Mixin applied to the label when the input is focused | `{}` +`--paper-input-container-label-floating` | Mixin applied to the label when floating | `{}` `--paper-input-container-input` | Mixin applied to the input | `{}` `--paper-input-container-underline` | Mixin applied to the underline | `{}` `--paper-input-container-underline-focus` | Mixin applied to the underline when the input is focused | `{}`
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/bower.json b/third_party/polymer/v1_0/components-chromium/paper-input/bower.json index 580ec250..4b1c8fe 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-input/bower.json
@@ -1,6 +1,6 @@ { "name": "paper-input", - "version": "1.1.2", + "version": "1.1.3", "description": "Material design text fields", "authors": [ "The Polymer Authors" @@ -37,12 +37,13 @@ }, "devDependencies": { "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", "iron-icon": "PolymerElements/iron-icon#^1.0.0", "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0", "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0", "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0", "test-fixture": "PolymerElements/test-fixture#^1.0.0", - "web-component-tester": "Polymer/web-component-tester#^3.3.0", + "web-component-tester": "Polymer/web-component-tester#^3.4.0", "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" } }
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior-extracted.js index ec3cff1b..9a932e6 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior-extracted.js
@@ -9,7 +9,6 @@ * @polymerBehavior Polymer.PaperInputBehavior */ Polymer.PaperInputBehaviorImpl = { - properties: { /** * Fired when the input changes due to user interaction. @@ -393,6 +392,7 @@ this._shiftTabPressed = false; }, 1); }, + /** * If `autoValidate` is true, then validates the element. */ @@ -473,7 +473,6 @@ }); } } - }; /** @polymerBehavior */
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior.html b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior.html index a0fa7a2..73362e0c 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior.html +++ b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-behavior.html
@@ -7,7 +7,7 @@ Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt --><html><head><link rel="import" href="../polymer/polymer.html"> -<link rel="import" href="../iron-behaviors/iron-control-state.html"> <link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html"> +<link rel="import" href="../iron-behaviors/iron-control-state.html"> </head><body><script src="paper-input-behavior-extracted.js"></script></body></html> \ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-char-counter.html b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-char-counter.html index a19b432..a6fb4ce 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-char-counter.html +++ b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-char-counter.html
@@ -27,9 +27,9 @@ ----------------|-------------|---------- `--paper-input-char-counter` | Mixin applied to the element | `{}` --> + </head><body><dom-module id="paper-input-char-counter"> <template> - <style> :host { display: inline-block; @@ -45,7 +45,6 @@ </style> <span>[[_charCounterStr]]</span> - </template> </dom-module>
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-container.html b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-container.html index 79f3b395..b1d5899f 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-container.html +++ b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-container.html
@@ -7,10 +7,10 @@ Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt --><html><head><link rel="import" href="../polymer/polymer.html"> -<link rel="import" href="../paper-styles/color.html"> -<link rel="import" href="../paper-styles/typography.html"> -<link rel="import" href="../paper-styles/default-theme.html"> <link rel="import" href="../iron-flex-layout/iron-flex-layout.html"> +<link rel="import" href="../paper-styles/color.html"> +<link rel="import" href="../paper-styles/default-theme.html"> +<link rel="import" href="../paper-styles/typography.html"> <!-- `<paper-input-container>` is a container for a `<label>`, an `<input is="iron-input">` or @@ -79,6 +79,7 @@ `--paper-input-container-disabled` | Mixin applied to the container when it's disabled | `{}` `--paper-input-container-label` | Mixin applied to the label | `{}` `--paper-input-container-label-focus` | Mixin applied to the label when the input is focused | `{}` +`--paper-input-container-label-floating` | Mixin applied to the label when floating | `{}` `--paper-input-container-input` | Mixin applied to the input | `{}` `--paper-input-container-underline` | Mixin applied to the underline | `{}` `--paper-input-container-underline-focus` | Mixin applied to the underline when the input is focused | `{}` @@ -89,9 +90,9 @@ This element is `display:block` by default, but you can set the `inline` attribute to make it `display:inline-block`. --> + </head><body><dom-module id="paper-input-container"> <template> - <style> :host { display: block; @@ -120,16 +121,15 @@ } .focused-line { - height: 2px; @apply(--layout-fit); + background: var(--paper-input-container-focus-color, --default-primary-color); + height: 2px; -webkit-transform-origin: center center; transform-origin: center center; -webkit-transform: scale3d(0,1,1); transform: scale3d(0,1,1); - background: var(--paper-input-container-focus-color, --default-primary-color); - @apply(--paper-input-container-underline-focus); } @@ -144,7 +144,6 @@ .underline.is-invalid .focused-line { background: var(--paper-input-container-invalid-color, --google-red-500); - -webkit-transform: none; transform: none; -webkit-transition: -webkit-transform 0.25s; @@ -154,8 +153,9 @@ } .unfocused-line { - height: 1px; @apply(--layout-fit); + + height: 1px; background: var(--paper-input-container-color, --secondary-text-color); @apply(--paper-input-container-underline); @@ -175,9 +175,10 @@ } .input-content { - position: relative; @apply(--layout-horizontal); @apply(--layout-center); + + position: relative; } .input-content ::content label, @@ -200,7 +201,6 @@ transform: translateY(-75%) scale(0.75); -webkit-transition: -webkit-transform 0.25s; transition: transform 0.25s; - -webkit-transform-origin: left top; transform-origin: left top; @@ -209,6 +209,7 @@ width: 133%; @apply(--paper-transition-easing); + @apply(--paper-input-container-label-floating); } :host-context([dir="rtl"]) .input-content.label-is-floating ::content label, @@ -299,6 +300,7 @@ <div class="label-and-input-container" id="labelAndInputContainer"> <content select=":not([add-on]):not([prefix]):not([suffix])"></content> </div> + <content select="[suffix]"></content> </div> @@ -310,7 +312,6 @@ <div class$="[[_computeAddOnContentClass(focused,invalid)]]"> <content id="addOnContent" select="[add-on]"></content> </div> - </template> </dom-module>
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-error.html b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-error.html index c00f52c..06928b99 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-error.html +++ b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input-error.html
@@ -29,9 +29,9 @@ `--paper-input-container-invalid-color` | The foreground color of the error | `--google-red-500` `--paper-input-error` | Mixin applied to the error | `{}` --> + </head><body><dom-module id="paper-input-error"> <template> - <style> :host { display: inline-block; @@ -52,7 +52,6 @@ </style> <content></content> - </template> </dom-module>
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input.html b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input.html index ef03f6f..6edcd08 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/paper-input.html +++ b/third_party/polymer/v1_0/components-chromium/paper-input/paper-input.html
@@ -66,7 +66,6 @@ </head><body><dom-module id="paper-input"> <template> - <style> :host { display: block; @@ -108,7 +107,6 @@ </template> </paper-input-container> - </template> </dom-module>
diff --git a/third_party/polymer/v1_0/components-chromium/paper-input/paper-textarea.html b/third_party/polymer/v1_0/components-chromium/paper-input/paper-textarea.html index 207f12bb..4a49cff 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-input/paper-textarea.html +++ b/third_party/polymer/v1_0/components-chromium/paper-input/paper-textarea.html
@@ -53,7 +53,6 @@ </template> </paper-input-container> - </template> </dom-module>
diff --git a/third_party/polymer/v1_0/components-chromium/paper-radio-group/.bower.json b/third_party/polymer/v1_0/components-chromium/paper-radio-group/.bower.json index 02528a7..66787bb 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-radio-group/.bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-radio-group/.bower.json
@@ -1,6 +1,6 @@ { "name": "paper-radio-group", - "version": "1.0.7", + "version": "1.0.8", "description": "A group of material design radio buttons", "authors": [ "The Polymer Authors" @@ -34,11 +34,11 @@ "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" }, "main": "paper-radio-group.html", - "_release": "1.0.7", + "_release": "1.0.8", "_resolution": { "type": "version", - "tag": "v1.0.7", - "commit": "5f0d8a159a545e4eca1aefa5716d29f230364499" + "tag": "v1.0.8", + "commit": "398bb090d50b1422ba1848ae531cff6e6aff753f" }, "_source": "git://github.com/PolymerElements/paper-radio-group.git", "_target": "^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/paper-radio-group/bower.json b/third_party/polymer/v1_0/components-chromium/paper-radio-group/bower.json index 3e69635f..f7d122a 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-radio-group/bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-radio-group/bower.json
@@ -1,6 +1,6 @@ { "name": "paper-radio-group", - "version": "1.0.7", + "version": "1.0.8", "description": "A group of material design radio buttons", "authors": [ "The Polymer Authors"
diff --git a/third_party/polymer/v1_0/components-chromium/paper-radio-group/paper-radio-group-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-radio-group/paper-radio-group-extracted.js index c220d50..9e7e9f1 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-radio-group/paper-radio-group-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/paper-radio-group/paper-radio-group-extracted.js
@@ -95,7 +95,7 @@ newIndex = (newIndex - 1 + length) % length; } while (this.items[newIndex].disabled) - this.select(this._indexToValue(newIndex)); + this._itemActivate(this._indexToValue(newIndex), this.items[newIndex]); }, /** @@ -110,6 +110,6 @@ newIndex = (newIndex + 1 + length) % length; } while (this.items[newIndex].disabled) - this.select(this._indexToValue(newIndex)); + this._itemActivate(this._indexToValue(newIndex), this.items[newIndex]); }, }); \ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/.bower.json b/third_party/polymer/v1_0/components-chromium/paper-tabs/.bower.json index 219be8c..c7b99b3 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-tabs/.bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-tabs/.bower.json
@@ -1,6 +1,6 @@ { "name": "paper-tabs", - "version": "1.2.3", + "version": "1.2.4", "license": "http://polymer.github.io/LICENSE.txt", "description": "Material design tabs", "private": true, @@ -41,11 +41,11 @@ }, "ignore": [], "homepage": "https://github.com/PolymerElements/paper-tabs", - "_release": "1.2.3", + "_release": "1.2.4", "_resolution": { "type": "version", - "tag": "v1.2.3", - "commit": "9b3d2209a7d2ac4b0c6a2f0464af1b91d930926f" + "tag": "v1.2.4", + "commit": "84f2f485f00ec64e16051891ca3c28c2b41b698a" }, "_source": "git://github.com/PolymerElements/paper-tabs.git", "_target": "^1.0.0",
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/bower.json b/third_party/polymer/v1_0/components-chromium/paper-tabs/bower.json index 76c31ec..043ef194 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-tabs/bower.json +++ b/third_party/polymer/v1_0/components-chromium/paper-tabs/bower.json
@@ -1,6 +1,6 @@ { "name": "paper-tabs", - "version": "1.2.3", + "version": "1.2.4", "license": "http://polymer.github.io/LICENSE.txt", "description": "Material design tabs", "private": true,
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-extracted.js index b67d9c8..fc242ad 100644 --- a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-extracted.js +++ b/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-extracted.js
@@ -157,6 +157,8 @@ } else if (alignBottom) { return 'align-bottom'; } + + return ''; }, // TODO(cdata): Add `track` response back in when gesture lands.
diff --git a/third_party/polymer/v1_0/reproduce.sh b/third_party/polymer/v1_0/reproduce.sh index 8a90833..da28ea8 100755 --- a/third_party/polymer/v1_0/reproduce.sh +++ b/third_party/polymer/v1_0/reproduce.sh
@@ -54,7 +54,7 @@ # Remove carriage returns to make CQ happy. find components -type f \( -name \*.html -o -name \*.css -o -name \*.js\ -o -name \*.md -o -name \*.sh -o -name \*.json -o -name \*.gitignore\ - -o -name \*.bat \) -print0 | xargs -0 sed -i -e $'s/\r$//g' + -o -name \*.bat -o -name \*.svg \) -print0 | xargs -0 sed -i -e $'s/\r$//g' # Resolve a unicode encoding issue in dom-innerHTML.html. NBSP=$(python -c 'print u"\u00A0".encode("utf-8")')
diff --git a/third_party/re2/README.chromium b/third_party/re2/README.chromium index 6ce6d2d4..3522d4c 100644 --- a/third_party/re2/README.chromium +++ b/third_party/re2/README.chromium
@@ -30,3 +30,5 @@ - Let COMPILE_ASSERT use static_assert if available, merges upstream 2225f94df8ec - Merge upstream cc56ba02d9d2bdafa614ad5ebf564dde287625bb. +- Suppress more unwanted reports from MemorySanitizer. + (patches/sparse-array-valgrind.patch)
diff --git a/third_party/re2/patches/sparse-array-valgrind.patch b/third_party/re2/patches/sparse-array-valgrind.patch new file mode 100644 index 0000000..e2cf0bd --- /dev/null +++ b/third_party/re2/patches/sparse-array-valgrind.patch
@@ -0,0 +1,23 @@ +diff --git a/third_party/re2/util/sparse_array.h b/third_party/re2/util/sparse_array.h +index 4ee5c94..7bc3a86 100644 +--- a/third_party/re2/util/sparse_array.h ++++ b/third_party/re2/util/sparse_array.h +@@ -273,13 +273,13 @@ void SparseArray<Value>::resize(int new_max_size) { + int* a = new int[new_max_size]; + if (sparse_to_dense_) { + memmove(a, sparse_to_dense_, max_size_*sizeof a[0]); +- // Don't need to zero the memory but appease Valgrind. +- if (valgrind_) { +- for (int i = max_size_; i < new_max_size; i++) +- a[i] = 0xababababU; +- } + delete[] sparse_to_dense_; + } ++ // Don't need to zero the memory but appease Valgrind. ++ if (valgrind_) { ++ for (int i = max_size_; i < new_max_size; i++) ++ a[i] = 0xababababU; ++ } + sparse_to_dense_ = a; + + dense_.resize(new_max_size);
diff --git a/third_party/re2/util/sparse_array.h b/third_party/re2/util/sparse_array.h index 4ee5c94..7bc3a86 100644 --- a/third_party/re2/util/sparse_array.h +++ b/third_party/re2/util/sparse_array.h
@@ -273,13 +273,13 @@ int* a = new int[new_max_size]; if (sparse_to_dense_) { memmove(a, sparse_to_dense_, max_size_*sizeof a[0]); - // Don't need to zero the memory but appease Valgrind. - if (valgrind_) { - for (int i = max_size_; i < new_max_size; i++) - a[i] = 0xababababU; - } delete[] sparse_to_dense_; } + // Don't need to zero the memory but appease Valgrind. + if (valgrind_) { + for (int i = max_size_; i < new_max_size; i++) + a[i] = 0xababababU; + } sparse_to_dense_ = a; dense_.resize(new_max_size);
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index ca88a5c3..5d7c1d9 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -37,7 +37,8 @@ # dont need aura as it is implied by chromeos and ozone. 'gn_blimp_debug': ['gn', 'chromeos', 'ozone', 'debug'], - 'gn_cfi_bot': ['gn', 'cfi', 'release_bot'], + 'gn_cfi_release_bot': ['gn', 'cfi', 'release_bot'], + 'gn_cfi_release_trybot': ['gn', 'cfi', 'release_trybot'], 'gn_debug_bot': ['gn', 'debug_bot'], 'gn_debug_bot_minimal_symbols': ['gn', 'debug_bot_minimal_symbols'], 'gn_debug_bot_minimal_symbols_x86': ['gn', 'debug_bot_minimal_symbols', 'x86'], @@ -514,7 +515,7 @@ 'WebKit Android (Nexus4)': 'gyp_release_bot_android', }, 'chromium.fyi': { - 'CFI Linux': 'gn_cfi_bot', + 'CFI Linux': 'gn_cfi_release_bot', 'CrWinClang64(dbg)': 'win_clang_debug_bot', 'Libfuzzer Upload Linux': 'libfuzzer_upload_bot', 'Site Isolation Linux': 'gn_release_trybot', @@ -587,6 +588,7 @@ 'linux_site_isolation': 'gn_release_trybot', 'linux_chromium_compile_rel_ng': 'swarming_gn_release_trybot', 'linux_chromium_rel_ng': 'swarming_gpu_tests_gn_release_trybot', + 'linux_chromium_cfi_rel_ng': 'gn_cfi_release_trybot', 'linux_chromium_gn_rel': 'gn_release_trybot', 'linux_chromium_gn_chromeos_rel': 'chromeos_ozone_gn_release_trybot', 'android_chromium_gn_compile_rel': 'android_gn_release_trybot',
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index c47beee..618e243 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -68280,6 +68280,7 @@ <int value="1257980502" label="disable-accelerated-video-decode"/> <int value="1268470658" label="disable-android-password-link"/> <int value="1272699563" label="enable-hosted-mode"/> + <int value="1276209777" label="ntp-switch-to-existing-tab"/> <int value="1279584261" label="enable-carrier-switching"/> <int value="1283960113" label="disable-fixed-position-compositing"/> <int value="1298981651" label="disable-new-task-manager"/>
diff --git a/tools/perf/benchmarks/smoothness.py b/tools/perf/benchmarks/smoothness.py index 93e7a10e..d0aa60ab 100644 --- a/tools/perf/benchmarks/smoothness.py +++ b/tools/perf/benchmarks/smoothness.py
@@ -36,7 +36,6 @@ return True -@benchmark.Disabled('reference') # crbug.com/547833 class SmoothnessTop25(_Smoothness): """Measures rendering statistics while scrolling down the top 25 web pages. @@ -158,7 +157,6 @@ @benchmark.Enabled('android', 'mac') -@benchmark.Disabled('reference') # crbug.com/547833 class SmoothnessGpuRasterizationTop25(_Smoothness): """Measures rendering statistics for the top 25 with GPU rasterization. """
diff --git a/ui/base/cursor/cursors_aura.cc b/ui/base/cursor/cursors_aura.cc index d36282bd..2d384344 100644 --- a/ui/base/cursor/cursors_aura.cc +++ b/ui/base/cursor/cursors_aura.cc
@@ -128,8 +128,8 @@ }; const CursorData kAnimatedCursors[] = { - {ui::kCursorWait, IDR_THROBBER, {7, 7}, {14, 14}}, - {ui::kCursorProgress, IDR_THROBBER, {7, 7}, {14, 14}}, + {ui::kCursorWait, IDR_AURA_CURSOR_THROBBER, {7, 7}, {14, 14}}, + {ui::kCursorProgress, IDR_AURA_CURSOR_THROBBER, {7, 7}, {14, 14}}, }; const CursorSet kCursorSets[] = {
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index cb09ad3..5a1c7adf 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc
@@ -139,8 +139,8 @@ settings.use_property_trees = false; settings.use_zero_copy = IsUIZeroCopyEnabled(); - settings.renderer_settings.use_rgba_4444_textures = - command_line->HasSwitch(switches::kUIEnableRGBA4444Textures); + if (command_line->HasSwitch(switches::kUIEnableRGBA4444Textures)) + settings.renderer_settings.preferred_tile_format = cc::RGBA_4444; // UI compositor always uses partial raster if not using zero-copy. Zero copy // doesn't currently support partial raster.
diff --git a/ui/file_manager/audio_player/elements/control_panel.html b/ui/file_manager/audio_player/elements/control_panel.html index e092b62..67e4b6e6 100644 --- a/ui/file_manager/audio_player/elements/control_panel.html +++ b/ui/file_manager/audio_player/elements/control_panel.html
@@ -60,7 +60,7 @@ <!-- Play/pause button and seek slider in the bottom line. --> <div class="time-container"> <div class="time-spacer">[[computeTimeString_(duration, duration)]]</div> - <div class="time">[[computeTimeString_(time, duration)]]</div> + <div class="time">[[computeDisplayTimeString_(dragging, time, seekingTime, duration)]]</div> </div> <paper-slider id="timeSlider" max="[[duration]]" value="{{time::change}}"></paper-slider>
diff --git a/ui/file_manager/audio_player/elements/control_panel.js b/ui/file_manager/audio_player/elements/control_panel.js index cf162100..5747559 100644 --- a/ui/file_manager/audio_player/elements/control_panel.js +++ b/ui/file_manager/audio_player/elements/control_panel.js
@@ -51,6 +51,15 @@ }, /** + * Current seeking position on the time slider in millisecond. + */ + seekingTime: { + type: Number, + value: 0, + readOnly: true + }, + + /** * Total length of the current music in millisecond. */ duration: { @@ -122,8 +131,10 @@ timeSlider.addEventListener('change', function() { if (this.dragging) this.dragging = false; + this._setSeekingTime(0); }.bind(this)); timeSlider.addEventListener('immediate-value-change', function() { + this._setSeekingTime(timeSlider.immediateValue); if (!this.dragging) this.dragging = true; }.bind(this)); @@ -193,6 +204,23 @@ }, /** + * Computes string representation of displayed time. If a user is dragging + * the knob of seek bar, seeking position should be shown. Otherwise, + * playing position should be shown. + * @param {boolean} dragging Whether the know of seek bar is being dragged. + * @param {number} time Time corresponding to the playing position. + * @param {number} seekingTime Time corresponding to the seeking position. + * @param {number} duration Duration of the audio file. + * @return {string} String representation to be displayed as current time. + */ + computeDisplayTimeString_: function(dragging, time, seekingTime, duration) { + if (dragging) + return this.computeTimeString_(seekingTime, duration); + else + return this.computeTimeString_(time, duration); + }, + + /** * Invoked when the playing property is changed. * @param {boolean} playing * @private
diff --git a/ui/resources/default_100_percent/throbber.png b/ui/resources/default_100_percent/common/pointers/throbber.png similarity index 100% rename from ui/resources/default_100_percent/throbber.png rename to ui/resources/default_100_percent/common/pointers/throbber.png Binary files differ
diff --git a/ui/resources/default_200_percent/throbber.png b/ui/resources/default_200_percent/common/pointers/throbber.png similarity index 100% rename from ui/resources/default_200_percent/throbber.png rename to ui/resources/default_200_percent/common/pointers/throbber.png Binary files differ
diff --git a/ui/resources/ui_resources.grd b/ui/resources/ui_resources.grd index 8098218..6e5f1e7 100644 --- a/ui/resources/ui_resources.grd +++ b/ui/resources/ui_resources.grd
@@ -70,6 +70,7 @@ <structure type="chrome_scaled_image" name="IDR_AURA_CURSOR_SOUTH_EAST_RESIZE" file="common/pointers/top_left_corner.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_CURSOR_SOUTH_RESIZE" file="common/pointers/sb_v_double_arrow.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_CURSOR_SOUTH_WEST_RESIZE" file="common/pointers/top_right_corner.png" /> + <structure type="chrome_scaled_image" name="IDR_AURA_CURSOR_THROBBER" file="common/pointers/throbber.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_CURSOR_WEST_RESIZE" file="common/pointers/sb_h_double_arrow.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_CURSOR_XTERM_HORIZ" file="common/pointers/xterm_horiz.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_CURSOR_ZOOM_IN" file="common/pointers/zoom_in.png" /> @@ -267,7 +268,9 @@ <structure type="chrome_scaled_image" name="IDR_TEXT_SELECTION_HANDLE_LEFT" file="common/text_selection_handle_left.png" /> <structure type="chrome_scaled_image" name="IDR_TEXT_SELECTION_HANDLE_RIGHT" file="common/text_selection_handle_right.png" /> </if> - <structure type="chrome_scaled_image" name="IDR_THROBBER" file="throbber.png" /> + <if expr="is_macosx"> + <structure type="chrome_scaled_image" name="IDR_THROBBER" file="legacy/throbber.png" /> + </if> <if expr="toolkit_views"> <structure type="chrome_scaled_image" name="IDR_TOUCH_DRAG_TIP_COPY" file="common/drag_tip_copy.png" /> <structure type="chrome_scaled_image" name="IDR_TOUCH_DRAG_TIP_MOVE" file="common/drag_tip_move.png" />