text:
« Call: "HCI Perspectives on Industry 4.0" issue of Interaction Design and Architecture(s) Journal (IxD&A)
Call: ENTER 2019: The 26th Annual eTourism Conference »
Presence for good: Changing your race in virtual reality
[I somehow missed this important story from last fall about a project that uses presence to help people experience the microaggressions that result from implicit bias, "quiet, coded moments of racial bias that shape [a black person's] worldview and sense of justice over time." The story is from Engadget, where it includes more images. For more information on the project, created through a collaboration with our colleague Jeremy Bailenson, see the 1000 Cut Journey page on the Tribeca Immersive website and coverage in VR World that includes Courtney Cogburn's TED Talk. For discussions of the broader potential of VR and presence to address social and political issues, see Wired's coverage of this and other projects at Tribeca and a new blog post at BigThink. –Matthew]
Changing your race in virtual reality
And how it reveals the hidden structure of racism.
Chris Ip
John Howard Griffin was perhaps the best-known race swapper of the 20th century.
In 1959, the white Texan writer went undercover as a black man in the Jim Crow South. Griffin spent days under a tanning lamp, took drugs for the skin pigmentation disorder vitiligo and shaved his head but otherwise spoke and acted exactly as he had as a white man. In assignments for the African-American magazine Sepia and later his acclaimed book Black Like Me, Griffin aimed to convey to white Americans what it was like to be the other. This was before Rachel Dolezal, Iggy Azalea or any of the Kardashians; blackness for him was not a cultural adornment but a target on his back.
After his transformation, Griffin was taken aback by how quickly his sense of self adjusted to a new identity. Peering in a New Orleans bathroom mirror for the first time after his temporary metamorphosis, he reflected:
"All traces of the John Griffin I had been were wiped from existence. Even the senses underwent a change so profound it filled me with distress. I looked into the mirror and saw nothing of the white John Griffin's past. No, the reflections led back to Africa, back to the shanty and the ghetto, back to the fruitless struggles against the mark of blackness. Suddenly, almost with no mental preparation, no advance hint, it became clear and permeated my whole being."
People around him flipped their behavior just as starkly. Black acquaintances who knew he was white lapsed into discussing "our struggle" with him; white women on the bus shot "hate stares" his way.
Through six weeks of travelling through Louisiana, Mississippi, Alabama and Georgia, Griffin conveyed to white people a truth that African-Americans had been saying for a long time and still holds today: People of different races in the US inhabit different realities.
Everything from police interactions to job applications can be experienced differently according to your race. As the comedian Dave Chappelle said in an interview earlier this summer, "If you had some glasses that someone could put on just to see the world how you saw the world, it'd be probably fucking terrifying."
Yet as Chappelle made those comments in a New York radio studio, it turned out Courtney Cogburn was working on something like that just uptown.
An assistant professor of social work at Columbia University, Cogburn and her team have been creating a project named 1000 Cut Journey in collaboration with Stanford's Virtual Human Interaction Lab, which is led by Jeremy Bailenson. Showcasing today for the first time at the Brown Institute for Media Innovation, the experience uses an HTC Vive virtual reality headset to put users in the body of a black man, Michael Sterling, at four different stages of his life. Titled in reference to the gruesome torture method of death by a thousand cuts, each scene in the experience is a composite of real-life stories — garnered from the media and personal accounts — that reveals the myriad ways race infiltrates one's quotidian experiences.
Essentially, it's a first-person simulation of the racism faced by a black male, for non-blacks to experience temporarily. Although tamer than Griffin's gruelling social experiment from half a century ago, its aims are similar — except it's contained entirely within a headset.
When 1000 Cut Journey starts, you're seven years old and in the first grade. You begin by looking into a mirror and, like Griffin in that Louisiana bathroom, acclimatize to your new body.
Soon, it's free time in your modern but neutral-looking California elementary school, and three kids are playing with blocks on the floor as a teacher tutors some other students in math across the room. You physically crouch to join the kids making robots and fireballs with their blocks. "Mike is the black fireball," one of them says, to giggles from the other two. "Yours would be the scariest because yours is black and black is always the scariest."
One boy starts throwing blocks at the others' models. As soon as you join in and fling a block — however tamely with your childlike hands — they stop abruptly and stare. The teacher, a white woman, stands up, arms folded.
While your character and environment are 3D models, the other humans are all live-acted, and the teacher looms over you. "Mike, look at me," she orders. "I shouldn't have to tell you not to throw things in the classroom. You're being dangerous, and you're going to hurt someone." The next scene cuts to you in the corner, in front of another mirror reminding you of your new body, while your three classmates continue to play in the distance, seemingly oblivious to your embarrassment.
You empathize with Michael's childhood innocence and feel the hot shame of being singled out for scolding by the teacher. The early demo I tried lasted only several minutes, and the simple 3D models were redolent of PlayStation 2-era graphics, but there was still a feeling of presence. There is little interactivity in the linear experience but this, too, reflects racism: the unequal treatment you receive through little choice of your own.
Most significantly, the scene revolved around the kinds of small incidents — being stereotyped as aggressive, treated unfairly — that may sound easy to dismiss in third person but when experienced first-hand in VR have a visceral impact.
"You may be affected even if you don't notice that it's happened," said Cogburn. "Even if you can't articulate to me what it was about the school scene that made you feel uncomfortable, we know what happened in the scene that may have triggered that response."
Virtual reality seems uniquely suited to revealing the hidden texture of implicit bias. In this context, the term — also called unconscious bias — refers to the subconscious reactions we have to people of other races. It's not about blatant racial epithets but subtle, socially conditioned beliefs that, for instance, black people are a greater physical threat or even feel less pain than white people. These biases often emerge in the open through the sorts of microaggressions that — because they're unintentional and don't necessarily align with an individual's professed beliefs — can easily go unnoticed by one person even as they're painfully obvious to the other.
Traditional three-act storytelling in films, books or the news homes in on specific moments of tension and drama, involving a protagonist, antagonist, conflict and resolution. Yet communicating implicit bias is less about clarifying moments of moral rightness, and more about showing the quiet, coded moments of racial bias that shape one's worldview and sense of justice over time. Virtual reality doesn't need to put a spotlight on a racial flashpoint nor list a series of facts about inequity to have an impact. By immersing you in another person's experience, you understand his hurt intuitively.
After the elementary school scene, 1000 Cut Journey places you in Michael's shoes at age 15 having his first encounter with the police; age 30, interviewing for an elite corporate job; and finally age 50, looking back at his life. (These scenes weren't yet ready in the build that I tried.) Taken as a whole, they have the potential to reflect the structure of racism: not isolated incidents but a pattern of little events that start in a child's formative years and accrete over the course of a lifetime, creating a window on the world that is fundamentally different from those in the racial majority.
Someone who has lived through experiences like a run-in with police could find revisiting them in VR disturbing. But similarly to Black Like Me, this project is made primarily for those who have lived a different life.
"What I really want is for people to come out saying, 'I thought I understood this but I don't.' [For] whites, in particular, I would like for that to be the reaction," said Cogburn. "And for blacks and perhaps other people of color who go through the experience to come out saying, 'That's it exactly.'"
Virtual reality has long been touted as a vehicle for empathy through body swapping, and crossing race barriers has been part of several projects.
Nonny de la Peña's One Dark Night reconstructs the shooting of Trayvon Martin entirely from public records and 911 calls, showing what every witness saw or didn't see. Janicza Bravo's Hard World for Small Things is a short, powerful film that places the viewer amidst a race-related accidental shooting in LA. Earlier this year, Australia's public broadcaster SBS released a VR experience of racial abuse on a bus — first from a bystander's perspective, then from the victim's.
1000 Cut Journey, however, is unique in its efforts to bridge narrative and social science. The project builds on specific research developments over the past five years in what's termed embodied cognition. One key insight from the field is precisely what the race swapping Griffin learned the hard way: When you change the body, the mind quickly follows.
In one study, white subjects were set up with a prosthetic dark-skinned hand. A researcher stroked the hand with a paintbrush while simultaneously stroking the participant's hidden real hand. The procedure took only a few minutes. Yet participants showed a drop in unconscious bias in the implicit association test, a common measurement of unconscious bias. In another experiment, brushing a white person's face with a cotton bud as he or she watched a video of a black person being brushed the same way led to subjects reporting that the black person's face looked more like their own.
"You can very easily fool the brain into thinking that a different body belongs to you," said Manos Tsakiris, a professor of psychology at Royal Holloway, University of London, who co-published these papers. "[Including] a body that has a different appearance than yours."
Subsequent studies applied these techniques to VR, putting mostly white subjects in dark-skinned bodies and seeing how their implicit bias decreased. Interestingly, the VR experiences themselves did not involve racially charged scenarios and contained no lessons on racism. Participants were simply asked to follow a tai chi instructor's movements, or play a photo description exercise, all the while conscious of their new bodies. The brain accepted its new skin and rearranged its biases and attitudes accordingly.
In contrast, an earlier study by Stanford's Bailenson explicitly asked white participants to imagine a day in the life of a black character, and then to act out a VR job interview as if they were that person. Their implicit bias ended up worse than subjects who played a white person in their interview. It's possible that instead of engendering empathy, participants relied on black stereotypes when told to imagine their world. An effective way to remove unconscious bias, it seems, is by showing not telling.
There are still open questions with this technology. How long, for instance, can a VR-induced reduction in racism last? (A 2016 study by the University of Barcelona's Mel Slater showed it could be effective after one week). What is the precise neural mechanism that takes place when we embody a different race?
The key issue, however, is whether changing attitudes in virtual reality can also change real-world behavior.
"As soon as you take off the head mounted display, you still find yourself in real reality," said Tsakiris. "This is where behavior matters. And this is where behavior has significant consequences."
The point could apply to many socially conscious virtual reality experiences, which don't get far beyond the film festival circuit or the university lab. Yet one key application could be in diversity training. The NFL has had discussions with Stanford's Virtual Human Interaction Lab in overcoming race and gender bias. Meanwhile, Alexandra Ivanovitch, founder of the nonprofit Equality Lab, is creating a series of first-person VR trainings with the Police Foundation, with hopes of bringing them to law-enforcement departments across the country. The idea is to allow police to virtually switch places with the communities that they are protecting — such as people of color — and therefore train them in racial sensitivity in a less didactic form than mandatory lectures.
"If we can actually have positive results in that type of environment, where the culture is historically not very favorable to racially sensitive programs, I think that we can make a tremendous impact across the board," said Ivanovitch. "We can make it across a whole variety of social impact areas, like schools, hospitals, court rooms."
Still, it's doubtful any virtual embodiment researcher would suggest that VR alone will end racism. The way that humans have carved into factions based on our most superficial physical traits is part of a political, economic and cultural structure that stretches generations. The point of these projects in race swapping is for people to comprehend that structure better. It's for a tech-enhanced degree of cross-cultural understanding that perhaps wasn't possible before; shortening the distance between one mind and another.
"As I see it now — and this is not just for race, this is for any number of social issues, especially in the United States — we're very individualized when we think about problems," said Cogburn.
"We blame individuals for their plights. We blame individuals because of their choices and their behaviors, and we don't think about history or policies that deliberately disadvantage particular people. It's that type of logic that I would like to shift."
Projects like 1000 Cut Journey are an illustration of how virtual embodiment can aid that shift. While virtual reality has already proved it can immerse us in fantastical narratives and games, experiences such as this show a far more socially compelling use: helping us understand the neighbors we walk past every day but hardly know. It's not using VR to escape the world, but to see it more clearly.
This entry was posted in Presence in the News. Bookmark the permalink. Trackbacks are closed, but you can post a comment.


text:
Corporate - Art's Way Mfg
GET A STOCK QUOTE INVESTOR CONFERENCE CALL
Get a Stock Quote
Listen to Latest Conference Call
Charter of the Nominating and Governance Committee
Charter of the Compensation Committee
Home > INVESTOR RELATIONS
Marc H. McConnell, Chairman of the Board, Director
Mr. McConnell is currently the President of Bauer Corporation and the Vice Chairman of McConnell Holdings, Inc., both companies owned by J. Ward McConnell, Jr. Mr. McConnell is also the Vice President of Adamson Global Technology Corporation, a subsidiary of McConnell Holdings, Inc. Mr. McConnell further serves as the Chairman of West Town Bank and Trust, located in Chicago, Illinois, and has served as a director of that bank since 2009. He has served as a director of the American Ladder Institute since 2004 and served as President from 2006-2010. Mr. McConnell was also named a director of the Farm Equipment Manufacturers Association in October 2007 and served as the Association's President from 2013 to 2014. Mr. McConnell was appointed to the Company's Board in July 2001 and served as Vice Chairman of the Board since January 2008. Mr. McConnell was named Chairman of the Board in April 2015. He is the son of our Vice Chairman and director, J. Ward McConnell, Jr., and currently resides in Kinston, North Carolina. Among other attributes, skills, and qualifications, the Board believes that Mr. McConnell's involvement and experience in the farm equipment manufacturing industry, particularly in leadership positions with similarly situated companies, contribute to his ability to understand the challenges and opportunities facing the Company and to guide its long-term strategies.
J. Ward McConnell, Jr., Vice Chairman of the Board, Director
Mr. McConnell has been a private investor for more than ten years. Mr. McConnell was a director of the Company from 1996 to 2001 and returned in 2002 to serve as Chairman of the Board. Mr. McConnell served as Chairman of the board until April 2015, when he passed the role to his son Marc H. McConnell. J. Ward McConnell, Jr. currently resides in Fort Myers, Florida. Among other attributes, skills, and qualifications, the Board believes that Mr. McConnell is uniquely qualified to serve as a director due to his extensive experience in the farm equipment manufacturing industry throughout his career.
Thomas E. Buffamante, Director
Mr. Buffamante is a Certified Public Accountant and Director of Buffamante Whipple Buttafaro, P.C., where he has been a director and stockholder of the firm since 1981. Mr. Buffamante has been a director of the Company since 2003, was appointed to our Audit Committee in 2011, and has served as the Chairman of the Audit Committee since April 2012. He currently resides in Great Valley, New York. Among other attributes, skills, and qualifications, the Board believes that Mr. Buffamante is qualified to serve as a director in light of his ability to understand generally accepted accounting principles, internal control over financial reporting, disclosure controls and procedures, his experience in analyzing and evaluating financial statements, and his ability to provide oversight with regard to tax filings, tax accruals, and other tax matters.
David R. Castle, Director
Mr. Castle is the retired Director of Operations Worldwide for Avery Weigh-Tronix, LLC. Mr. Castle also serves on the board of directors of the non-profit Peterborough Tai Chi Association. Mr. Castle previously served on the Board from 2000 through 2012, during which time he served as the Chairman of the Audit Committee and a member of the Compensation and Stock Option Committee. Mr. Castle rejoined the Board in January 2013 and currently serves as the Chairman of the Compensation and Stock Option Committee. He resides in Ontario, Canada. Among other attributes, skills, and qualifications, the Board believes that Mr. Castle's previous experience as a Director of Operations of a manufacturing company allows him to make a valuable contribution to the oversight of the Company's operations, and enables him to identify and understand trends presented in the Company's financial statements and results of operations.
Joseph R. Dancy, Director
Mr. Dancy is President of LSGI Advisors Inc., a Dallas-based investment advisory firm that specializes in investments in small publicly traded companies, many of which are in the energy and agricultural sectors. He also teaches Oil & Gas Law and Oil & Gas Environmental Law as an adjunct professor at Southern Methodist University School of Law in Dallas. He has a Metallurgical Engineering degree from Michigan Technological University, an MBA from the University of Michigan, and a Juris Doctorate from Oklahoma City University. Mr. Dancy was appointed to the Company's Audit Committee in January 2013. Among other attributes, skills, and qualifications, the Board believes Mr. Dancy will make valuable contributions as a director because his experience allows him to analyze the competitive positions of small public companies, national and global trends in the agricultural sector, as well as legal and regulatory developments that may impact the agricultural/biofuel industries.
David A. White, Director
Mr. White has been a General Partner of First Call Services LLC, a private holding company and advisory firm since May 2012. He serves on the boards of directors and chairs the audit committee for Ag Growth International Inc., a Toronto Stock Exchange farm equipment manufacturer, and Sunrise Transportation Holdings LLC, a privately-held US company. Mr. White has extensive operation and financial management experience with large manufacturing and service businesses. Mr. White has been a Canadian Charted Accountant since 1978, he holds a BA from the University of Western Ontario, an MBA from the University of Toronto and in 2013 received the ICD.D designation from the Institute of Corporate Directors.
Section 16 Filings by Officers and Directors
Read more about current and past SEC filings
Listen to the Latest Conference Calls
ART'S WAY MFG WELCOMES TERRITORY DEVELOPMENT MANAGER AND DIRECTOR OF MANUFACTURING
FOR IMMEDIATE RELEASE August 1, 2019 ART'S WAY MANUFACTURING WELCOMES TERRITORY DEVELOPMENT … READ MORE...
ART'S WAY MANUFACTURING ANNOUNCES FIRST ANNUAL DEALER DAY
Art's Way Manufacturing's First Annual Dealer Day Navigating the path through tough times in the agriculture industry, Art's Way has been working … READ MORE...
ART'S WAY MANUFACTURING ANNOUNCES FIRST QUARTER FISCAL 2019 FINANCIAL RESULTS
FOR IMMEDIATE RELEASE April 8, 2019 ART'S WAY MANUFACTURING ANNOUNCES FIRST QUARTER FISCAL 2019 FINANCIAL RESULTS ARMSTRONG, IOWA, April 8, … READ MORE...
To deliver high-quality, market responsive products and services which will exceed customer expectations and maximize shareholder value.
Art's Way Manufacturing Company, Inc.
Find stock information on NASDAQ: ARTW
Armstrong, IA 50514
Copyright © 2020 · Artsway on Genesis Framework · WordPress · Log in

redpajama_set_name: RedPajamaCommonCrawl


In the recent blockbuster film, "Star Wars: The Last Jedi," Jedi Master Yoda tells Luke Skywalker, "The greatest teacher, failure is." There's nothing at all counterintuitive about what our little green friend said – some of the greatest lessons in life come from making mistakes and learning how to do better.
The most important takeaway therefore is that we shouldn't be excessively disparaging mistakes or failure, especially among young students who are still learning the ways of the world. Indeed, problem-solving and analytical thinking – two important skills that will be essential for the future workforce – are founded on past mistakes quickly being identified and learned from.
Rather, we should be cultivating an environment that allows them to make mistakes safely and without summary judgement, and lets them learn from them.
At Swiss International School Dubai, we strive to cultivate such an environment, not only in our curriculum but in daily boarding school life as well. We provide a brand of pastoral care that realizes the value of mistakes and helps students think about them, rather than disciplining them arbitrarily. Students are taught not to be afraid of mistakes, and indeed should work together to take risks, learn from failure, and grow in the process.
We invited Mr. Garry James, our Head of Boys' Boarding and Teacher of MYP Physical Health Education, to provide an anecdote about failure and learning from it.
Why mistakes must be cultivated and learned from and seen as a positive learning opportunity!
This reminds me of a fantastic speech I once heard in my youth, when playing rugby in Wales and while watching the British and Irish Lions tour of South Africa in June 1997. There was a coach on this tour, talking passionately with his players, helping to inspire them toward future success. He struck a cord with me, which has become a fundamental core value that has remained with me ever since.
Life is indeed a journey, full of twists and turns, and highs and lows. The true challenge is not always obvious, but in truth, it is the manner in which we respond to challenging times. A principle that I speak with my students about is this, 'Making mistakes should not be seen as a negative, but a fantastic learning opportunity'. The true challenge is to make sure that we learn from these mistakes and then endeavour to become better and wiser individuals from the experience. The true injustice is to allow these mistakes to rule our lives and allow them to happen once again, and then they should no longer be seen as a mistake, but a conscious choice.
Only by holding a positive approach to life and by embracing our mistakes and seeing then as a fantastic leaning opportunity can we truly grow to become better and more successful individuals. Though, we must also remember that no individual can be successful on their own; but by working together collaboratively, taking risks, talking and listening to others can true success be achieved.


Click "Allow" to play Super Villain Smash Out! Click "Always allow" to play Super Villain Smash Out!
Join another mission with Kim Possible in the Super Villain Smash Out game!
In this classic paddle/ball/goal game, you need to use your paddle to knock the ball away from your goal. Both sides need to defend their own goals as better as they can. But the fun is always in the middle.
The middle of the court is filled with brick walls. Those brick walls hide various icons that bring you many perks during the match. The figures can send you bonus points, or different boosts that you can use to your advantage. Such an example would be the rocket-launcher which helps you to rocket launch your ball straight into the opponent's goal. The icons can also contain negative boosts, such as freezers which will freeze your paddle from moving.
Shrinking or expanding your goal can be good or extremely bad. It really depends on what symbols you collect. There is a list of all the icons in "How to play" section of the game, so feel free to read through the instructions and memorize all the figures and the perks they hold. This way, you'll be able to avoid the ones you don't need and pick up the ones you wish for.
After some time of playing, all the bricks will be gone, and you'll be left alone with your opponent. Your primary objective is to score three goals before your opponent does. That way you'll pass onto the next level, and each new level will bring more fun, and it'll be more difficult than the last. Try not to score into your own goal because that will give your opponent a much easier task of beating you in this game.


text:
Buckower Kleinbahn – normalnotorowa (pierwotnie wąskotorowa) kolej muzealna (pierwotnie publiczna) w Niemczech (Brandenburgia, Szwajcaria Marchijska), łącząca stację Müncheberg na Kolei Wschodniej z miejscowością Buckow. Ma długość 4,9 km.

Historia
Kolej powstała w 1897 jako wąskotorowa ze stacji Dahmsdorf-Müncheberg (obecnie Müncheberg) do Buckow. W 1906, mniej więcej w połowie trasy, zbudowano przystanek Waldsieversdorf. W maju 1930 linia została przekuta na normalnotorową i zelektryfikowana prądem stałym o napięciu 800 woltów (w 1980, po przebudowie taboru, napięcie zostało obniżone do 600 woltów). W 1945, z uwagi na zniszczenia w walkach o Berlin, ruch został wstrzymany. Ponownie uruchomiono go w 1946 trakcją parową, a w 1947 przywrócono trakcję elektryczną. W 1965 wstrzymano na linii ruch towarowy. W 1981 odnowiono tabor, a w 1992 powstało Stowarzyszenie Kolejowe Szwajcarii Marchijskiej. Jego celem było utrzymanie ruchu i stworzenie muzeum kolejowego. Od 23 maja 1993 zastąpiono pojazdy elektryczne spalinowymi. W 1998 Deutsche Bahn wstrzymały na trasie ruch osobowy. , które zajęło się pozyskiwaniem środków na wznowienie ruchu. W 2000 rozpoczęto prace renowacyjne, a w 2002 ponownie uruchomiono przewozy, już w formie kolei muzealnej.

Trasa
Trasa kolei przechodzi przez tereny obfite w lasy i jeziora, a przy tym pofałdowane (polodowcowy Płaskowyż Barnimski), co decyduje o jej atrakcyjności turystycznej.

Kolejne stacje na linii to (poczynając od linii Kolei Wschodniej): Müncheberg, Waldsieversdorf, Buckow.

Tabor
Obecnie w ruchu pozostaje następujący tabor:
 3 x ET 479.6 i ES 879.6 (ehm. ET/ES 279.0 /188.5),
 1 x Kö – 98 80 3 310 634-5 D-MBBKB – 100 634-5 Lok 1,
 1 x V 22 – 98 80 3 312 047-4 D-MBBKB Lok 3,
 2 x EL 4 Lok 14 oraz 15 (wypożyczony na stałe ze Strausberger Eisenbahn),
 1 x BDe 4/4 ex.

Ponadto pojazdami technicznymi są:
 1 x SKL 24,
 1 x SKL 25,
 wózek z 1908.

Galeria

Przypisy

Linie kolejowe w Niemczech
Transport w Brandenburgii

redpajama_set_name: RedPajamaWikipedia


Professional mapper, Rui Antunes, 50 years old, is the COC technical director. He practiced football and snooker and started running orienteering in 1978. He was Armed Forces' Elite champion and national champion in every veteran class under 50. He participated 4 times in the CISM and 4 in WMOC. He won the Martin Kronlund Trophy in Spain and competed in several other countries, with particular reference to Sweden and France (disputed 4 times the 5 Days).
You have planned the courses in the Final Long Pedrógão (map of Luis Sergio). Did you felt, in terms of demand, any difference regarding previous work in this area?
None. After mapping, planning courses is one of the things that give me more pleasure. I always try to give to others the challenges that would please me mostly, both in technical and physical difficulty.
Considering the likely high temperature, how many refreshments there will be in the Final Long?
You drew the maps of the 2 Qualifying races in Pataias. And you have great experience in mapping the area of pinewood. What advice would you give, in terms of navigation, to whom has never been in this terrain?
In addition to these approximately 12 km2 in Pataias, I only had to draw from the root the Paredes map of 1 km2. But I had reviewed the entire map of Pedreanes, about 15 km2, and the whole map of Facho, around 17km2. I also did, a little further north, the maps of Quiaios and Lavos Coast, about 13 km2, and the map of South Quiaios, 4 km2 (with the help of another mapper). They are also maps of dunes and, hence, similar to the pine forest of Leiria. The advice that I would give is to use the techniques that I use in this type of terrain: a lot of navigation based on compass and permanent map reading. The smallest error kills any chance of reaching the first places.
How many maps have you made so far and how much area have you mapped?
I have mapped around 50 maps in a total area of approximately 250 km2.
The recognition of your quality has led you to mapping in Spain. Do you have plans for other work abroad?
It's true. I did some maps in Spain (Saldes, Vic - Montañia, Girona, Onil, Santiago de Compostela). And I have contacts for other work, yes.
What are the most difficult maps where you have run abroad?
What is the most rewarding experience as orienteering athlete?
Having shared the Nature during all these years, practicing a sport that I love. Even now, when I speak passionately of orienteering to certain people, I just feel chills of happiness. And, having managed to combine the sport with my current job, I can say that I am almost fulfilled.


UPDATE — Tickets for the Bullpen Balcony are now SOLD OUT. Season tickets in other sections are still available for purchase HERE!
CLEMSON, S.C. – Season tickets are now available for IPTAY members in the new Bullpen Balcony area at Doug Kingsmore Stadium for the 2016 Baseball season. This new seating area of Doug Kingsmore Stadium offers a unique perspective for the baseball fan who wants to be on top of the action. Fans can enjoy a tremendous vantage point seated in their high top chairs along a drink rail between the Tigers dugout and bullpen. Seats are limited and priced at $250.
IPTAY members have the first opportunity to purchase. The deadline for priority seating is Wednesday.
Tickets may be purchased online by clicking HERE to sign in with your IPTAY number or by calling the Clemson athletic ticket office at 1-800-CLEMSON.


In Matthew 13, Jesus tells a powerful parable.
A man sows good seeds in a field.
An enemy comes and sows bad seeds among the good seeds.
While the good seeds grow into wheat, the bad seeds become weeds and grows among the wheat.
The man sowing the good seeds is Jesus Himself.
The enemy who comes later to sow the bad seeds is satan.
The good seeds, sown by Jesus, grow to become wheat, representing the followers of Jesus and His kingdom.
The bad seeds that come later (600 years later?) represent the followers of satan.
The weeds will even claim to love the Sower of the good seeds more than the wheat themselves and seek to associate themselves with Him.
Weeds grow fast, so it is no surprise that they will claim they are the fastest growing.
In the 19th century, a man by the name of Joseph Smith saw a vision. An angel appeared to him and gave him instructions to start a new religion because all the previous religions were corrupted.
He received revelation for a new book, Book of Mormon, to replace all previous revelations.
Joseph Smith declared himself to be the last prophet in the line of Moses and Elijah.
Today, the religion he started, Mormonism, is the fastest growing religion in America with close to 16,000,000 followers (2014) and expected to rise to 250,000,000 by 2080.
Muslims all over the world will laugh at Joseph Smith and his so-called religion!
Because Islam came earlier and already made all these claims. Joseph Smith is just an impostor and a liar.
According to Muslim beliefs, Muhammad is the seal and the last prophet. The Quran is the final revelation for all man since the earlier revelations were corrupt and Islam is the true religion. And just because Mormonism is the fastest growing religion in America, does not mean that it is true. Joseph Smith is just an impostor and a liar.
Using a parable Jesus said that he was the last.
But is there anyone to come after Jesus? Someone asked Him this very question.
Jesus gives the answer by offering evidence of what He was doing and speaking, confirming that there was no other prophet coming after Him.
Well, the Bible says that the message revealed in it is forever. Isaiah 40:8 The Word of our God endures forever.
Does the Bible claim that Christianity is the true religion?
In Matthew 13:24-29 & 36-43: Jesus tells us a parable and explains that The People of The Kingdom (true Christians) have been sowed like good seeds into the world by Him .
But at the end of the age….when Jesus comes back…..the "weeds" will be plucked out and thrown into fire!
So what does the Bible say about religions, prophets, books that come after Christianity?
It's Ramadhan. Muslims all over the world fast. Some muslims will say that even Jesus fasted, so they are better followers of Jesus than Christians. Really?
You muslims announce to the whole world that you are fasting and you are proud of it. Jesus calls such people hypocrites. Your fasting brings you no reward.
Most muslims do not even know that Christians also fast because Christians do not shout it out to world. It is between God and the individual. You dont even know when and why Christians fast, do you?
Why do muslims fast? Because you MUST. It's a command. In some muslim countries, if you don't fast you will be punished, so you do it out of FEAR.
Why do Christians fast? Not because they have to. Christians fast because they want to. They do it, not out of fear, but out of love and devotion to God and to draw near to Him.
Think about why you are fasting. Are you sure you're doing it for God or are you doing it so that others will see you fasting and you'd feel proud when they congratulate you for being a good muslim.
I was reading today about King Solomon in 2 Chronicles 2. Yes, Nabi Sulaiman, whom our friends say was a Muslim prophet.
In this passage, Solomon is preparing to build a Temple to honor the Name of the Lord (Yahweh). (2 Chr 2:1). Since you say Sulaiman was a muslim, this temple was for Allah, correct?
Does this describe Islam? Was this how Sulaiman, the Muslim prophet, practised Islam? What is the significance of the sacrificial bread or the daily burnt offerings or Sabbath in Islam? Was all this done for Allah? That does not sound like Islam to me. If it was, when did Allah decide to change the requirements of your religion? Not only that. He commanded Israel to do this forever.
To answer this, Muslims claim that the Jews have been abandoned in favor of Arabs.
In 1 Kings 6:11-13, The LORD Yahweh speaks directly to Solomon (not though an intermediary or angel) and He says to Solomon, "I will never abandon My people Israel." Why would Allah speak such a message to a Muslim prophet directly? And then 1600 years later, speak indirectly to another Muslim prophet that all Jews are pigs. God said He would NEVER abandon Israel. But He changed His mind?
Here is how Solomon prayed.
"Then Solomon stood before the altar of the Lord in front of the entire community of Israel. He LIFTED his hands toward heaven, and he prayed, (1 Kings 8:22-23). Also, in verse 54, it says Solomon…KNEELED with his hands RAISED toward heaven.
Is this how Muslims pray? Sulaiman apparently kneeled down and lifted his hands toward heaven when he prayed. Did Allah change the way Muslims pray today? When? Can you show in the Quran where He gave Muslims a new way to pray from the time of Sulaiman?
And finally, this is the scenario of the worship that took place in Temple of Solomon.
Are these "Muslims" worshipping Allah? Musicians, musical instruments, singers? Is this how you worship Allah today in your mosques? By singing and by using musical instruments? When did Allah give new instructions to abandon singing and music during worship?


Our client purchased a classic 1930's brick Georgian home in Brookline, Mass. and undertook a full home renovation to add living space, repurpose rooms, and create an elegant Art Deco interior. Our landscape design goal for this nearly 2-acre property was to impart the feeling of a mature, European-style formal garden.
We worked closely with our client to achieve several imperatives including privacy, showcasing the architecture of the home, and integrating a garden design that would provide a continuous show of seasonally blooming shrubs and perennials.
To achieve the client's vision, we screened the property with large evergreen trees and shrubs such as Daphnes and many native shrub varieties including Inkberry bushes, Oakleaf Hydrangeas, and Catawba Rhododendrons. Our landscape design featured layered garden beds incorporating several sizes of boxwoods, hydrangeas with varied leaf forms and blooms, along with a continuous display of perennials that bloom in the spring, summer and fall for a three season show.


text:
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/ozone/platform/wayland/host/wayland_window.h"

#include <aura-shell-client-protocol.h>
#include <stdint.h>
#include <wayland-cursor.h>

#include <memory>
#include <utility>

#include "base/bind.h"
#include "base/memory/scoped_refptr.h"
#include "base/notreached.h"
#include "base/ranges/algorithm.h"
#include "base/run_loop.h"
#include "base/task/single_thread_task_runner.h"
#include "build/chromeos_buildflags.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/mojom/cursor_type.mojom.h"
#include "ui/base/cursor/platform_cursor.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/events/event.h"
#include "ui/events/event_target_iterator.h"
#include "ui/events/event_utils.h"
#include "ui/events/ozone/events_ozone.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/overlay_priority_hint.h"
#include "ui/ozone/common/bitmap_cursor.h"
#include "ui/ozone/common/features.h"
#include "ui/ozone/platform/wayland/common/wayland_overlay_config.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_data_drag_controller.h"
#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_frame_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_output.h"
#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_screen.h"
#include "ui/ozone/platform/wayland/host/wayland_subsurface.h"
#include "ui/ozone/platform/wayland/host/wayland_surface.h"
#include "ui/ozone/platform/wayland/host/wayland_zaura_shell.h"
#include "ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h"
#include "ui/ozone/platform/wayland/mojom/wayland_overlay_config.mojom.h"
#include "ui/platform_window/common/platform_window_defaults.h"
#include "ui/platform_window/wm/wm_drag_handler.h"
#include "ui/platform_window/wm/wm_drop_handler.h"

namespace ui {
namespace {

using mojom::CursorType;
using mojom::DragOperation;

bool OverlayStackOrderCompare(const wl::WaylandOverlayConfig& i,
                              const wl::WaylandOverlayConfig& j) {
  return i.z_order < j.z_order;
}

}  // namespace

WaylandWindow::WaylandWindow(PlatformWindowDelegate* delegate,
                             WaylandConnection* connection)
    : delegate_(delegate),
      connection_(connection),
      frame_manager_(std::make_unique<WaylandFrameManager>(this, connection)),
      wayland_overlay_delegation_enabled_(connection->viewporter() &&
                                          IsWaylandOverlayDelegationEnabled()),
      accelerated_widget_(
          connection->wayland_window_manager()->AllocateAcceleratedWidget()),
      ui_task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()) {
  // Set a class property key, which allows |this| to be used for drag action.
  SetWmDragHandler(this, this);
}

WaylandWindow::~WaylandWindow() {
  CHECK(ui_task_runner_->BelongsToCurrentThread());
  shutting_down_ = true;

  PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);

  if (wayland_overlay_delegation_enabled_) {
    connection_->wayland_window_manager()->RemoveSubsurface(
        GetWidget(), primary_subsurface_.get());
  }
  for (const auto& widget_subsurface : wayland_subsurfaces()) {
    connection_->wayland_window_manager()->RemoveSubsurface(
        GetWidget(), widget_subsurface.get());
  }
  if (root_surface_)
    connection_->wayland_window_manager()->RemoveWindow(GetWidget());

  // This might have already been hidden and another window has been shown.
  // Thus, the parent will have another child window. Do not reset it.
  if (parent_window_ && parent_window_->child_window() == this)
    parent_window_->set_child_window(nullptr);

  if (child_window_)
    child_window_->set_parent_window(nullptr);
}

