GunChleoc has proposed merging 
lp:~widelands-dev/widelands/bug-1535732-fun-with-pointers into lp:widelands.

Requested reviews:
  kaputtnik (franku)
Related bugs:
  Bug #1535732 in widelands: "Texts not displayed correctly with the new font 
renderer"
  https://bugs.launchpad.net/widelands/+bug/1535732

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/bug-1535732-fun-with-pointers/+merge/292735

Another attempt at fixing the text textures in certain Windows installations.
-- 
Your team Widelands Developers is subscribed to branch 
lp:~widelands-dev/widelands/bug-1535732-fun-with-pointers.
=== modified file 'src/graphic/text/rt_render.cc'
--- src/graphic/text/rt_render.cc	2016-04-23 08:16:51 +0000
+++ src/graphic/text/rt_render.cc	2016-04-24 17:48:37 +0000
@@ -269,7 +269,8 @@
 	while (idx_ < all_nodes_.size()
 		&& all_nodes_[idx_]->is_non_mandatory_space()
 		&& shrink_to_fit) {
-			delete all_nodes_[idx_++];
+			delete all_nodes_[idx_];
+			all_nodes_[idx_++] = nullptr;
 	}
 
 	uint16_t x = p.left;
@@ -551,7 +552,7 @@
 		Texture* rv = new Texture(w_, h_);
 
 		// Draw background image (tiling)