void WaylandWindow::OnWindowLostCapture() {
  delegate_->OnLostCapture();
}

void WaylandWindow::UpdateWindowScale(bool update_bounds) {
  DCHECK(connection_->wayland_output_manager());

  const auto* output_manager = connection_->wayland_output_manager();
  auto preferred_outputs_id = GetPreferredEnteredOutputId();
  if (!preferred_outputs_id.has_value()) {
    // If no output was entered yet, use primary output. This is similar to what
    // PlatformScreen implementation is expected to return to higher layer.
    auto* primary_output = output_manager->GetPrimaryOutput();
    // Primary output is unknown. i.e: WaylandScreen was not created yet.
    if (!primary_output)
      return;
    preferred_outputs_id = primary_output->output_id();
  }

  auto* output = output_manager->GetOutput(preferred_outputs_id.value());
  // There can be a race between sending leave output event and destroying
  // wl_outputs. Thus, explicitly check if the output exist.
  if (!output)
    return;

  float new_scale = output->scale_factor();
  ui_scale_ = output->GetUIScaleFactor();

  if (SetWindowScale(new_scale))
    delegate_->OnBoundsChanged({true});

  // Propagate update to the child windows
  if (child_window_)
    child_window_->UpdateWindowScale(update_bounds);
}

gfx::AcceleratedWidget WaylandWindow::GetWidget() const {
  return accelerated_widget_;
}

bool WaylandWindow::SetWindowScale(float new_scale) {
  DCHECK_GE(new_scale, 0.f);
  bool changed = window_scale_ != new_scale;
  window_scale_ = new_scale;
  size_px_ = gfx::ScaleToEnclosingRect(bounds_dip_, new_scale).size();
  return changed;
}

absl::optional<WaylandOutput::Id> WaylandWindow::GetPreferredEnteredOutputId() {
  // Child windows don't store entered outputs. Instead, take the window's
  // root parent window and use its preferred output.
  if (parent_window_)
    return GetRootParentWindow()->GetPreferredEnteredOutputId();

  // It can be either a toplevel window that hasn't entered any outputs yet, or
  // still a non toplevel window that doesn't have a parent (for example, a
  // wl_surface that is being dragged).
  if (root_surface_->entered_outputs().empty())
    return absl::nullopt;

  // PlatformWindowType::kPopup are created as toplevel windows as well.
  DCHECK(type() == PlatformWindowType::kWindow ||
         type() == PlatformWindowType::kPopup);

  WaylandOutput::Id preferred_id = root_surface_->entered_outputs().front();
  const auto* output_manager = connection_->wayland_output_manager();

  // A window can be located on two or more displays. Thus, return the id of the
  // output that has the biggest scale factor. Otherwise, use the very first one
  // that was entered. This way, we can be sure that the contents of the Window
  // are rendered at correct dpi when a user moves the window between displays.
  for (WaylandOutput::Id output_id : root_surface_->entered_outputs()) {
    auto* output = output_manager->GetOutput(output_id);
    auto* preferred_output = output_manager->GetOutput(preferred_id);
    // The compositor may have told the surface to enter the output that the
    // client is not aware of.  In such an event, we cannot evaluate scales, and
    // can only return the default, which means falling back to the primary
    // display in the code that calls this. DCHECKS below are kept for trying to
    // catch the situation in developer's builds and find the way to reproduce
    // the issue. See crbug.com/1323635.
    DCHECK(output) << " output " << output_id << " not found!";
    DCHECK(preferred_output) << " output " << preferred_id << " not found!";
    if (!output || !preferred_output)
      return absl::nullopt;

    if (output->scale_factor() > preferred_output->scale_factor())
      preferred_id = output_id;
  }

  return preferred_id;
}