-		if (background_image_) {
+		if (background_image_ != nullptr) {
 			Rect dst;
 			Rect srcrect(Point(0, 0), 1, 1);
 			for (uint16_t curx = 0; curx < w_; curx += background_image_->width()) {
@@ -617,7 +618,7 @@
 		}
 
 		// Draw background image (tiling)
-		if (background_image_) {
+		if (background_image_ != nullptr) {
 			Rect dst;
 			Rect src(0, 0, 0, 0);
 
@@ -635,7 +636,7 @@
 
 		for (RenderNode* n : nodes_to_render_) {
 			Texture* node_texture = n->render(texture_cache);
-			if (node_texture) {
+			if (node_texture != nullptr) {
 				Rect dst = Rect(n->x() + margin_.left,
 									 n->y() + margin_.top,
 				                node_texture->width(),
@@ -814,7 +815,7 @@
 
 void TagHandler::emit_nodes(vector<RenderNode*>& nodes) {
 	for (Child* c : tag_.children()) {
-		if (c->tag) {
+		if (c->tag != nullptr) {
 			std::unique_ptr<TagHandler> th(create_taghandler(*c->tag, font_cache_, nodestyle_, image_cache_,
 																			 renderer_style_, fontsets_));
 			th->enter();
@@ -972,7 +973,7 @@
 			else
 				sn = new SpaceNode(nodestyle_, 0, 0, true);
 
-			if (background_image_)
+			if (background_image_ != nullptr)
 				sn->set_background(background_image_);
 			rn = sn;
 		}

=== modified file 'src/ui_basic/box.cc'
--- src/ui_basic/box.cc	2016-04-01 09:29:17 +0000
+++ src/ui_basic/box.cc	2016-04-24 17:48:37 +0000
@@ -211,7 +211,7 @@
 
 void Box::update_positions()
 {
-	int32_t scrollpos = scrollbar_ ? scrollbar_->get_scrollpos() : 0;
+	int32_t scrollpos = scrollbar_ != nullptr ? scrollbar_->get_scrollpos() : 0;
 
 	uint32_t totaldepth = 0;
 	uint32_t totalbreadth = orientation_ == Horizontal ? get_inner_h() : get_inner_w();

=== modified file 'src/ui_basic/button.cc'
--- src/ui_basic/button.cc	2016-03-19 11:47:00 +0000
+++ src/ui_basic/button.cc	2016-04-24 17:48:37 +0000
@@ -155,7 +155,7 @@
 {
 	// Draw the background
 	if (!flat_ || draw_flat_background_) {
-		assert(pic_background_);
+		assert(pic_background_ != nullptr);
 		dst.fill_rect(Rect(Point(0, 0), get_w(), get_h()), RGBAColor(0, 0, 0, 255));
 		dst.tile(Rect(Point(0, 0), get_w(), get_h()), pic_background_, Point(get_x(), get_y()));
 	}
@@ -165,7 +165,7 @@
 			(Rect(Point(0, 0), get_w(), get_h()), MOUSE_OVER_BRIGHT_FACTOR);
 
 	//  If we've got a picture, draw it centered
-	if (pic_custom_) {
+	if (pic_custom_ != nullptr) {
 		if (keep_image_size_) {
 			if (enabled_) {
 				//  ">> 1" is almost like "/ 2", but simpler for signed types (difference

=== modified file 'src/ui_basic/checkbox.cc'
--- src/ui_basic/checkbox.cc	2016-02-09 21:14:53 +0000
+++ src/ui_basic/checkbox.cc	2016-04-24 17:48:37 +0000
@@ -67,7 +67,7 @@
 									width > (kStateboxSize + kPadding) ? width - kStateboxSize - kPadding : 0))
 {
 	pic_graphics_ = g_gr->images().get("images/ui_basic/checkbox_light.png");
-	if (rendered_text_) {
+	if (rendered_text_ != nullptr) {
 		int w = rendered_text_->width() + kPadding + pic_graphics_->width() / 2;
 		int h = std::max(rendered_text_->height(), pic_graphics_->height());
 		set_desired_size(w, h);
@@ -142,7 +142,7 @@
 		Point image_anchor(0, 0);
 		Point text_anchor(kStateboxSize + kPadding, 0);
 
-		if (rendered_text_) {
+		if (rendered_text_ != nullptr) {
 			if (UI::g_fh1->fontset()->is_rtl()) {
 				text_anchor.x = 0;
 				image_anchor.x = rendered_text_->width() + kPadding;

=== modified file 'src/ui_basic/icon.cc'
--- src/ui_basic/icon.cc	2016-03-19 11:47:00 +0000
+++ src/ui_basic/icon.cc	2016-04-24 17:48:37 +0000
@@ -55,7 +55,7 @@
 }
 
 void Icon::draw(RenderTarget & dst) {
-	if (pic_) {
+	if (pic_ != nullptr) {
 		double scale = std::min(static_cast<double>(get_w()) / pic_->width(),
 		                        static_cast<double>(get_h()) / pic_->height());
 		scale = std::min(1., scale);

=== modified file 'src/ui_basic/listselect.cc'
--- src/ui_basic/listselect.cc	2016-03-25 17:01:05 +0000
+++ src/ui_basic/listselect.cc	2016-04-24 17:48:37 +0000
@@ -130,7 +130,7 @@
 	er->name    = name;
 	er->tooltip = tooltip_text;
 	uint32_t entry_height = lineheight_;
-	if (pic) {
+	if (pic != nullptr) {
 		uint16_t w = pic->width();
 		uint16_t h = pic->height();
 		entry_height = (h >= entry_height) ? h : entry_height;
@@ -168,7 +168,7 @@
 	er->tooltip = tooltip_text;
 
 	uint32_t entry_height = lineheight_;
-	if (pic) {
+	if (pic != nullptr) {
 		uint16_t w = pic->width();
 		uint16_t h = pic->height();
 		entry_height = (h >= entry_height) ? h : entry_height;

=== modified file 'src/ui_basic/messagebox.cc'
--- src/ui_basic/messagebox.cc	2016-02-09 21:14:53 +0000
+++ src/ui_basic/messagebox.cc	2016-04-24 17:48:37 +0000
@@ -33,8 +33,8 @@
                            Align align)
    : Window(parent, "message_box", 0, 0, 20, 20, caption.c_str()), type_(type) {
 	// Calculate textarea dimensions depending on text size
-	const int outerwidth = parent ? parent->get_inner_w() : g_gr->get_xres();
-	const int outerheight = parent ? parent->get_inner_h() : g_gr->get_yres();
+	const int outerwidth = parent != nullptr ? parent->get_inner_w() : g_gr->get_xres();
+	const int outerheight = parent != nullptr ? parent->get_inner_h() : g_gr->get_yres();
 
 	const int button_w = 120;
 	const int minwidth = 3.5 * button_w;

=== modified file 'src/ui_basic/panel.cc'
--- src/ui_basic/panel.cc	2016-03-10 15:00:32 +0000
+++ src/ui_basic/panel.cc	2016-04-24 17:48:37 +0000
@@ -63,10 +63,10 @@
 	tooltip_(tooltip_text)
 {
 	assert(nparent != this);
-	if (parent_) {
+	if (parent_ != nullptr) {
 		next_ = parent_->first_child_;
 		prev_ = nullptr;
-		if (next_)
+		if (next_ != nullptr)
 			next_->prev_ = this;
 		else
 			parent_->last_child_ = this;
@@ -90,17 +90,17 @@
 	free_children();
 
 	// Unlink
-	if (parent_) {
+	if (parent_ != nullptr) {
 		if (parent_->mousein_child_ == this)
 			parent_->mousein_child_ = nullptr;
 		if (parent_->focus_ == this)
 			parent_->focus_ = nullptr;
 
-		if (prev_)
+		if (prev_ != nullptr)
 			prev_->next_ = next_;
 		else
 			parent_->first_child_ = next_;
-		if (next_)
+		if (next_ != nullptr)
 			next_->prev_ = prev_;
 		else
 			parent_->last_child_ = prev_;
@@ -115,7 +115,7 @@
 	// Scan-build claims this results in double free.
 	// This is a false positive.
 	// See https://bugs.launchpad.net/widelands/+bug/1198928
-	while (first_child_) delete first_child_;
+	while (first_child_ != nullptr) delete first_child_;
 }
 
 
@@ -240,7 +240,7 @@
 	w_ = nw;
 	h_ = nh;
 
-	if (parent_)
+	if (parent_ != nullptr)
 		move_inside_parent();
 
 	layout();
@@ -324,7 +324,7 @@
  */
 Point Panel::to_parent(const Point & pt) const
 {
-	if (!parent_)
+	if (parent_ == nullptr)
 		return pt;
 
 	return pt + Point(lborder_ + x_, tborder_ + y_);
@@ -379,15 +379,15 @@
  */
 void Panel::move_to_top()
 {
-	if (!parent_)
+	if (parent_ == nullptr)
 		return;
 
 	// unlink
-	if (prev_)
+	if (prev_ != nullptr)
 		prev_->next_ = next_;
 	else
 		parent_->first_child_ = next_;
-	if (next_)
+	if (next_ != nullptr)
 		next_->prev_ = prev_;
 	else
 		parent_->last_child_ = prev_;
@@ -396,7 +396,7 @@
 	prev_ = nullptr;
 	next_ = parent_->first_child_;
 	parent_->first_child_ = this;
-	if (next_)
+	if (next_ != nullptr)
 		next_->prev_ = this;
 	else
 		parent_->last_child_ = this;
@@ -451,7 +451,7 @@
 	if (thinks())
 		think();
 
-	for (Panel * child = first_child_; child; child = child->next_)
+	for (Panel * child = first_child_; child != nullptr; child = child->next_)
 		child->do_think();
 }
 
@@ -461,7 +461,7 @@
 */
 Point Panel::get_mouse_position() const {
 	return
-		(parent_ ?
+		(parent_ != nullptr ?
 		 parent_             ->get_mouse_position()
 		 :
 		 WLApplication::get()->get_mouse_position())
@@ -476,7 +476,7 @@
 void Panel::set_mouse_pos(const Point p) {
 	const Point relative_p =
 		p + Point(get_x() + get_lborder(), get_y() + get_tborder());
-	if (parent_)
+	if (parent_ != nullptr)
 		parent_             ->set_mouse_pos(relative_p);
 	else
 		WLApplication::get()->warp_mouse   (relative_p);
@@ -548,7 +548,7 @@
 bool Panel::handle_key(bool down, SDL_Keysym code)
 {
 	if (down) {
-		if (focus_) {
+		if (focus_ != nullptr) {
 				Panel * p = focus_->next_;
 				switch (code.sym) {
 
@@ -636,7 +636,7 @@
 	else {
 		flags_ &= ~pf_can_focus;
 
-		if (parent_ && parent_->focus_ == this)
+		if (parent_ != nullptr && parent_->focus_ == this)
 			parent_->focus_ = nullptr;
 	}
 }
@@ -659,7 +659,7 @@
 		}
 	}
 
-	if (!parent_ || this == modal_) {
+	if (parent_ == nullptr || this == modal_) {
 		return;
 	}
 	if (parent_->focus_ == this)
@@ -693,7 +693,7 @@
 {
 	flags_ |= pf_die;
 
-	for (Panel * p = parent_; p; p = p->parent_) {
+	for (Panel * p = parent_; p != nullptr; p = p->parent_) {
 		p->flags_ |= pf_child_die;
 		if (p == modal_)
 			break;
@@ -725,7 +725,7 @@
 void Panel::check_child_death()
 {
 	Panel * next = first_child_;
-	while (next) {
+	while (next != nullptr) {
 		Panel * p = next;
 		next = p->next_;
 
@@ -750,7 +750,7 @@
 	draw(dst);
 
 	// draw back to front
-	for (Panel * child = last_child_; child; child = child->prev_)
+	for (Panel * child = last_child_; child != nullptr; child = child->prev_)
 		child->do_draw(dst);
 
 	draw_overlay(dst);
@@ -798,7 +798,7 @@
 	(int32_t const x, int32_t const y, Panel * child)
 {
 
-	for (; child; child = child->next_) {
+	for (; child != nullptr; child = child->next_) {
 		if (!child->handles_mouse() || !child->is_visible())
 			continue;
 		if
@@ -808,10 +808,10 @@
 			break;
 	}
 
-	if (mousein_child_ && mousein_child_ != child)
+	if (mousein_child_ != nullptr && mousein_child_ != child)
 		mousein_child_->do_mousein(false);
 	mousein_child_ = child;
-	if (child)
+	if (child != nullptr)
 		child->do_mousein(true);
 
 	return child;
@@ -823,7 +823,7 @@
  */
 void Panel::do_mousein(bool const inside)
 {
-	if (!inside && mousein_child_) {
+	if (!inside && mousein_child_ != nullptr) {
 		mousein_child_->do_mousein(false);
 		mousein_child_ = nullptr;
 	}
@@ -862,7 +862,7 @@
 	// We need to find the actualy scrollable panel beneaththe mouse cursor,
 	// so we can have multiple scrollable elements on the same screen
 	// e.g. load map with a long desctiprion has 2 of them.
-	if (focus_) {
+	if (focus_ != nullptr) {
 		if (focus_->do_mousewheel(which, x, y))
 			return true;
 	}
@@ -913,7 +913,7 @@
  */
 bool Panel::do_key(bool const down, SDL_Keysym const code)
 {
-	if (focus_ && focus_->do_key(down, code)) {
+	if (focus_ != nullptr && focus_->do_key(down, code)) {
 		return true;
 	}
 
@@ -926,7 +926,7 @@
 }
 
 bool Panel::do_textinput(const std::string& text) {
-	if (focus_ && focus_->do_textinput(text)) {
+	if (focus_ != nullptr && focus_->do_textinput(text)) {
 		return true;
 	}
 
@@ -939,7 +939,7 @@
 
 bool Panel::do_tooltip()
 {
-	if (mousein_child_ && mousein_child_->do_tooltip()) {
+	if (mousein_child_ != nullptr && mousein_child_->do_tooltip()) {
 		return true;
 	}
 	return handle_tooltip();
@@ -963,14 +963,14 @@
 	Panel * mousein;
 	Panel * rcv = nullptr;
 
-	if (mousegrab_)
+	if (mousegrab_ != nullptr)
 		mousein = rcv = mousegrab_;
 	else
 		mousein = modal_;
 
 	x -= mousein->x_;
 	y -= mousein->y_;
-	for (Panel * p = mousein->parent_; p; p = p->parent_) {
+	for (Panel * p = mousein->parent_; p != nullptr; p = p->parent_) {
 		x -= p->lborder_ + p->x_;
 		y -= p->tborder_ + p->y_;
 	}
@@ -984,10 +984,10 @@
 		mousein = nullptr;
 
 	if (mousein != mousein_) {
-		if (mousein_)
+		if (mousein_ != nullptr)
 			mousein_->do_mousein(false);
 		mousein_ = mousein;
-		if (mousein_)
+		if (mousein_ != nullptr)
 			mousein_->do_mousein(true);
 	}
 
@@ -1057,12 +1057,12 @@
 		return true;
 	}
 	Panel* p = nullptr;
-	if (mousein_) {
+	if (mousein_ != nullptr) {
 		p = mousein_;
 	} else {
-		p = mousegrab_ ? mousegrab_ : modal_;
+		p = mousegrab_ != nullptr ? mousegrab_ : modal_;
 	}
-	if (!p) {
+	if (p == nullptr) {
 		return false;
 	}
 	return p->do_mousewheel(which, x, y);
@@ -1107,7 +1107,7 @@
 
 	static const uint32_t TIP_WIDTH_MAX = 360;
 	const Image* rendered_text = g_fh1->render(text_to_render, TIP_WIDTH_MAX);
-	if (!rendered_text) {
+	if (rendered_text == nullptr) {
 		return false;
 	}
 	uint16_t tip_width = rendered_text->width() + 4;

=== modified file 'src/ui_basic/radiobutton.cc'
--- src/ui_basic/radiobutton.cc	2016-02-18 18:27:52 +0000
+++ src/ui_basic/radiobutton.cc	2016-04-24 17:48:37 +0000
@@ -46,7 +46,7 @@
  */
 Radiobutton::~Radiobutton()
 {
-	for (Radiobutton * * pp = &group_.buttons_; *pp; pp = &(*pp)->nextbtn_) {
+	for (Radiobutton * * pp = &group_.buttons_; *pp != nullptr; pp = &(*pp)->nextbtn_) {
 		if (*pp == this) {
 			*pp = nextbtn_;
 			break;
@@ -90,7 +90,7 @@
 	// Scan-build claims this results in double free.
 	// This is a false positive.
 	// See https://bugs.launchpad.net/widelands/+bug/1198928
-	while (buttons_) delete buttons_;
+	while (buttons_ != nullptr) delete buttons_;
 }
 
 
@@ -108,7 +108,7 @@
 	++highestid_;
 	Radiobutton * btn = new Radiobutton(parent, p, pic, *this, highestid_);
 	btn->set_tooltip(tooltip);
-	if (ret_btn) (*ret_btn) = btn;
+	if (ret_btn != nullptr) (*ret_btn) = btn;
 	return highestid_;
 }
 
@@ -124,7 +124,7 @@
 		return;
 	}
 
-	for (Radiobutton * btn = buttons_; btn; btn = btn->nextbtn_)
+	for (Radiobutton * btn = buttons_; btn != nullptr; btn = btn->nextbtn_)
 		btn->set_state(btn->id_ == state);
 	state_ = state;
 	changed();
@@ -135,7 +135,7 @@
  * Disable this radiogroup
  */
 void Radiogroup::set_enabled(bool st) {
-	for (Radiobutton * btn = buttons_; btn; btn = btn->nextbtn_)
+	for (Radiobutton * btn = buttons_; btn != nullptr; btn = btn->nextbtn_)
 		btn->set_enabled(st);
 }
 

=== modified file 'src/ui_basic/scrollbar.cc'
--- src/ui_basic/scrollbar.cc	2016-03-25 17:01:05 +0000
+++ src/ui_basic/scrollbar.cc	2016-04-24 17:48:37 +0000
@@ -263,7 +263,7 @@
 	else if (area == Plus)
 		pic = pic_plus_;
 
-	if (pic) {
+	if (pic != nullptr) {
 		double image_scale =
 			std::min(1.,
 						std::min(static_cast<double>(r.w - 4) / pic->width(),

=== modified file 'src/ui_basic/table.cc'
--- src/ui_basic/table.cc	2016-03-25 17:01:05 +0000
+++ src/ui_basic/table.cc	2016-04-24 17:48:37 +0000
@@ -126,7 +126,7 @@
 
 		columns_.push_back(c);
 	}
-	if (!scrollbar_) {
+	if (scrollbar_ == nullptr) {
 		scrollbar_ =
 			new Scrollbar
 				(get_parent(),
@@ -238,7 +238,7 @@
 	}
 	entry_records_.clear();
 
-	if (scrollbar_)
+	if (scrollbar_ != nullptr)
 		scrollbar_->set_steps(1);
 	scrollpos_ = 0;
 	selection_ = no_selection_index();
@@ -492,7 +492,7 @@
 	select(static_cast<uint32_t>(new_selection));
 
 	// Scroll to newly selected entry
-	if (scrollbar_)
+	if (scrollbar_ != nullptr)
 	{
 		// Keep an unselected item above or below
 		int32_t scroll_item = new_selection + offset;

=== modified file 'src/ui_basic/tabpanel.cc'
--- src/ui_basic/tabpanel.cc	2016-03-14 07:06:20 +0000
+++ src/ui_basic/tabpanel.cc	2016-04-24 17:48:37 +0000
@@ -278,7 +278,7 @@
 	static_assert(2 < kTabPanelButtonHeight, "assert(2 < kTabPanelButtonSize) failed.");
 	static_assert(4 < kTabPanelButtonHeight, "assert(4 < kTabPanelButtonSize) failed.");
 
-	if (pic_background_) {
+	if (pic_background_ != nullptr) {
 		if (!tabs_.empty()) {
 			dst.tile
 				(Rect(Point(0, 0), tabs_.back()->get_x() + tabs_.back()->get_w(), kTabPanelButtonHeight - 2),

=== modified file 'src/ui_basic/textarea.cc'
--- src/ui_basic/textarea.cc	2016-02-17 08:48:02 +0000
+++ src/ui_basic/textarea.cc	2016-04-24 17:48:37 +0000
@@ -224,7 +224,7 @@
 	uint32_t w = 0;
 	uint16_t h = 0;
 
-	if (rendered_text_) {
+	if (rendered_text_ != nullptr) {
 		w = fixed_width_ > 0 ? fixed_width_ : rendered_text_->width();
 		h = rendered_text_->height();
 		// We want empty textareas to have height

=== modified file 'src/ui_basic/unique_window.cc'
--- src/ui_basic/unique_window.cc	2016-02-03 18:09:15 +0000
+++ src/ui_basic/unique_window.cc	2016-04-24 17:48:37 +0000
@@ -32,7 +32,7 @@
  * Creates the window, if it does not exist.
 */
 void UniqueWindow::Registry::create() {
-	if (!window) {
+	if (window == nullptr) {
 		open_window();
 	}
 }
@@ -41,7 +41,7 @@
  * Destroys the window, if it eixsts.
 */
 void UniqueWindow::Registry::destroy() {
-	if (window) {
+	if (window != nullptr) {
 		window->die();
 	}
 }
@@ -50,7 +50,7 @@
  * Either destroys or creates the window.
 */
 void UniqueWindow::Registry::toggle() {
-	if (window) {
+	if (window != nullptr) {
 		window->die();
 	} else {
 		open_window();
@@ -80,7 +80,7 @@
 	registry_     (reg),
 	usedefaultpos_(true)
 {
-	if (registry_) {
+	if (registry_ != nullptr) {
 		delete registry_->window;
 
 		registry_->window = this;
@@ -100,7 +100,7 @@
 */
 UniqueWindow::~UniqueWindow()
 {
-	if (registry_) {
+	if (registry_ != nullptr) {
 		assert(registry_->window == this);
 
 		registry_->window = nullptr;

=== modified file 'src/ui_basic/window.cc'
--- src/ui_basic/window.cc	2016-02-20 14:16:16 +0000
+++ src/ui_basic/window.cc	2016-04-24 17:48:37 +0000
@@ -132,7 +132,7 @@
  */
 void Window::update_desired_size()
 {
-	if (center_panel_ && !is_minimal_) {
+	if (center_panel_ != nullptr && !is_minimal_) {
 		int innerw, innerh;
 		center_panel_->get_desired_size(&innerw, &innerh);
 		set_desired_size
@@ -147,7 +147,7 @@
  */
 void Window::layout()
 {
-	if (center_panel_ && !is_minimal_) {
+	if (center_panel_ != nullptr && !is_minimal_) {
 		center_panel_->set_pos(Point(0, 0));
 		center_panel_->set_size(get_inner_w(), get_inner_h());
 	}
@@ -180,7 +180,7 @@
  * Moves the mouse to the child panel that is activated as fast click panel
  */
 void Window::warp_mouse_to_fastclick_panel() {
-	if (fastclick_panel_) {
+	if (fastclick_panel_ != nullptr) {
 		 Point pt(fastclick_panel_->get_w() / 2, fastclick_panel_->get_h() / 2);
 		 UI::Panel * p = fastclick_panel_;
 

_______________________________________________
Mailing list: https://launchpad.net/~widelands-dev
Post to     : widelands-dev@lists.launchpad.net
Unsubscribe : https://launchpad.net/~widelands-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to