void WaylandWindow::OnPointerFocusChanged(bool focused) {
  // Whenever the window gets the pointer focus back, the cursor shape must be
  // updated. Otherwise, it is invalidated upon wl_pointer::leave and is not
  // restored by the Wayland compositor.
  if (focused && cursor_)
    UpdateCursorShape(cursor_);
}

bool WaylandWindow::HasPointerFocus() const {
  return this == connection_->wayland_window_manager()
                     ->GetCurrentPointerFocusedWindow();
}

bool WaylandWindow::HasKeyboardFocus() const {
  return this == connection_->wayland_window_manager()
                     ->GetCurrentKeyboardFocusedWindow();
}

void WaylandWindow::RemoveEnteredOutput(uint32_t output_id) {
  root_surface_->RemoveEnteredOutput(output_id);
}

bool WaylandWindow::StartDrag(
    const ui::OSExchangeData& data,
    int operations,
    mojom::DragEventSource source,
    gfx::NativeCursor cursor,
    bool can_grab_pointer,
    WmDragHandler::DragFinishedCallback drag_finished_callback,
    WmDragHandler::LocationDelegate* location_delegate) {
  if (!connection_->data_drag_controller()->StartSession(data, operations,
                                                         source)) {
    return false;
  }

  DCHECK(drag_finished_callback_.is_null());
  drag_finished_callback_ = std::move(drag_finished_callback);

  base::RunLoop drag_loop(base::RunLoop::Type::kNestableTasksAllowed);
  drag_loop_quit_closure_ = drag_loop.QuitClosure();

  auto alive = weak_ptr_factory_.GetWeakPtr();
  drag_loop.Run();
  if (!alive)
    return false;
  return true;
}

void WaylandWindow::UpdateDragImage(const gfx::ImageSkia& image,
                                    const gfx::Vector2d& offset) {
  if (connection_->data_drag_controller()->state() !=
      WaylandDataDragController::State::kIdle)
    connection_->data_drag_controller()->UpdateDragImage(image, offset);
}

void WaylandWindow::CancelDrag() {
  if (drag_loop_quit_closure_.is_null())
    return;
  std::move(drag_loop_quit_closure_).Run();
}

void WaylandWindow::Show(bool inactive) {
  frame_manager_->MaybeProcessPendingFrame();
}

void WaylandWindow::Hide() {
  received_configure_event_ = false;

  // Mutter compositor crashes if we don't remove subsurface roles when hiding.
  if (primary_subsurface_) {
    primary_subsurface()->Hide();
  }
  for (auto& subsurface : wayland_subsurfaces_) {
    subsurface->Hide();
  }
  frame_manager_->Hide();
}

void WaylandWindow::OnChannelDestroyed() {
  frame_manager_->ClearStates();
  base::circular_deque<std::pair<WaylandSubsurface*, wl::WaylandOverlayConfig>>
      subsurfaces_to_overlays;
  subsurfaces_to_overlays.reserve(wayland_subsurfaces_.size() +
                                  (primary_subsurface() ? 1 : 0));
  if (primary_subsurface())
    subsurfaces_to_overlays.emplace_back(primary_subsurface(),
                                         wl::WaylandOverlayConfig());
  for (auto& subsurface : wayland_subsurfaces_)
    subsurfaces_to_overlays.emplace_back(subsurface.get(),
                                         wl::WaylandOverlayConfig());

  frame_manager_->RecordFrame(
      std::make_unique<WaylandFrame>(root_surface(), wl::WaylandOverlayConfig(),
                                     std::move(subsurfaces_to_overlays)));
}

void WaylandWindow::SetAuraSurface(zaura_surface* aura_surface) {
  DCHECK(connection()->zaura_shell());
  DCHECK_NE(aura_surface_.get(), aura_surface);
  aura_surface_.reset(aura_surface);
}

bool WaylandWindow::IsSupportedOnAuraSurface(uint32_t version) const {
  return aura_surface_ &&
         zaura_surface_get_version(aura_surface_.get()) >= version;
}

void WaylandWindow::Close() {
  delegate_->OnClosed();
}

bool WaylandWindow::IsVisible() const {
  NOTREACHED();
  return false;
}

void WaylandWindow::PrepareForShutdown() {
  if (drag_finished_callback_)
    OnDragSessionClose(DragOperation::kNone);
}

void WaylandWindow::SetBoundsInPixels(const gfx::Rect& bounds_px) {
  // TODO(crbug.com/1306688): This is currently used only by unit tests.
  // Figure out how to migrate to test only methods.
  auto bounds_dip = delegate_->ConvertRectToDIP(bounds_px);
  SetBoundsInDIP(bounds_dip);
}

gfx::Rect WaylandWindow::GetBoundsInPixels() const {
  // TODO(crbug.com/1306688): This is currently used only by unit tests.
  // Figure out how to migrate to test only methods.
  return delegate_->ConvertRectToPixels(bounds_dip_);
}

void WaylandWindow::SetBoundsInDIP(const gfx::Rect& bounds_dip) {
  UpdateBoundsInDIP(bounds_dip);
}

gfx::Rect WaylandWindow::GetBoundsInDIP() const {
  return bounds_dip_;
}

void WaylandWindow::OnSurfaceConfigureEvent() {
  if (received_configure_event_)
    return;
  received_configure_event_ = true;
  frame_manager_->MaybeProcessPendingFrame();
}

void WaylandWindow::SetTitle(const std::u16string& title) {}

void WaylandWindow::SetCapture() {
  // Wayland doesn't allow explicit grabs. Instead, it sends events to "entered"
  // windows. That is, if user enters their mouse pointer to a window, that
  // window starts to receive events. However, Chromium may want to reroute
  // these events to another window. In this case, tell the window manager that
  // this specific window has grabbed the events, and they will be rerouted in
  // WaylandWindow::DispatchEvent method.
  if (!HasCapture())
    connection_->wayland_window_manager()->GrabLocatedEvents(this);
}

void WaylandWindow::ReleaseCapture() {
  if (HasCapture())
    connection_->wayland_window_manager()->UngrabLocatedEvents(this);
  // See comment in SetCapture() for details on wayland and grabs.
}

bool WaylandWindow::HasCapture() const {
  return connection_->wayland_window_manager()->located_events_grabber() ==
         this;
}

void WaylandWindow::ToggleFullscreen() {}

void WaylandWindow::Maximize() {}

void WaylandWindow::Minimize() {}

void WaylandWindow::Restore() {}

PlatformWindowState WaylandWindow::GetPlatformWindowState() const {
  // Remove normal state for all the other types of windows as it's only the
  // WaylandToplevelWindow that supports state changes.
  return PlatformWindowState::kNormal;
}

void WaylandWindow::Activate() {}

void WaylandWindow::Deactivate() {
  NOTIMPLEMENTED_LOG_ONCE();
}

void WaylandWindow::SetUseNativeFrame(bool use_native_frame) {
  // Do nothing here since only shell surfaces can handle server-side
  // decoration.
}

bool WaylandWindow::ShouldUseNativeFrame() const {
  // Always returns false here since only shell surfaces can handle server-side
  // decoration.
  return false;
}

void WaylandWindow::SetCursor(scoped_refptr<PlatformCursor> platform_cursor) {
  DCHECK(platform_cursor);

  if (cursor_ == platform_cursor)
    return;

  UpdateCursorShape(BitmapCursor::FromPlatformCursor(platform_cursor));
}

void WaylandWindow::MoveCursorTo(const gfx::Point& location) {
  NOTIMPLEMENTED();
}

void WaylandWindow::ConfineCursorToBounds(const gfx::Rect& bounds) {
  NOTIMPLEMENTED();
}

void WaylandWindow::SetRestoredBoundsInDIP(const gfx::Rect& bounds) {
  restored_size_dip_ = bounds.size();
}

gfx::Rect WaylandWindow::GetRestoredBoundsInDIP() const {
  return gfx::Rect(restored_size_dip_);
}

bool WaylandWindow::ShouldWindowContentsBeTransparent() const {
  // Wayland compositors always support translucency.
  return true;
}

void WaylandWindow::SetAspectRatio(const gfx::SizeF& aspect_ratio) {
  NOTIMPLEMENTED_LOG_ONCE();
}

bool WaylandWindow::IsTranslucentWindowOpacitySupported() const {
  // Wayland compositors always support translucency.
  return true;
}

void WaylandWindow::SetDecorationInsets(const gfx::Insets* insets_px) {
  if ((!frame_insets_px_ && !insets_px) ||
      (frame_insets_px_ && insets_px && *frame_insets_px_ == *insets_px)) {
    return;
  }
  if (insets_px)
    frame_insets_px_ = *insets_px;
  else
    frame_insets_px_ = absl::nullopt;
  UpdateDecorations();
  connection_->Flush();
}

void WaylandWindow::SetWindowIcons(const gfx::ImageSkia& window_icon,
                                   const gfx::ImageSkia& app_icon) {
  NOTIMPLEMENTED_LOG_ONCE();
}

void WaylandWindow::SizeConstraintsChanged() {}

bool WaylandWindow::ShouldUpdateWindowShape() const {
  return false;
}

bool WaylandWindow::CanDispatchEvent(const PlatformEvent& event) {
  return CanAcceptEvent(*event);
}

uint32_t WaylandWindow::DispatchEvent(const PlatformEvent& native_event) {
  Event* event = static_cast<Event*>(native_event);

  if (event->IsLocatedEvent()) {
    auto* event_grabber =
        connection_->wayland_window_manager()->located_events_grabber();
    auto* root_parent_window = GetRootParentWindow();

    // We must reroute the events to the event grabber iff these windows belong
    // to the same root parent window. For example, there are 2 top level
    // Wayland windows. One of them (window_1) has a child menu window that is
    // the event grabber. If the mouse is moved over the window_1, it must
    // reroute the events to the event grabber. If the mouse is moved over the
    // window_2, the events mustn't be rerouted, because that belongs to another
    // stack of windows. Remember that Wayland sends local surface coordinates,
    // and continuing rerouting all the events may result in events sent to the
    // grabber even though the mouse is over another root window.
    //
    bool send_to_grabber =
        event_grabber &&
        root_parent_window == event_grabber->GetRootParentWindow();
    if (send_to_grabber) {
      WaylandEventSource::ConvertEventToTarget(event_grabber,
                                               event->AsLocatedEvent());
      Event::DispatcherApi(event).set_target(event_grabber);
    }

    // Wayland sends locations in DIP but dispatch code expects pixels, so they
    // need to be translated to physical pixels.
    event->AsLocatedEvent()->set_location_f(gfx::ScalePoint(
        event->AsLocatedEvent()->location_f(), window_scale(), window_scale()));

    if (send_to_grabber) {
      event_grabber->DispatchEventToDelegate(event);
      // The event should be handled by the grabber, so don't send to next
      // dispacher.
      return POST_DISPATCH_STOP_PROPAGATION;
    }
  }

  // Dispatch all keyboard events to the root window.
  if (event->IsKeyEvent())
    return GetRootParentWindow()->DispatchEventToDelegate(event);

  return DispatchEventToDelegate(event);
}

// EventTarget:
bool WaylandWindow::CanAcceptEvent(const Event& event) {
#if DCHECK_IS_ON()
  if (!disable_null_target_dcheck_for_test_)
    DCHECK(event.target());
#endif
  return this == event.target();
}

EventTarget* WaylandWindow::GetParentTarget() {
  return nullptr;
}

std::unique_ptr<EventTargetIterator> WaylandWindow::GetChildIterator() const {
  NOTREACHED();
  return nullptr;
}

EventTargeter* WaylandWindow::GetEventTargeter() {
  return nullptr;
}

void WaylandWindow::HandleSurfaceConfigure(uint32_t serial) {
  NOTREACHED()
      << "Only shell surfaces must receive HandleSurfaceConfigure calls.";
}

void WaylandWindow::HandleToplevelConfigure(int32_t widht,
                                            int32_t height,
                                            const WindowStates& window_states) {
  NOTREACHED()
      << "Only shell toplevels must receive HandleToplevelConfigure calls.";
}

void WaylandWindow::HandleAuraToplevelConfigure(
    int32_t x,
    int32_t y,
    int32_t width,
    int32_t height,
    const WindowStates& window_states) {
  NOTREACHED()
      << "Only shell toplevels must receive HandleAuraToplevelConfigure calls.";
}

void WaylandWindow::HandlePopupConfigure(const gfx::Rect& bounds_dip) {
  NOTREACHED() << "Only shell popups must receive HandlePopupConfigure calls.";
}

void WaylandWindow::UpdateVisualSize(const gfx::Size& size_px) {
  if (visual_size_px_ == size_px)
    return;
  visual_size_px_ = size_px;
  UpdateWindowMask();

  if (apply_pending_state_on_update_visual_size_for_testing_) {
    root_surface_->ApplyPendingState();
    connection_->Flush();
  }
}

void WaylandWindow::OnCloseRequest() {
  delegate_->OnCloseRequest();
}

void WaylandWindow::OnDragEnter(const gfx::PointF& point,
                                std::unique_ptr<OSExchangeData> data,
                                int operation) {
  WmDropHandler* drop_handler = GetWmDropHandler(*this);
  if (!drop_handler)
    return;

  // TODO(crbug.com/1102857): get the real event modifier here.
  drop_handler->OnDragEnter(point, std::move(data), operation,
                            /*modifiers=*/0);
}

int WaylandWindow::OnDragMotion(const gfx::PointF& point, int operation) {
  WmDropHandler* drop_handler = GetWmDropHandler(*this);
  if (!drop_handler)
    return 0;

  // TODO(crbug.com/1102857): get the real event modifier here.
  return drop_handler->OnDragMotion(point, operation,
                                    /*modifiers=*/0);
}

void WaylandWindow::OnDragDrop() {
  WmDropHandler* drop_handler = GetWmDropHandler(*this);
  if (!drop_handler)
    return;
  // TODO(crbug.com/1102857): get the real event modifier here.
  drop_handler->OnDragDrop({}, /*modifiers=*/0);
}

void WaylandWindow::OnDragLeave() {
  WmDropHandler* drop_handler = GetWmDropHandler(*this);
  if (!drop_handler)
    return;
  drop_handler->OnDragLeave();
}

void WaylandWindow::OnDragSessionClose(DragOperation operation) {
  DCHECK(drag_finished_callback_);
  std::move(drag_finished_callback_).Run(operation);
  connection()->event_source()->ResetPointerFlags();
  std::move(drag_loop_quit_closure_).Run();
}

void WaylandWindow::UpdateBoundsInDIP(const gfx::Rect& bounds_dip) {
  gfx::Rect adjusted_bounds_dip = AdjustBoundsToConstraintsDIP(bounds_dip);
  if (bounds_dip_ == adjusted_bounds_dip)
    return;
  bool origin_changed = bounds_dip_.origin() != bounds_dip.origin();
  bounds_dip_ = adjusted_bounds_dip;
  size_px_ = delegate_->ConvertRectToPixels(bounds_dip).size();

  if (update_visual_size_immediately_for_testing_)
    UpdateVisualSize(size_px());
  delegate_->OnBoundsChanged({origin_changed});
}

bool WaylandWindow::Initialize(PlatformWindowInitProperties properties) {
  root_surface_ = std::make_unique<WaylandSurface>(connection_, this);
  if (!root_surface_->Initialize()) {
    LOG(ERROR) << "Failed to create wl_surface";
    return false;
  }

  if (properties.inhibit_keyboard_shortcuts)
    root_surface_->InhibitKeyboardShortcuts();

  // Update visual size in tests immediately if the test config is set.
  // Otherwise, such tests as interactive_ui_tests fail.
  if (!update_visual_size_immediately_for_testing_) {
    set_update_visual_size_immediately_for_testing(
        UseTestConfigForPlatformWindows());
  }

  bounds_dip_ = properties.bounds;
  // Properties contain DIP bounds but the buffer scale is initially 1 so it's
  // OK to assign.  The bounds will be recalculated when the buffer scale
  // changes.
  size_px_ = bounds_dip_.size();
  opacity_ = properties.opacity;
  type_ = properties.type;

  connection_->wayland_window_manager()->AddWindow(GetWidget(), this);

  if (!OnInitialize(std::move(properties)))
    return false;

  if (wayland_overlay_delegation_enabled_) {
    primary_subsurface_ =
        std::make_unique<WaylandSubsurface>(connection_, this);
    if (!primary_subsurface_->surface())
      return false;
    connection_->wayland_window_manager()->AddSubsurface(
        GetWidget(), primary_subsurface_.get());
  }

  PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
  delegate_->OnAcceleratedWidgetAvailable(GetWidget());

  std::vector<gfx::Rect> region{gfx::Rect{size_px_}};
  root_surface_->set_opaque_region(&region);
  root_surface_->ApplyPendingState();
  connection_->Flush();

  return true;
}

void WaylandWindow::SetWindowGeometry(gfx::Rect bounds) {}

gfx::Vector2d WaylandWindow::GetWindowGeometryOffsetInDIP() const {
  if (!frame_insets_px_.has_value())
    return {};

  return {static_cast<int>(frame_insets_px_->left() / window_scale_),
          static_cast<int>(frame_insets_px_->top() / window_scale_)};
}

void WaylandWindow::UpdateDecorations() {}

gfx::Insets WaylandWindow::GetDecorationInsetsInDIP() const {
  return frame_insets_px_.has_value()
             ? gfx::ScaleToRoundedInsets(*frame_insets_px_, 1.f / window_scale_)
             : gfx::Insets{};
}

WaylandWindow* WaylandWindow::GetRootParentWindow() {
  return parent_window_ ? parent_window_->GetRootParentWindow() : this;
}

void WaylandWindow::OnEnteredOutput() {
  // Wayland does weird things for menus so instead of tracking outputs that
  // we entered or left, we take that from the parent window and ignore this
  // event.
  if (AsWaylandPopup())
    return;

  UpdateWindowScale(true);
}

void WaylandWindow::OnLeftOutput() {
  // Wayland does weird things for menus so instead of tracking outputs that
  // we entered or left, we take that from the parent window and ignore this
  // event.
  if (AsWaylandPopup())
    return;

  UpdateWindowScale(true);
}

WaylandWindow* WaylandWindow::GetTopMostChildWindow() {
  return child_window_ ? child_window_->GetTopMostChildWindow() : this;
}

bool WaylandWindow::IsOpaqueWindow() const {
  return opacity_ == ui::PlatformWindowOpacity::kOpaqueWindow;
}

bool WaylandWindow::IsActive() const {
  // Please read the comment where the IsActive method is declared.
  return false;
}

WaylandPopup* WaylandWindow::AsWaylandPopup() {
  return nullptr;
}

bool WaylandWindow::IsScreenCoordinatesEnabled() const {
  return false;
}

uint32_t WaylandWindow::DispatchEventToDelegate(
    const PlatformEvent& native_event) {
  bool handled = DispatchEventFromNativeUiEvent(
      native_event, base::BindOnce(&PlatformWindowDelegate::DispatchEvent,
                                   base::Unretained(delegate_)));
  return handled ? POST_DISPATCH_STOP_PROPAGATION : POST_DISPATCH_NONE;
}

std::unique_ptr<WaylandSurface> WaylandWindow::TakeWaylandSurface() {
  DCHECK(shutting_down_);
  DCHECK(root_surface_);
  root_surface_->UnsetRootWindow();
  return std::move(root_surface_);
}

bool WaylandWindow::RequestSubsurface() {
  auto subsurface = std::make_unique<WaylandSubsurface>(connection_, this);
  if (!subsurface->surface())
    return false;
  connection_->wayland_window_manager()->AddSubsurface(GetWidget(),
                                                       subsurface.get());
  subsurface_stack_above_.push_back(subsurface.get());
  auto result = wayland_subsurfaces_.emplace(std::move(subsurface));
  DCHECK(result.second);
  return true;
}

bool WaylandWindow::ArrangeSubsurfaceStack(size_t above, size_t below) {
  while (wayland_subsurfaces_.size() < above + below) {
    if (!RequestSubsurface())
      return false;
  }

  DCHECK(subsurface_stack_below_.size() + subsurface_stack_above_.size() >=
         above + below);

  if (subsurface_stack_above_.size() < above) {
    auto splice_start = subsurface_stack_below_.begin();
    for (size_t i = 0; i < below; ++i)
      ++splice_start;
    subsurface_stack_above_.splice(subsurface_stack_above_.end(),
                                   subsurface_stack_below_, splice_start,
                                   subsurface_stack_below_.end());

  } else if (subsurface_stack_below_.size() < below) {
    auto splice_start = subsurface_stack_above_.end();
    for (size_t i = 0; i < below - subsurface_stack_below_.size(); ++i)
      --splice_start;
    subsurface_stack_below_.splice(subsurface_stack_below_.end(),
                                   subsurface_stack_above_, splice_start,
                                   subsurface_stack_above_.end());
  }

  DCHECK(subsurface_stack_below_.size() >= below);
  DCHECK(subsurface_stack_above_.size() >= above);
  return true;
}

bool WaylandWindow::CommitOverlays(
    uint32_t frame_id,
    std::vector<wl::WaylandOverlayConfig>& overlays) {
  if (overlays.empty())
    return true;

  // |overlays| is sorted from bottom to top.
  std::sort(overlays.begin(), overlays.end(), OverlayStackOrderCompare);

  // Find the location where z_oder becomes non-negative.
  wl::WaylandOverlayConfig value;
  auto split = std::lower_bound(overlays.begin(), overlays.end(), value,
                                OverlayStackOrderCompare);
  DCHECK(split == overlays.end() || (*split).z_order >= 0);
  size_t num_primary_planes =
      (split != overlays.end() && (*split).z_order == 0) ? 1 : 0;
  size_t num_background_planes =
      (overlays.front().z_order == INT32_MIN) ? 1 : 0;

  size_t above = (overlays.end() - split) - num_primary_planes;
  size_t below = (split - overlays.begin()) - num_background_planes;

  // Re-arrange the list of subsurfaces to fit the |overlays|. Request extra
  // subsurfaces if needed.
  if (!ArrangeSubsurfaceStack(above, below))
    return false;

  gfx::SizeF visual_size = (*overlays.begin()).bounds_rect.size();
  float buffer_scale = (*overlays.begin()).surface_scale_factor;
  auto& rounded_clip_bounds = (*overlays.begin()).rounded_clip_bounds;

  if (!wayland_overlay_delegation_enabled_) {
    DCHECK_EQ(overlays.size(), 1u);
    frame_manager_->RecordFrame(std::make_unique<WaylandFrame>(
        frame_id, root_surface(), std::move(*overlays.begin())));
    return true;
  }

  base::circular_deque<std::pair<WaylandSubsurface*, wl::WaylandOverlayConfig>>
      subsurfaces_to_overlays;
  subsurfaces_to_overlays.reserve(
      std::max(overlays.size() - num_background_planes,
               wayland_subsurfaces_.size() + 1));

  subsurfaces_to_overlays.emplace_back(
      primary_subsurface(),
      num_primary_planes ? std::move(*split) : wl::WaylandOverlayConfig());

  {
    // Iterate through |subsurface_stack_below_|, setup subsurfaces and place
    // them in corresponding order. Commit wl_buffers once a subsurface is
    // configured.
    auto overlay_iter = split - 1;
    for (auto iter = subsurface_stack_below_.begin();
         iter != subsurface_stack_below_.end(); ++iter, --overlay_iter) {
      if (overlay_iter >= overlays.begin() + num_background_planes) {
        subsurfaces_to_overlays.emplace_front(*iter, std::move(*overlay_iter));
      } else {
        // If there're more subsurfaces requested that we don't need at the
        // moment, hide them.
        subsurfaces_to_overlays.emplace_front(*iter,
                                              wl::WaylandOverlayConfig());
      }
    }

    // Iterate through |subsurface_stack_above_|, setup subsurfaces and place
    // them in corresponding order. Commit wl_buffers once a subsurface is
    // configured.
    overlay_iter = split + num_primary_planes;
    for (auto iter = subsurface_stack_above_.begin();
         iter != subsurface_stack_above_.end(); ++iter, ++overlay_iter) {
      if (overlay_iter < overlays.end()) {
        subsurfaces_to_overlays.emplace_back(*iter, std::move(*overlay_iter));
      } else {
        // If there're more subsurfaces requested that we don't need at the
        // moment, hide them.
        subsurfaces_to_overlays.emplace_back(*iter, wl::WaylandOverlayConfig());
      }
    }
  }

  // Configuration of the root_surface
  wl::WaylandOverlayConfig root_config;
  if (num_background_planes) {
    root_config = std::move(overlays.front());
  } else {
    root_config = wl::WaylandOverlayConfig(
        gfx::OverlayPlaneData(
            INT32_MIN, gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE,
            gfx::RectF(visual_size), gfx::RectF(),
            root_surface()->use_blending(), gfx::Rect(),
            root_surface()->opacity(), gfx::OverlayPriorityHint::kNone,
            rounded_clip_bounds, gfx::ColorSpace::CreateSRGB(), absl::nullopt),
        nullptr, root_surface()->buffer_id(), buffer_scale);
  }

  frame_manager_->RecordFrame(std::make_unique<WaylandFrame>(
      frame_id, root_surface(), std::move(root_config),
      std::move(subsurfaces_to_overlays)));

  return true;
}

void WaylandWindow::UpdateCursorShape(scoped_refptr<BitmapCursor> cursor) {
  DCHECK(cursor);
  absl::optional<int32_t> shape =
      WaylandZcrCursorShapes::ShapeFromType(cursor->type());

  // Round cursor scale factor to ceil as wl_surface.set_buffer_scale accepts
  // only integers.
  if (cursor->type() == CursorType::kNone) {  // Hide the cursor.
    connection_->SetCursorBitmap(
        {}, gfx::Point(), std::ceil(cursor->cursor_image_scale_factor()));
  } else if (cursor->platform_data()) {  // Check for theme-provided cursor.
    connection_->SetPlatformCursor(
        reinterpret_cast<wl_cursor*>(cursor->platform_data()),
        std::ceil(cursor->cursor_image_scale_factor()));
  } else if (connection_->zcr_cursor_shapes() &&
             shape.has_value()) {  // Check for Wayland server-side cursor
                                   // support (e.g. exo for lacros).
#if BUILDFLAG(IS_CHROMEOS_LACROS)
    // Lacros should not load image assets for default cursors. See
    // `BitmapCursorFactory::GetDefaultCursor()`.
    DCHECK(cursor->bitmaps().empty());
#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
    connection_->zcr_cursor_shapes()->SetCursorShape(shape.value());
  } else {  // Use client-side bitmap cursors as fallback.
    // Translate physical pixels to DIPs.
    gfx::Point hotspot_in_dips =
        gfx::ScaleToRoundedPoint(cursor->hotspot(), 1.0f / ui_scale_);
    connection_->SetCursorBitmap(
        cursor->bitmaps(), hotspot_in_dips,
        std::ceil(cursor->cursor_image_scale_factor()));
  }
  // The new cursor needs to be stored last to avoid deleting the old cursor
  // while it's still in use.
  cursor_ = cursor;
}

void WaylandWindow::ProcessPendingBoundsDip(uint32_t serial) {
  if (pending_bounds_dip_.IsEmpty() &&
      GetPlatformWindowState() == PlatformWindowState::kMinimized &&
      pending_configures_.empty()) {
    // In exo, widget creation is deferred until the surface has contents and
    // |initial_show_state_| for a widget is ignored. Exo sends a configure
    // callback with empty bounds expecting client to suggest a size.
    // For the window activated from minimized state,
    // the saved window placement should be set as window geometry.
    gfx::Rect bounds_in_dip = GetBoundsInDIP();
    // As per spec, width and height must be greater than zero.
    if (bounds_in_dip.IsEmpty())
      bounds_in_dip = gfx::Rect(0, 0, 1, 1);
    SetWindowGeometry(bounds_in_dip);
    AckConfigure(serial);
    root_surface()->Commit();
  } else if (delegate()->ConvertRectToPixels(pending_bounds_dip_) ==
                 GetBoundsInPixels() &&
             pending_configures_.empty()) {
    // If |pending_bounds_dip_| matches the current window bounds, and
    // |pending_configures_| is empty, which implies that the window is already
    // rendering at |pending_bounds_dip_|, then a new frame matching it may take
    // some time to arrive, despite the window delegate receives the updated
    // bounds. Without a new frame, UpdateVisualSize() is not invoked, leaving
    // this configure sequence unacknowledged. E.g: With static window content,
    // a configure sequence that does not change the window size will not cause
    // the window to redraw. Hence, acknowledge this configure sequence now to
    // tell the Wayland compositor that the requested configuration for this
    // window has been applied.
    SetWindowGeometry(pending_bounds_dip_);
    AckConfigure(serial);
    connection()->Flush();
  } else if (!pending_configures_.empty() &&
             pending_bounds_dip_.size() ==
                 pending_configures_.back().bounds_dip.size()) {
    // There is an existing pending_configure with the same size, do not push a
    // new one. Instead, update the serial of the pending_configure.
    pending_configures_.back().serial = serial;
  } else {
    // Otherwise, push the pending |configure| to |pending_configures_|, wait
    // for a frame update, which will invoke UpdateVisualSize().
    LOG_IF(WARNING, pending_configures_.size() > 100u)
        << "The queue of configures is longer than 100!";
    pending_configures_.push_back(
        {pending_bounds_dip_, pending_size_px_, serial});
    // The Wayland compositor can generate xdg-shell.configure events more
    // frequently than frame updates from gpu process. Throttle
    // ApplyPendingBounds() such that we forward new bounds to
    // PlatformWindowDelegate at most once per frame.
    if (pending_configures_.size() <= 1)
      ApplyPendingBounds();
  }
}

gfx::Rect WaylandWindow::AdjustBoundsToConstraintsPx(
    const gfx::Rect& bounds_px) {
  gfx::Rect adjusted_bounds_px = bounds_px;
  if (const auto min_size = delegate_->GetMinimumSizeForWindow()) {
    gfx::Size min_size_in_px =
        delegate()->ConvertRectToPixels(gfx::Rect(*min_size)).size();
    if (min_size_in_px.width() > 0 &&
        adjusted_bounds_px.width() < min_size_in_px.width()) {
      adjusted_bounds_px.set_width(min_size_in_px.width());
    }
    if (min_size_in_px.height() > 0 &&
        adjusted_bounds_px.height() < min_size_in_px.height()) {
      adjusted_bounds_px.set_height(min_size_in_px.height());
    }
  }
  if (const auto max_size = delegate_->GetMaximumSizeForWindow()) {
    gfx::Size max_size_in_px =
        delegate()->ConvertRectToPixels(gfx::Rect(*max_size)).size();
    if (max_size_in_px.width() > 0 &&
        adjusted_bounds_px.width() > max_size_in_px.width()) {
      adjusted_bounds_px.set_width(max_size_in_px.width());
    }
    if (max_size_in_px.height() > 0 &&
        adjusted_bounds_px.height() > max_size_in_px.height()) {
      adjusted_bounds_px.set_height(max_size_in_px.height());
    }
  }
  return adjusted_bounds_px;
}

gfx::Rect WaylandWindow::AdjustBoundsToConstraintsDIP(
    const gfx::Rect& bounds_dip) {
  gfx::Rect adjusted_bounds_dip = bounds_dip;
  if (const auto min_size_dip = delegate_->GetMinimumSizeForWindow()) {
    if (min_size_dip->width() > 0 &&
        adjusted_bounds_dip.width() < min_size_dip->width()) {
      adjusted_bounds_dip.set_width(min_size_dip->width());
    }
    if (min_size_dip->height() > 0 &&
        adjusted_bounds_dip.height() < min_size_dip->height()) {
      adjusted_bounds_dip.set_height(min_size_dip->height());
    }
  }
  if (const auto max_size_dip = delegate_->GetMaximumSizeForWindow()) {
    if (max_size_dip->width() > 0 &&
        adjusted_bounds_dip.width() > max_size_dip->width()) {
      adjusted_bounds_dip.set_width(max_size_dip->width());
    }
    if (max_size_dip->height() > 0 &&
        adjusted_bounds_dip.height() > max_size_dip->height()) {
      adjusted_bounds_dip.set_height(max_size_dip->height());
    }
  }
  return adjusted_bounds_dip;
}

bool WaylandWindow::ProcessVisualSizeUpdate(const gfx::Size& size_px) {
  auto result =
      base::ranges::find_if(pending_configures_, [&size_px](auto& configure) {
        // Should we adjust?
        return configure.size_px == size_px && configure.set;
      });

  if (result != pending_configures_.end()) {
    auto serial = result->serial;
    SetWindowGeometry(result->bounds_dip);
    AckConfigure(serial);
    connection()->Flush();
    pending_configures_.erase(pending_configures_.begin(), ++result);
    return true;
  }
  return false;
}

void WaylandWindow::ApplyPendingBounds() {
  DCHECK(!pending_configures_.empty());
  for (auto& configure : pending_configures_)
    configure.set = true;
  // Do not call SetBoundsInDIP which may be overridden by a subclass.
  UpdateBoundsInDIP(pending_configures_.back().bounds_dip);
}

}  // namespace ui

redpajama_set_name: RedPajamaGithub


text:
1958 (Kiwirkurra)
Warlimpirrnga Tjapaltjarri was born around 1958 east of Kiwirkurra in Western Australia. In 1984 the international headlines were filled with the 'discovery' of the last group of Australian Aborigines who until the late 20th century had managed to retain their traditional lifestyle in complete isolation. These so-called 'last of the nomads' or 'lost tribe' of nine Pintupi walked in from the bush west of Lake Owen that year and for the first time came into contact with western civilization. Six of these nine Aborigines became artists. From these six, Warlimpirrnga was the first who started painting after carefully observing other artists from the community at Kiwirkurra. Within three years, Warlimpirrnga transformed from a nomad with a traditional lifestyle into one of the leading artists from the Papunya Tula Artists corporation. In 1988, he held his first exhibition in Melbourne. Warlimpirrnga paints primarily in two styles, he makes extensive use of geometric shapes to depict the stories of the Tingari (ancestors), or he uses lines made up of carefully placed dots in his dreamings that depict holy Lake Mackay, a site of which he is one of the custodians. Warlimpirrnga uses the same dot technique as other Pintupi artists like his brothers, Walala and Thomas, but also George Tjungurrayi.
Hetti Perkins, Art + Soul, Miegunyah Press, 2011, p. 76;
Paul Toohey, 'The Last Nomads', The Bulletin, 4 May 2004, p.28-35;
Joan Winter, Native Title Business, Contemporary Indigenous Art (Catalogue), Keeira Press, Queensland, 2002;
P. Corbally Stourton, Songlines and dreamings: contemporary Australian aboriginal painting, Lund Humphries, 1996, p. 177;
Vivian Johnson, The Dictionary of Western Desert Artists, Craftsman House, East Roseville, New South Wales, 1994;
F. Dussart, La Peinture des Aborigines D'Australie, Editions Parentheses, Marseille, 1993;
S. Crossman and J-P. Barou, L'ete Australien a Montpellier: 100 Chefs d'Oevre de la Peinture Australienne, Musee Fabre, Montpellier, France, 1990;
J. Ryan, Mythscapes Aboriginal Art of the Desert from the National Gallery of Victoria, exhib. cat., National Gallery of Victoria, Melbourne, 1989.
2019 Art New York, SmithDavidson Gallery, Miami, USA
2017 Modern Masters, SmithDavidson Gallery, Miami, USA
2015 Pérez Museum, Miami, USA
2015 Signs and Traces: Contemporary Aboriginal Art. Cultural institute Zamek. Poznan, Poland
2015 The Armory Show. New York, USA
2014 Art Miami, Miami, USA
2012 dOKUMENTA (13), Fridericianum Museum, Kassel, Germany
2009 Scott Livesey Galleries, Melbourne
2003 Kintore Kiwirrkurra, Melbourne
2002-2005 Native Title Business - Contemporary Indigenous Art, a national travelling exhibition
1999 Exhibition with Ray James Tjangala, Gabrielle Pizzi Gallery, Melbourne
1993 Aboriginal Art Exhibition, Kung Gubunga, Oasis Gallery, Broadbeach (Queensland)
1991-1992 Friendly Country, Friendly People, Touring Exhibition, Araluen Art Centre, Alice Springs
1990 I'Ete Australien à Montpellier, Musée Fabre Gallery, Montpellier, France
1989 Mythscapes, National Gallery of Victoria, Melbourne
view work by Warlimpirrnga Tjapaltjarri
Maruwa 2018
Tingari #1367
Wilikinkara 2017


text:
NSO review: Roger Reynolds's refreshing unconventional 'george WASHINGTON'
Actors Clark Young (left), Thomas Keegan and Philip Larson with Music Director Christoph and the National Symphony Orchestra perform the world premiere of "george WASHINGTON," by composer Roger Reynolds. Images of Mount Vernon are shown on screens above the stage. (Margot Ingoldsby Schulman/National Symphony Orchestra)
By Anne Midgette
Anne Midgette
Classical music critic
The tree branches were like dark and straight brush strokes on the white screen — overlapping and jagged, as if painted by Franz Kline. Beneath them, the music welled up and ebbed like river water, shifting restlessly, one instrument lapping over another.
Roger Reynolds's "george WASHINGTON" — a composition that had its world premiere Thursday night at the Kennedy Center Concert Hall — is as much an "all-over" composition as the work of Kline and his fellow abstract expressionists. Reynolds, like those painters, seems to be seeking to create a work that has no differentiation between subject and background, in which each element counterbalances every other — in this case, video projection, recorded snippets of bird songs, three male narrators and the National Symphony Orchestra.
Reynolds took on a tricky assignment in setting out to write a serious musical work about "the father of our country." His commission originated with the Mount Vernon Ladies' Association, which joined with the University of California and the NSO's inestimable Hechinger Fund, so some literal historical content was built into the concept from the get-go. (The piece also commemorates the opening of a presidential library across the street from Mount Vernon.) The challenge is to be informative and creative without creating something that smacks of the kind of educational video they often play in the visitors' centers of historic houses — and being informative while offering a genuine artistic experience.
Reynolds's piece doesn't entirely break free of the gravitational pull of that model. But it does represent a refreshingly unconventional take on music's role in a multimedia collaboration. Usually the assumption is that the music is the most important thing onstage; here, even with the NSO replete with percussion, the music was presented as one equal among others, taking a supporting role. The one element that's meant to emerge from this layered, ever-morphing sound scape and mood scape — studded with words Washington wrote at three distinct stages of his life — is Washington himself.
In some ways, "george WASHINGTON" is worthy of respect; it represents a thoughtful, considered portrait. As a piece, I don't think it entirely succeeds: It is too nebulous to be fully compelling, and its "all-over" nature means that it offers no dramatic arc, just a swath of uniform texture.
Fall fine arts preview
A look at the upcoming season in dance and classical music.
Washington Post dance critic Sarah Kaufman highlights Dance Place's Modern Moves Festival, which will feature work by Bowen McCauley Dance, as one of fall's not-to-be-missed programs. Also performing Jan. 4 and 5 at the festival are Christopher K. Morgan, Dana Tai Soon Burgess, Daniel Burkholder/The PlayGround and more. Jeff Malet Photography
That, you might say, is the point. But if you're going to load the stage with bells and whistles, a full orchestra and its music director, Christoph Eschenbach, plus state-of-the-art video screens and three variously emoting narrators (Clark Young, Thomas Keegan and Philip Larson — their speaking voices ranging down the staff from tenor to bass), then it is disingenuous not to accept that you create the impression, and the anticipation, that something will be dramatic.
Instead, what Thursday's audience got was a work of interwoven colors and textures, moving all around their heads. At a couple of junctures, recorded sounds — such as a harpsichord playing an 18th-century ditty — hopped around the auditorium, from one speaker to another, in one of the best effects of the whole night.
"george WASHINGTON" was introduced by a coeval: Haydn, almost exactly the same age as Washington, whose Symphony No. 21 was also (incredibly) getting its first-ever NSO performance. A "church symphony," opening with a slow movement and embellished with brass, this piece got a lively reading from Eschenbach, whose Haydn is never going to be dry or academic. If there was some looseness in the ensemble, there was also, especially at the end, a nice sense of verve. Eschenbach seems to have returned for the fall season with a certain laxness and a lot of emotion to share; his conducting seems looser and more full of gestures than ever.
If the organ is not the instrument you know best and you want a crash course in how to listen to one, you could do worse than comparing Cameron Carpenter (the organist who played the last half of Saint-Saëns's "Organ Symphony" at the NSO's opening gala last weekend) and William Neil (the NSO and National Presbyterian Church organist who was the soloist in the complete performance of the same work Thursday). Carpenter is doing his best to position himself to be a big-name soloist, and his playing had a hell-for-leather quality. Neil seems already to be where he wants to go, career-wise; you could say he represents the best side of tradition, while Carpenter represents the excitement of the new. Neil's very entrance, loud and rich and full, had more decorum, more rounded edges, than Carpenter's aggressive flourish: Here I am.
Just being able to make the comparison is a luxury, and a benefit of the Kennedy Center's new organ is that it could — please, could it? — allow one to hear more styles and approaches to organ-playing in the future.
The concert repeats Friday and Saturday.
Anne Midgette Anne Midgette came to The Washington Post in 2008, when she consolidated her various cultural interests under the single title of chief classical music critic. She can be found online as The Classical Beat. Follow


text:
FINABEL - European Land Capability Cooperation
Indecipherable at first sight, the acronym FINABEL denotes a nearly 60-year-old organisation that aims at enhancing the interoperability of its European member states' Armies with no political strings attached.
Founded in 1953 as part of the Western European Union to represent an independent organisation, FINABEL carries the initials of its five founding member states, namely, France, the Netherlands, Belgium, Luxemburg, and Italy. Currently, this organisation operates as a cooperation body comprising altogether 22 member states.
Meanwhile, in 2008, the Finnish Army was established as a Service in its own right, and, in the wake of this development, also the charting of European cooperation opportunities became topical. Consequently, Finland being a European Union member state and FINABEL representing an apolitical organisation, Finland joined the FINABEL family back in 2008.
Key products of FINABEL
The key products of FINABEL equal recommendations, guidelines and regulation collections as well as studies related to Land Forces featuring the standpoint of the member states concerning Army standard procedures. For the purposes of generating the recommendations and guidelines, FINABEL sustains a bespoke organisation which functions under the supervision and in accordance with the decisions made in the annual Chiefs of Staff meeting. Furthermore, the defined areas of interest continue to be examined in studies in-progress by designated expert task groups, or ETGs.
Member states suggest proposals for research topics, and a designated ETG then typically conducts research on one topic at a time within a set one-year-long timeframe. The set permanent representatives in the ETGs contribute the given member states' substance-matter expertise, and the resulting end products take the form of high quality set of recommendations, guidelines or manuals. Each member state utilises the end products as they deem fit. In Finland, the applicable manuals and guidelines are adopted in use in accordance with the set standards governing manual approval.
How does Finland benefit from its FINABEL membership?
With its foregoing production of high quality recommendations and manuals for the Armies' utilization, FINABEL sustains cooperation with the European Defence Agency (EDA), the European Union Military Staff (EUMS) as well as the NATO. In FINABEL, the results of this cooperation take the form of tangible and swiftly produced end products that directly benefit the Army.
By and large, common standard procedures combined with the experiences accrued from others result in mimimised instances of error and rather optimise the European Armies' joint operating capability, for instance, in crisis management missions. As the Armies' leadership convenes in meetings, the official venue also offers the opportunity for informal exchange of knowledge and ideas concerning the Land Forces' development. The objective of FINABEL is to welcome all the European Union member states as its members, since, after all, FINABEL continues to represents the only European Armies' cooperation organisation functioning within the EU framework.
Further information on FINABEL is available online at www.finabel.org
European Land Capability Cooperation


text:
Who are Gryphon?
Gryphon Auction Systems is part of Gryphon Computer Support Ltd, a computer technical support company now based on The Lizard in Cornwall. Trading since 1995, we specialise in working with small businesses and individuals to help them get the best out of their PC's.
We have developed extensive expertise in managing Auction Sales through our work with several auctioneers over the years. Gryphon Auction Systems is now a major part of our business.
Why was AIMS written?
AIMS Fine Art version was originally created for Clevedon Salerooms in 1998, an auctioneer based in Clevedon, just south of Bristol, to replace an old DOS based system. We worked closely with them to develop a comprehensive system suitable for a small auctioneer, that was easy to use and one which would develop as they did.
They have grown to arguably be one of the leading auctioneers in the West Country and AIMS has grown with them. Our work with other auctioneers has lead to other developments, enabling us to to extend and expand it's range of features. AIMS can easily be customised to suite your particular needs too.
We developed AIMS Commercial version (now renamed AIMS 2020) in 1999 in response to a request from Commercial Auctioneers. Our biggest customer has been Sportingold Auctions, a leading sports memorabilia auctioneer. We provided them with AIMS in early 2003 and have worked closely with them ever since. AIMS 2020 is now our primary suite and has been developed so that it is suitable for auctioneers of all type, including many Fine Art auctioneers.
AIMS Lite is a basic version of AIMS and was developed because there was a need for a low cost yet competent package for new or small auctioneers. It is an ideal starter packages and provide an easy upgrade path to the more powerful AIMS packages.
All versions of AIMS will work with the HMRC's Auctioneer's Margin Scheme, as well as sales where VAT is charged on lots and auctioneer's charges.
All versions of AIMS are Microsoft Access applications. We chose Microsoft Access as it is a powerful database development package which can quickly produce and amend/customise office applications. Microsoft Access is a seperate software package and can be bought as a part of the Microsoft Office package. We recommend subscribing to Microsoft Office 365, where you pay a small monthly fee and can install Office on up to 5 PCs. Please note that there are various levels of subscription and you need to ensure the one you sign up to includes Access as several don't.
aims@gryphoncomputers.com
Other services:-
Design and manage websites
http://www.sportingoldauctions.co.uk


Before applying to Leeds I spent a number of years working in Edinburgh, Bristol and London. I worked as a waiter, a chef, a labourer, and composer. I also spent a while travelling through India, a country with lots of languages.
In terms of the course I was always pretty dead set on something language-based. I had never particularly excelled in a specific language, and didn't have any real interest in devoting an entire degree programme to just one. Linguistics and Phonetics felt like the right puzzle-piece; under one roof I was offered the opportunity to explore language acquisition, the human vocal tract and the way in which language interacts with gender. As for the university itself, by the time I was applying a lot of my friends were already halfway through a degree programme here. So I guess I went on the basis their positive recommendations, really. Also, aesthetically the campus also did a very good job of convincing me.
I'm into syntactic theory, and what you can do with it. I like studying the interplay between the different structures that we find within sentences, how those structures can be described, and what they might say about the human mind. My dissertation is centred on the question of whether languages share any common properties, whether there are any universal structures present in all of them. For this I'm looking into the asymmetrical relationships that subjects and objects have with verbs, and in doing so I'm reading about Japanese, Finnish and the indigenous Australian language Warlpiri.
One of the main benefits of the degree programme is the dedication to teaching offered. Whilst it is well known that lecturers are heavily focused on their own research, from a student's perspective it has always felt like a department in which the teaching takes priority. At every juncture all my questions were first answered, and then challenged, and then questioned. All the seminars and lectures were intellectually stimulating, but never at any point did I feel as if they were delivered with any pomposity. The department is down to earth and easy to like, and the classes are challenging and rewarding.
The libraries (especially the Brotherton) are great places to work and their linguistics catalogue is extensive to say the least – not only in print but also in terms of journals. The amount of literature you have access to is enormous.
The strength of the degree is really in its breadth, but you can be as specific as you like within the broadest of fields. And also don't worry if you're terrible at learning languages like me, it doesn't matter!


There are only 19 days left to secure awesome pre-order packages for Lance King's new studio album.
Based on a teaser track he released earlier today, this is a power/prog metal album you're not going to want to miss.
"…there are only 19 days left to get exclusive limited edition, CD's, T's, Caps, downloads, concert streams, jewelry and more on my crowdfunding PledgeMusic page.", says Lance.
After listening to the entire teaser track, I'm simply blown away! The mix is unbeliveable and Lance's vocals are stunning. This is now my most anticipated release of 2018.
We'll be doing a full review soon, so stay tuned.
RUN and order your exclusive package now!


text:
Dantumadiel (in olandese Dantumadeel ) è una municipalità dei Paesi Bassi di  abitanti situata nella provincia della Frisia.

Note

Voci correlate
Veenwouden

Altri progetti

Collegamenti esterni

Comuni della provincia della Frisia