text:
Prada Cup semis: Luna Rossa totally dominant in big breeze
Toby Heppell
It was the day we saw the return of American Magic to the racecourse in the opening Prada Cup Semi-Final races, but Luna Rossa looked ominously good taking both wins
TAGS: Everything you need to know about the 37th America's Cupluna rossa
If American Magic had been dreaming of a comeback story to rival some of the best in sport then today, the first day of racing in the Prada Cup Semi-Final, saw those dreams met with a cold, hard reality.
For all the time in the shed desperately trying to repair their boat, Patriot, over the course of the 12 days that have elapsed since their dramatic capsize and near sinking, they now end the first day of their return to racing 2-0 down in a first-to-four series against Luna Rossa Prada Pirelli.
If it is not entirely backs against the wall time, then certainly the US outfit is standing nearing that wall.
The early part of the racing took place in very windy weather, with windspeeds close to exceeding the 21 knot sustained average over which racing cannot start.
American hopes dashed
Patriot has (at least before their rebuild) shown herself to be possibly the fastest boat in the fleet in the heavier conditions, so you might think that when American Magic helm, New Zealander Dean Barker, pulled back the curtains this morning (Friday 29th January) he would have been happy to see the windy weather.
The US team do have something of a potential secret weapon in these conditions too, with a mainsail that is dramatically cut down in the top part of the leech – the team having found a rules loophole to exploit, that allows them to make up for a minimum size rules by having battens sticking a long way out the back of the leech – which they call their 'Batwing'. We have seen them use the sail in training and it has appeared fast, if at the expense of ultimate control.
Hutchinson says the concept is to reduce aerodynamic drag by having less sail in the sky but with the same amount of power to get foiling – in the windier weather.
American's Magic's 'batwing' mainsail with battens extending out the cut-down leech. Photo: COR 36/Studio Borlenghi
Today they set out with their 'batwing' rigged, perhaps hoping this might be the silver bullet they need.
Of course, the flip side with regards the weather is that although they have managed to get their boat back on the water – going for their first test sail on Wednesday 27th January – their control systems have been completely replaced and there are bound to be some gremlins. Those gremlins in lighter winds might mean a large loss, but in the top end breeze they could very well mean another capsize or worse.
The American team will deny it, indeed did deny it, but they looked tense onboard, more so than a team just racing to remain a part of an event in which they have invested four years and countless millions of dollars. "It all feels like a normal race day. Obviously it is quite windy and as you can see the boats are always on edge in these conditions. But I was not thinking about 12 days ago, I was just thinking about what I can do to help the team win," commented team CEO and tactician, Terry Hutchinson, when asked if they had been nervy of the newly relaunched boat.
Perhaps these words are down-the-line truth from the American leader, perhaps he fully believes that statement, or perhaps it's the sort of answer given by someone with media training, batting away any possibility that his team might be at a psychological disadvantage.
One of several big splash-downs for the US team. Photo: COR 36/Studio Borlenghi
What we do know, is that there was certainly plenty of evidence of control issues today during the Prada Cup Semi-Final racing, with Patriot seemingly losing grip with the rudder foil just after bearaways and splashing dramatically down into the water.
Just how hard can you push a boat that does 53 knots (Patriot's top speed of the day) when you are unsure exactly how she will behave? The answer from today appears to be 'not hard enough'.
Luna Rossa Prada Pirelli dominate
But all this talk of American Magic, their troubles and difficulties is to do something of a disservice to their competitor, Luna Rossa Prada Pirelli.
Prada Cup Semi-Final: Who will win?
With Sir Ben Ainslie's INEOS Team UK winning all five of their opening races and going straight through to the…
Prada Cup Round Robin: Best pictures so far from America's Cup qualifying
Before the start of the Prada Cup Round Robin, almost no one knew what the relative performance of each team…
The Italian outfit has made no secret of the fact that their boat has been at its best in the lighter wind ranges. They have been working hard on their systems and setup, and that seemed to pay off today.
"In the past the boat has not been at its best in the strong winds, but we made some improvements. We saw that in the numbers in training, but it feels good to have it confirmed today," so said one of Luna Rossa's Helmsman, Francesco Bruni at the end of racing.
Luna Rossa Prada Pirelli looked very composed throughout racing today. Photo: COR 36/Studio Borlenghi
The team's twin helmsman setup has come under increased scrutiny from observers in recent weeks. What once appeared an impressive development, allowing better manoeuvrability without the helms swapping sides each tack and gybe, had come to look something of a deficiency as they were outmanoeuvred by INEOS Team UK, who have taken a more conventional approach with a dedicated tactician in Giles Scott.
Today, however, the communication between Bruni, other helmsman Jimmy Spithill, and mainsail trimmer Pietro Sibello was markedly improved and is clearly something the team has been working on. It might not be conventional, but continue to improve their comms and you suspect they will be a much tougher team to beat should they go through to the Prada Cup Final.
The Italians were not without their struggles today, however, with a slightly sketchy bearaway at one windward gate and a big skid to leeward forcing them to crash off their foils during a leeward rounding.
Luna Rossa did have their own difficult moments in the windy conditions. Photo: COR 36/Studio Borlenghi
On that final note, it was interesting to see both teams often dropping their windward foil at the leeward gate roundings, to round with both foils down, in an attempt to stop this happening, something of which we are likely to see more if there are further windy races.
"We probably should have dropped the windward board [for the leeward rounding that went wrong] but it is hard when you are coming up at 45 knots, [dropping the board] does not feel good," confirmed Bruni "We skidded sideways and lost grip. And once you lose pitch on these boats, up she goes."
The Prada Cup Semi Final opening races
To talk of both Semi-Final Prada Cup races in specifics would be to repeat more-or-less the same story twice. American Magic looked cagy in both starts and were easily outmanoeuvred by the Italian outfit.
Trailing off the startline is not how anyone wants to start a race.
In the very earliest Round Robin races, American Magic were criticised for not staying in contention with the other boat, by forcing a split on one side of the course or the other, slowly getting further from the lead by ending up on the unfavored side of the course.
There was very little of that today as the Americans seemed content to follow the Italians round the course, trying to clutch onto the coattails of a boat that ultimately sailed away from them.
There were few splits on the racecourse throughout the day. Photo: COR 36/Studio Borlenghi
Gate rounding after gate rounding saw Patriot slipping further and further behind before the conclusion that saw relatively big winning margins for Luna Rossa Prada Pirelli on both occasions.
The forecast is for lighter winds tomorrow, which should favour Luna Rossa in pure pace terms, but perhaps with some more sailing time under their belts and winds that might allow a little more nuance than 'get the boat around the course' the Americans may yet come back into it. They will certainly be hoping that is the case.
It should not be forgotten just how impressive it has been to get the boat back on the water and to make the starline today. But in Luna Rossa they are facing a fast team who care not for the Americans' resolve and who simply want to go through to the Prada Cup Final in the quickest way possible.
On today's evidence it's looking like a a case of when that happens, not if. But fickle are the winds of the Waitematā Harbour and in the America's Cup (and events surrounding it) it is never over… until, of course, it is.
If you enjoyed this….
Yachting World is the world's leading magazine for bluewater cruisers and offshore sailors. Every month we have inspirational adventures and practical features to help you realise your sailing dreams.
Build your knowledge with a subscription delivered to your door. See our latest offers and save at least 30% off the cover price.
Foiling: what you need to know
Everything thing you need to know about how foiling works


text:
Q: Efficient way subtract a row with previous row seperated by group with Pandas The objective is to subtract a row (N) with previous row (N-1) separated by groups.
Given a df
   years nchar  nval
0   2019     a     1
1   2019     b     1
2   2019     c     1
3   2020     a     1
4   2020     s     4

Lets,separate into group of year 2019, and we denote it as df_2019
For df_2019, there we assign constant 10.
Then,only  for index 0, we do the following operation and assign to a new column 'B`
df_2019.loc[df_2019.index[0], 'B']= 10 - df_2019['nval'].values[0]

Whereas, the other index
df_2019.loc[df_2019.index[N], 'B'] = df_2019['B'].values[N-1] - df_2019['nval'].values[N]

This, will produced the following table
   years      nchar nval C   D    B

1   2019          a    1          9
2   2019          b    1          8
3   2019          c    1          7

For the group 2020, the same computation apply. However, the only difference is, the constant value is the 7, which is taken from the last index of column B.
To answer this requirement, the following code is produced with extra possible groups.
import pandas as pd
year=[2019,2019,2019,2020,2020,2020,2020,2022,2022,2022]
nval=[1,1,1,1,4,1,4,5,6,7]
nchar=['a','b','c','a','s','c','a','b','c','g']

df=pd.DataFrame(zip(year,nchar,nval),columns=['years','nchar','nval'])
print(df)
year_ls=[2019,2020,2022]
nspacing_total=2

nspacing_between_df=4
all_df=[]
default_val=10
for idx,dyear in enumerate(year_ls):
  df_=df[df['years']==dyear].reset_index(drop=True)
  t=pd.DataFrame([[''] * 3]*len(df_), columns=["C", "D", "B"])
  df_=pd.concat([df_,t],axis=1)
  Total = df_['nval'].sum()
  df_=pd.DataFrame([[''] * len(df.columns)]*1, columns=df.columns).append(df_).reset_index(drop=True)

  if idx ==0:
    df_.loc[df_.index[0], 'B']=default_val

  if idx !=0:

    pre_df=all_df[idx-1]
    pre_val=pre_df['B'].values[-1]

    nposi=1

    pre_years=pre_df['years'].values[nposi]
    df_.loc[df_.index[0], 'nchar']=f'From {pre_years}'
    df_.loc[df_.index[0], 'B']=pre_val

  for ndexd in range(df_.shape[0]-1):
    df_.loc[df_.index[ndexd+1], 'B']=df_['B'].values[ndexd]-df_['nval'].values[ndexd+1]

  df_=df_.append(pd.DataFrame([[''] * len(df.columns)]*nspacing_total, columns=df.columns)).reset_index(drop=True)
  df_.loc[df_.index[-1], 'nval']=Total
  df_.loc[df_.index[-1], 'nchar']='Total'
  df_.loc[df_.index[-1], 'B']=df_['B'].values[0]-df_['nval'].values[-1]

  all_df.append(df_)

However, I wonder whether this proposal can be further simplified further using pandas groupby or other. I really appreciate for any tips.
Ultimately, I would like to express the table as below, which will be exported to excel
   years      nchar nval C   D    B
0                           10
1   2019          a    1          9
2   2019          b    1          8
3   2019          c    1          7
4
5             Total    3          7
6
7
8
9
10        From 2019               7
11  2020          a    1          6
12  2020          s    4          2
13  2020          c    1          1
14  2020          a    4         -3
15
16            Total   10         -3
17
18
19
20
21        From 2020              -3
22  2022          b    5         -8
23  2022          c    6        -14
24  2022          g    7        -21
25
26            Total   18        -21
27
28
29
30

The code to produced the above table
# Optional to represent the table above
all_ap_df=[]
for a_df in all_df:
  df=a_df.append(pd.DataFrame([[''] * len(df.columns)]*nspacing_between_df, columns=df.columns)).reset_index(drop=True)
  all_ap_df.append(df)
df=pd.concat(all_ap_df,axis=0).reset_index(drop=True)

df.loc[df_.index[0], 'D']=df['B'].values[0]
df.loc[df_.index[0], 'B']=''
df = df.fillna('')

A: I think this is actually quite simple. Use groupby + cumsum:
df['B'] = 10 - df['nval'].cumsum()

Output:
>>> df
   years nchar  nval  B
0   2019     a     1  9
1   2019     b     1  8
2   2019     c     1  7
3   2020     a     1  6
4   2020     s     4  2

A: In your case chain with groupby
df['new'] = df.groupby('years')['nval'].cumsum().rsub(10)
Out[8]:
0    9
1    8
2    7
3    9
4    5
Name: nval, dtype: int64

redpajama_set_name: RedPajamaStackExchange


text:
Q: Why does this not create a date? I'm passing in a string like "2012-02-20'T'01:01:01"
 /**
         * Parse a workflowDate.
         * @param workflowDate an instance of a workflowDate string.
         * @return the date object containing parsed workflow date.
         */
        private Date parseDate(final String workflowDate)
        {
            DateFormat df = new SimpleDateFormat("YYYY-MM-DD'T'hh:mm:ss", Locale.ENGLISH);
            Date retVal = null;

            try
            {
                retVal = df.parse(workflowDate);
            }
            catch (ParseException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return retVal;
        }

A: Use yyyy-MM-dd'T'hh:mm:ss format instead of YYYY-MM-DD'T'hh:mm:ss
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss", Locale.ENGLISH);

*

*y - Year

*M - Month in year

*d - Day in month


Once you have a special occasion to attend and you have no car, you are left with a few choices—use public utility vehicles, ask a friend to drive you to the place, or hire a limo.
It is no doubt that renting a limo would be the most practical and exciting.
• You are safe. The chauffeur makes sure that you arrive at your destination safely. Male or female, the driver will do everything to make your trip enjoyable and worthwhile.
• Reliable and credible means of transport. When you hire a limo service, you have your own chauffeur, who is dedicated in meeting your flight time after the party, or the meeting time for the gathering. You can also tell the limo service provider to have the chauffeur pick you up earlier. The limo service company can even track your flight, so that their chauffeur can be there earlier to pick you up on time.
• Accommodations that are stylish and opulent. If you want to enjoy being treated like royalty, then hiring a limo is just what you need. Limousines are equipped with features such as a mini bar, entertainment systems, wide seating, karaoke, and an HD video player. They can make your ride memorable and worth every penny.
• Travel experience that is hassle-free. Generally, limousine service companies hire professional drivers. They are experts when it comes to travelling efficiently. The driver is usually at your door ten minutes before you are set to leave. You also have the prerogative to schedule where and when you want to be picked up, as long as it is within their radius. As you sit back, you can either relax or even make a few calls on your way to your destination.
You don't even have to worry about asking directions if you are going to an unfamiliar area. The driver covers everything. In hiring a limo service, the experience is unforgettable and worth sharing with family, friends, and loved ones. Next time you want a worry-free trip, just hire a limo.
Copyright © 2011 - 2019 The Limousine Service. All Rights Reserved.


text:
public class Lambda {
    public static int foo() {
        int variable = 42;

        Runnable runnable = () -> {
            int variable1 = 24;
            variable1++;
        };
        runnable.run();

        return variable;
    }

    public static int bar() throws Exception {
        int variable = 42;

        Callable<Integer> callable1 = () -> variable * 2;
        callable1.call();

        Callable<Integer> callable2 = () -> {
            int a = 5;
            return variable + a;
        };
        callable2.call();

        return variable;
    }
}

redpajama_set_name: RedPajamaGithub


text:
You are here: Profile
Eden Medina is Associate Professor of Informatics and Computing, Affiliated Associate Professor of Law, and Adjunct Associate Professor of History at Indiana University, Bloomington. Her research uses technology as a means to understand historical processes and she combines history, science and technology studies, and Latin American studies in her writings.
She is the author of the prizewinning book Cybernetic Revolutionaries: Technology and Politics in Allende's Chile and the co-editor of the prizewinning book Beyond Imported Magic: Essays on Science, Technology and Society in Latin America. Her previous work uses Latin American history as a way to illustrate how political innovation can spur technological innovation; how political projects shape the design, function, and use of computer systems; how computers have been used historically to bring about structural changes in society; the limitations of data-driven decision making; and how technologies can help us understand the nuances of historical change in areas of the world outside of the United States. Her current book project, Bones and Lives: Making and Unmaking Truth After Dictatorship (Duke University Press, under contract), studies how nations use science and technology to address histories of dictatorship and state violence and the ways science and technology intertwine with processes of truth, justice, and repair.
Medina received her Ph.D. from MIT in the History and Social Study of Science and Technology. She holds a degree in Electrical Engineering from Princeton University and a Master in Studies of Law from Yale Law School. At Indiana University, she teaches courses on social informatics, data and society, computer and information ethics, technology and the First Amendment, geographies of technology, and the history of technology. She is an affiliated fellow of the Information Society Project at Yale Law School, member of the academic council of the AI Now Institute, and editorial board member of Hispanic American Historical Review. Previous appointments include serving as a Fulbright Specialist in Engineering Education and directing the Rob Kling Center for Social Informatics at Indiana University. In addition to her books, she has published on topics as diverse as computer science education, the making of global corporate culture, crisis communication and infrastructure during natural disasters, big data and algorithmic regulation, free and open source software, the history and social study of technology, science and technology in Latin America, and the relationship of technology and politics.
Follow @edenmedina on Twitter
Recent and Upcoming Talks
New Position: I changed institutions as of July 1, 2019. I am now Associate Professor of Science, Technology, and Society at MIT. However, I will retain my affiliation with Indiana University for the coming year.
Forthcoming: Eden Medina and Mark Carey, "New Narratives of Technology, Expertise, and Environment in Latin America: The Cold War and Beyond," Itineraries of Expertise: Science, Technology, and the Environment in Latin America, Andra Chastain and Timothy Lorek, eds. (Pittsburgh: University of Pittsburgh Press, forthcoming 2020).
New Article: Eden Medina, "Forensic Identification in the Aftermath of Human Rights Crimes in Chile: A Decentered Computer History," Technology and Culture 59 (4 Supplement)(2018): S100-S133.
Media: You can hear me talking about science and technology in Latin America on the Ventricles podcast of the Science, Religion and Culture Program at Harvard Divinity School.
Keynote: I delivered the keynote at the 10th Annual SIGCIS Conference "Stored in Memory" in October 2018.
New appointment: Honored to be joining the Executive Council of the Society for the History of Technology.
Talk: I presented excerpts from my current book project Bones and Lives at Princeton University in September as part of the Davis Center seminar on Law & Legalities.
Media: You can hear me talking the social and political aspects of computing on the Greater than Code podcast! Transcript available.
New book chapter: Hilary Charlesworth, Sally Engle Merry, B.S. Chimni, Javier Couso, Terence Halliday, Outi Korhonen, Vivian Lin, Eden Medina, Leslye Obiora, César Rodríguez-Garavito, Gregory Shaffer, Rene Urueña, Ruth Okediji, "International Organizations and the Technologies of Governance," Rethinking Society for the 21st Century: Report of the International Panel on Social Progress Vol. 2, Cambridge University Press, 2018.
Media: Le Monde Diplomatique names Le Projet Cybersyn: La cybernétique socialiste dans le Chili de Salvador Allende a book of the month (June 2018, science category).
Media: You can hear me talking about my book Cybernetic Revolutionaries on the New Books Network podcast.
New appointment: I am now a faculty affiliate of the IU Data Science Program.
Conference: I will be on a roundtable organized by InfraReg, a network of scholars interested in the relationship of law, infrastructure, and technology, at the June 2018 Annual Meeting of the Law and Society Association (LSA).
Talk: I delivered the talk "Unmaking Truth After Dictatorship: Science, Memory, and the Disappeared" in April 2018 as part of the Harvard University History of Science Seminar.
Congratulations to my doctoral student Paula Mate on receiving a Microsoft Research Dissertation Grant and my doctoral student Christopher Miles on receiving an NSF STS Doctoral Dissertation Research Improvement Grant!
New appointment: Honored to be joining the academic council of the AI Now Institute and forming part of the growing community of scholars studying the political and social implications of AI, machine learning, and algorithmic decisionmaking.
Travel: During the 2017-2018 academic year I'll be traveling to the Data & Society Institute, Northwestern University, the Max Planck Institute for the History of Science, and Harvard University.
Book Contract: I'm pleased to announce that my next book is under contract with Duke University Press.
New Essay: Eden Medina, "Memories of the Yagan: The Chilean Automobile for the People," Technosphere Magazine, April 2017.
Upcoming travel: Excited to be spending part of summer 2017 at the Freie Universität Berlin Institute for Latin American Studies to work on the project "Computing in Dictatorships and Democracies."
Editorial: Eden Medina, "The Power of Paper," The Hill, December 2, 2016.
New Essay: Eden Medina, "The Politics of Networking a Nation," Public Books, November 2016.
Keynote: "The Historiography of Latin American Science and Technology in the Long Cold War," Traveling Technocrats: Experts and Expertise in Latin America's Long Cold War, Yale University, October 14, 2016.
Media: My research appeared on the popular design podcast 99 percent invisible.
Award: 2016 Amsterdamska Award from the European Society for the Study of Science and Technology (EASST) given to Beyond Imported Magic: Essays on Science, Technology and Society for "the most creative collaboration in an edited book in the broad field of science and technology studies."
Upcoming travel: This fall I'll be on leave at the Maurer School of Law, but I will be traveling to Barcelona, Notre Dame, and Yale. In the spring I'll be traveling to Lisbon, Berlin, Lima, Santiago, MIT, Johns Hopkins, and Berkeley.
Congratulations to my doctoral student Dongoh Park, who will begin working as a policy specialist at Google this fall!
New appointment: I joined the editorial board of Hispanic American Historical Review in July 2016.
Training: As part of my current project on data collection in human rights cases, I completed a forensic anthropology summer course on bone trauma taught by Steven A. Symes.
Keynote: "The Promise and Peril of Computer Technology in the Area of Human Rights," Mistakes Were Made 2.0, NYU, April 15, 2016.
New article: Eden Medina & Ilan Sandberg Wiener, Science and Harm in Human Rights Cases: Preventing the Revictimization of Families of the Disappeared, 125 Yale L.J. F. 331 (2016), http://www.yalelawjournal.org/forum/science-and-harm-in-human-rights-cases. [pdf]
New Affiliation: I'm excited to announce that I am now Affiliated Associate Professor of Law at Maurer School of Law.
Spring travel: This spring I will be traveling to Stanford, Princeton, NYU, and Yale. You can also catch me at the AHA Annual Meeting in Atlanta, GA.
New article: Eden Medina, "Rethinking Algorithmic Regulation," Kybernetes, 44 (6/7)(2015): 1005-1019.
Sabbatical: I will be in Santiago, Chile from the end of August to the beginning of January working on the research project "How Data Become Law: Computer-Mediated Evidence in Cases of Human Rights Violations."
Travel: Upcoming trip to Istanbul, Turkey (August 27-29) to attend the meeting of lead authors for the International Panel of Social Progress Report "Rethinking Society for the 21st Century."
Conference: Attended Foocamp 2015 in Sebastopol, CA.
Teaching: I will be teaching in the Systems Engineering Department this summer at the Universidad de Ibague in Colombia.
Beyond Imported Magic "highly recommended" by Choice Magazine.
Congratulations to my doctoral student David Nemer, who will begin as an assistant professor at the University of Kentucky School of Library and Information Science this fall!
New Book Review: Eden Medina, "Book Review of Conflicts in the Knowledge Society: The Contentious Politics of Intellectual Property by Sebastian Haunss ," Journal of the Association for Information Science and Technology, 66 (4) (2015): 869-871.
New Essay: Eden Medina, "The Cybersyn Revolution," Jacobin Magazine, Spring 2015.
New Article: Stephanie Kane, Eden Medina and Daniel Micheler, "Infrastructural Drift in Seismic Cities: Chile, Pacific Rim, 27 February, 2010," Social Text, 122 (2015): 71-92.
Keynote: "Big Data Lessons from Our Cybernetic Past," Strata + Hadoop World, San Jose, California, February 2015.
New Grant: Recipient of a Scholar's Award from the National Science Foundation for the project "A Study of Computer-Mediated Evidence in Cases of Human Rights Violations."
Keynote: "Rethinking Algorithmic Regulation," World Organization for Systems and Cybernetics, Ibague, Colombia, October 2014.
New Book: Eden Medina, Ivan da Costa Marques, and Christina Holmes, eds., Beyond Imported Magic: Essays on Science, Technology and Society in Latin America, Cambridge, Mass: MIT Press, 2014.
Award: Honorable Mention "Young Investigator," 2014 Recent History and Memory Book Prize (awarded by the Recent History and Memory Section of the Latin American Studies Association).
Training: Graduated from Yale Law School (MSL 2014).
Grant: Received a 2014 Jesse Fine Fellowship from the Poynter Center for Ethics and American Institutions.
Copyright © 2006 Eden Medina

redpajama_set_name: RedPajamaCommonCrawl


text:
LEC – Schalke04 Extended Mid Laner Abbedage's Contract Following A Stellar Performance In LEC 2020
Oct 11, 2020 Giorgio Delgado 0 comments 154
Credit: Riot Games via YouTube
Mid laner Abbedagge has re-signed with Schalke 04 for the 2021 League of Legends season, the organization announced today.
Abbedagge was a centerpiece in Schalke's miracle run during the 2020 LEC Summer Split where the organization managed to turn their season around and qualify for the playoffs following a devastating 0-8 start in the first four weeks. He made a name for himself and topped several stats among other mid laners in the league, making a strong case for his redemption story.
Schalke went on an 11-game winning streak before their miracle run came to an end. They defied all odds and managed to qualify for the LEC Summer Split playoffs, where they had a shot at reaching the World Championship this year.
They swept SK Gaming in the first round but ran into MAD Lions in the next round. SK's failed plan lost them the first game in convincing fashion. In the second game, they went with traditional lanes but were outclassed, notably in the mid lane where rookie ZaZee couldn't find his grip and kept misplaying all over the map. S04 capitalized on this by focusing him and snowballing Abbedage. With a 0/7/2 mid laner, SK lost a lot of pressure in teamfights. After losing multiple objectives and fights, they lost the second game.
Abbedage popped off once again in the third game, this time on Azir. He kept dancing around teamfights and knocking opponents into his team. Even though he was aggressive, he remained deathless until the end, finishing with a 9/0/4 scoreline. Thanks to his last heroic play, SK lost their hopes of reaching the World Championship this year.
S04 needed to win one more best-of-five series to lock in a spot at Worlds 2020. While winning more series will grant them a higher seed, the fact that they're so close to Worlds is a miracle in itself. Their miraculous run at the end of the season is worthy of being written in the esports history books.
They weren't able to beat MAD and their miracle run was thwarted after a 3-1 series loss. After defying all odds at the end of the Summer Split, Schalke narrowly missed out on the chance to head to Worlds, which started earlier today.
The only other player on Schalke's main roster who's signed for 2021 is the German star in the jungle, Gilius, according to the Global Contract Database. Building around Abbedagge and Gilius for the upcoming year could be promising for the organization considering how well they performed toward the end of the season.
LEAGUE OF LEGENDSLEC
The Best Attack Damage Carry And Support Duo Players At League Of Legends World Championship 2020
Should You Do The Hwang Hee Chan OTW SBC In FIFA 21? This Already OP Card Gets A OTW
TSM Moves Academy Team's AD Carry To Main Roster For The 2021 LCS
Dec 6, 2020 Richard Sebastian 1380
TSM advertised bot laner Lawrence "Lost" Sze Yuy Hui to its major LCS lineup today for the 2021 expert League of Legends period after Doublelift...
Ex-Team Liquid Broxah Opens Up About Joining CLG
Public assumption promptly fixed the swap as a downgrade when Broxah left Team Liquid for CLG this previous offseason. Leaving a leading North...
Golden Guardians And 100 Thieves Reportedly Reached Verbal Agreement To Transfer Closer And FBI
Nov 15, 2020 Richard Sebastian 2290
Reports have surfaced a day before the League of Legends free agency market opens that 100 Thieves will acquire jungler Can "Closer" Çelik and AD...


We still don't know the official Boston Bruins lineup for Game 1 of their first-round Stanley Cup playoff series against the Toronto Maple Leafs on Thursday night, but at this point, it would be pretty surprising to see David Backes among the forwards selected.
Taking a veteran player out a playoff lineup as a healthy scratch always is difficult, especially for someone like Backes. The 34-year-old winger is a tremendous leader, plays the type of physical hockey B's fans love, and has 67 games of postseason experience on his résumé.
Still, making him a healthy scratch absolutely is the right decision by Bruins head coach Bruce Cassidy (assuming that's what ultimately happens). Cassidy said Wednesday he doesn't think there will be any surprises when the lineup is announced Thursday.
Here are the forward lines from Wednesday's practice. You'll notice Backes was the extra right wing on the fourth line.
This Bruins-Leafs series should feature plenty of hitting, but there's going to be a ton of speed on the ice, too. This series also features two of the highest-scoring offenses in the NHL. Toronto scored the fourth-most goals during the regular season, while Boston ranked 11th. Special teams is going to be pivotal as well, particularly when Boston's third-ranked power play is on the ice against Toronto's 18th-ranked penalty kill.
Backes doesn't bring a ton of speed, and his offensive production (seven goals in 70 games) was disappointing this season. He's neither a key member of the penalty kill nor an essential part of the power play's success.
Backes' skill set just isn't a great fit for how this Bruins-Leafs series likely will be played. This doesn't mean he won't factor at all in the playoffs. If the Bruins advance, a different opponent could present certain situations where Backes could be effective. Injuries always are a burden in the postseason, and those setbacks could open up opportunities for players who are sitting as a healthy scratch.
But at the moment, the best possible lineup for the Bruins entering Game 1 doesn't include Backes. Luckily for the B's, you know Backes is going to handle it like a true professional and do whatever he can to help his teammates.


Published 04/25/2019 08:51:27 am at 04/25/2019 08:51:27 am in Handheld Vacuum Cleaner With Hepa Filter.
handheld vacuum cleaner with hepa filter bosch gas 18v 1 professional extractor handheld cordless vacuum cleaner bare uni dry and wet hepa filter hand held vacuum cleaner jk portable dry and wet hepa filter hand held vacuum cleaner jk portable vacuum cleaner car.
handheld vacuum cleaner kpa rechargeable cordless hand vacuum handheld vacuum cleaner kpa rechargeable cordless hand vacuum w powerful portable vacuum with hepa filter lightweight wet dry use for home pet hair , portable hepa vacuum cleaners , bestek in upright handheld vacuum cleaner hepa filter , handheld vacuums vacuums the home depot datavac antistatic peak hp handheld vacuum electronic cleaning system with stage hepa, karcher vc premium vacuum cleaner hepa handheld remote karcher vc premium vacuum cleaner hepa filter handheld remote, shop soniclean handheld hepa filter bags free shipping on orders soniclean handheld hepa filter bags, bestek corded stick vacuum cleaner upright and handheld in with in w corded cyclonic bagless upright vacuum cleaner handheld hepa filter,, great deals on w kpa corded handheld upright stick handstick w kpa corded handheld upright stick handstick vacuum cleaner puttervac bagless hepa washable filter, dibea w in corded upright stick handheld vacuum cleaner dibea w in corded upright stick handheld vacuum cleaner kpa strong, handheld hepa vacuum lightweight upright stick handheld vacuum handheld hepa vacuum free filter portable handheld vacuum latest version free filter toyomi handheld hepa vacuum.


Décor meets function with this charming organizer, sure to brighten up any space.
The durable, heavy, coated cardboard pieces punch out and assemble in mere minutes—no glue or scissors required! A picture-perfect way to keep a desk tidy! Eye-catching and functional, this vintage-inspired desk accessory will be an instant favorite of camera enthusiasts.
6.9" x 0.4" x 10.2"


text:
What Does 4/20 Have To Do With Adolf Hitler?
By Emily Bicks
Updated Apr 20, 2019 at 6:00am
Getty Adolf Hitler. Marijuana leaves.
April 20, is the unofficial holiday that celebrates the existence of marijuana, cannabis, weed, or whatever you like to call the green buds that's now legal smoke recreationally in 10 American states. But what does 4/20 have to do with Adolf Hitler? And how did April 20, commonly referred to as "Weed Day," a secular celebration of all things cannabis-related, become synonymous with the leader of the Nazi regime in World War II?
The connection between 4/20 and Hitler lies in the fact that former German Fuhrer was born on April 20, 1889. But other than this one similarity, the holiday of weed has nothing to do with man who continues to be the symbol of evil and hatred nearly 130 years after his birth. Regardless of what rumors and tales fly, Hitler in no way, shape or form, has anything to do with people people smoking copious amounts of weed, baking cannabis into brownies, or whichever way one chooses to celebrate 4/20. The matching dates are merely a case of bad luck.
The reason there's a myth linking the Meinkampf author to 4/20 continues to permeate, is because the true meaning behind the marijuana celebration day is foggy at best. There are rumors that April 20 was picked because "4:20" is the code police uses after catching people illegally smoking weed. However, ask any cop, this penal code does not exist.
Did you know that some believe that the date 4/20 refers to the number of chemical compounds in cannabis? ?
A post shared by MedMen (@shopmedmen) on Apr 18, 2019 at 6:03pm PDT
The truth is, 4/20 has nothing to do with the police, or the number of chemical compounds found in a cannabis strain, and it didn't become a thing until long after Hitler lost World War II and committed suicide in 1945.
According to TIME, the birth of 4/20 dates back to 1971, when a group of five buddies at San Rafael High School in California would all meet near the statue of chemist Louis Pasteur to smoke a joint at 4:20 p.m., the time when all their extracurricular activities ended.
A post shared by Legalize Marijuana (@marijuana) on Apr 15, 2019 at 11:51pm PDT
This group guys, Steve Capper, Dave Reddix, Jeffrey Noel, Larry Schwartz, and Mark Gravich, called themselves the "Waldos," and would shout to one another "420" during school, code for "meet you by the statue at 4:20 p.m. to smoke up." Reddix, who's now a documentary filmmaker explained, "We got tired of the Friday-night football scene with all of the jocks. We were the guys sitting under the stands smoking a doobie, wondering what we were doing there."
Happy Birthday Phil!
A post shared by Grateful Dead (@gratefuldead) on Mar 15, 2019 at 10:41am PDT
Reddix's brother helped him gdt a job as a roadie for Grateful Dead bassist Phil Lesh, and the term quickly spread through the Deadhead crowds. On December 28, 1990, fans of the Grateful Dead in Oakland, California started passing out flyers, inviting everyone to meet up at smoke at 4:20 p.m., and this piece of paper fell into the hands of Steve Bloom, a former reporter for High Times magazine. The outlet published the flyer in 1991, and in 1998, the publication credited the "Waldos for the invention of 4/20.
READ NEXT: Taylor Swift Announces Official New Music Release Date
Published Apr 20, 2019 at 6:00am
Adolf Hitler, Holidays, Marijuana
Explaining the connection between 4/20, the unofficial holiday celebrating weed, and Nazi regime leader, Adolf Hitler.


Did a failure happen before the fire or as a result?
Was corrosion an issue, or impact?
Was the part misused or improperly installed?
Was it improper installation, a material flaw, a manufacturing defect, physical abuse, or simply old age?


text:
W. Scott Sonntag
Anesthesia Accidents
Misdiagnosis of Cardiac Conditions
Call for help: 443-718-9931
We Can Help, Call Us Today 443-718-9931
Jump to Practice Area
Responsible Parties in Medical Malpractice Actions
Medical Malpractice - An Overview
Proving Your Case - Causation
Frequently Asked Questions About Medical Malpractice
The Law Offices of W. Scott Sonntag, P.A., serves medical malpractice plaintiffs in the D.C. metro area and Maryland counties including Prince George's County, Montgomery County, Ann Arundel County, Howard County, Baltimore County, Baltimore City, St. Mary's County, Charles County and Calvert County. Mr. Sonntag was named Trial Lawyer of the Year for 2006 by the Trial Lawyer's Association of Metropolitan Washington, D.C.
Washington, D.C., metro area lawyer Scott Sonntag represents victims of medical malpractice in areas surrounding D.C., including Baltimore, Rockville, Annapolis, Columbia, Ellicott City, Waldorf, Prince Frederick and Salisbury. Mr. Sonntag's emphasizes experienced counsel and caring service to distressed families.
Medical malpractice actions are not strictly limited to medical doctors. They can also be brought against nurses, dentists, osteopaths, health care facilities, chiropractors, naturopaths, complementary/alternative medicine (CAM) providers and others providing medical services, such as clinics, surgery centers and nursing homes. If you believe that you have been harmed by the negligence of any health care provider, do not delay in contacting an experienced medical malpractice attorney at Law Offices of W. Scott Sonntag, P.A. in Columbia, Maryland.
Individual providers: doctors, nurses and other health care professionals
In addition to doctors and surgeons, a variety of other health care professionals, including dentists, psychiatrists, nurses, nurse practitioners, physician assistants, chiropractors and complementary/alternative medicine (CAM) providers, can be held liable for medical malpractice. A successful medical malpractice case against any health care provider must prove the same elements as one against a physician, namely that:
The provider owed a duty of care to the plaintiff
The provider breached that duty by deviating from the standard of care
The plaintiff suffered injury
The plaintiff's injury was causally connected to the provider's breach of duty
Hospitals; vicarious liability
In the context of medical malpractice actions, hospitals can be held directly liable for their own negligence. Hospitals and clinics can also be held vicariously liable for the negligence of their employees. "Vicarious liability" means a party is held responsible not for its own negligence, but rather for the negligence of another, usually in the context of an employer/employee relationship.
Direct hospital negligence
When hiring medical staff, a hospital must make reasonable inquiries into an applicant's education, training, background and licensing. If a hospital fails to perform due diligence in teh hiring process, it might be held liable under the "corporate negligence" doctrine for negligent supervision or retention when a staff member's malpractice injures a patient. A hospital could be responsible for its own negligence if, for example, it fails to investigate the credentials of an attending physician before granting him or her privileges or where it allows a physician whom it knew (or should have known) was incompetent to treat patients there.
Hospitals are also required to ensure that there is a sufficient number of doctors and registered nurses on duty at all times to maintain quality patient care. A hospital that fails to do so may be held liable for injuries to patients resulting from a staff shortage.
Another area of potential liability arises when a hospital's employees fail to follow the orders of a patient's private attending physician and the patient is injured as a result of that failure. Conversely, if a hospital employee finds a private physician's treatment plan to be clearly contraindicated, but fails to make a reasonable inquiry of the physician regarding the proposed treatment, the hospital could also be found liable.
Finally, hospitals may be held liable for failing to protect patients from harm, failing to adequately perform clinical tests, neglecting to keep accurate medical records, and not properly admitting or discharging patients. In the area of admissions, hospitals are generally required to treat seriously injured or ill people on an emergency basis even if those people are uninsured; the refusal to do so may result in hospital liability. Additionally, federal and state statutes prohibit hospitals from refusing to treat or admit people based on their race, color, religion or national origin, or on their inability to pay for treatment.
Vicarious liability
When a hospital employee's malpractice injures a patient, the hospital itself may be held vicariously liable under the legal doctrine of respondeat superior. Under this doctrine, an employer may be held liable for the negligence of an employee, provided the employee was acting within the scope of his or her employment when the negligent acts or omissions occurred. This doctrine is important to many medical malpractice cases, because it helps ensure there will be a financially responsible party to compensate an injured plaintiff.
If the negligent physician, nurse, technician or other provider is an independent contractor working at the hospital but not an employee of the facility, then the doctrine of respondeat superior will not apply. This means that the hospital cannot be held liable for that provider's negligence. This doesn't mean that the hospital is wholly without blame, however. The hospital could still be partially responsible if, for example, it granted attending privileges to an unlicensed or incompetent physician, or one whose license to practice medicine had been suspended or revoked.
The liability of Health Maintenance Organizations (HMOs)
A number of courts have considered the question of whether HMOs can be held liable for the negligence of a member physician. Essentially, medical malpractice claims against HMOs proceed under the same theories as cases against hospitals. The first theory is direct negligence, namely that the HMO is liable for negligent hiring, supervision or retention of a doctor accused of malpractice. Another approach is to pursue a claim based on an agency theory (like vicarious liability or respondeat superior). It is important to note that some malpractice claims against HMOs could be preempted by state or federal law. These preemption provisions are a way to protect HMOs chartered under state law from huge jury awards.
Contact a medical malpractice lawyer
If you or someone you love has been injured as a result of the negligent acts or omissions of a health care provider, an experienced medical malpractice attorney can see you through the complicated legal maze of a medical malpractice lawsuit. Contact a medical malpractice attorney at Law Offices of W. Scott Sonntag, P.A. in Columbia, Maryland, today.
Medical Malpractice Information Center
getting infomation failed. http://www.greenbeltmedicalmalpracticelawyer.com/atom.xmlERROR is: 404 Not Found
Law Offices of W. Scott Sonntag, P.A.
10211 Wincopin Circle, Suite 620
At the Law Offices of W. Scott Sonntag, P.A., an experienced attorney represents plaintiffs in medical malpractice cases throughout the Washington, D.C. metro and Baltimore, Maryland areas.
© 2020 by Law Offices of W. Scott Sonntag, P.A. All rights reserved. Disclaimer | Site Map


Naomi has worked incredibly hard at her tennis to enjoy a very successful junior tennis career. In addition to the tremendous support of her family, friends and coaches, Naomi is helped by the following sponsors that allow her to dedicate her time to tennis and to equip herself with the necessary coaching, facilities, racquets and apparel needed to succeed.
Naomi would like to thank everyone who has supported her through the good times and especially stuck by her when things were tough! All of Naomi's sponsors are listed below. A big thank you to all of them.
If you are not currently a tennis sponsor but would like to get involved in team 'Naomi Broady' as she continues on her exciting senior tennis career please contact us via one of the channels on our contacts page. Naomi would be thrilled to add to her support team. Potential partners could benefit from a high profile on this site and in other areas of Professional Tennis.
UKFast is one of the leading hosting companies in the UK. Boasting large blue-chip clients such as Sainsbury's and the NHS, UKFast is trusted by companies of all sizes to ensuring their websites have 100% up-time. In fact UKFast has won multiple awards for the quality of its service, including being named 'best hosting provider' by the ISPAs for four years running (2004 - 2008).
The parallels between UKFast and Naomi Broady are clear to see. Both are current champions in their respective fields and both are dedicated to excellence. However, neither is resting on their laurels. UKFast continues to seek to push the boundaries of internet hosting and development, while Naomi will hopefully soon be pushing the boundary of the WTA top 100.
Naomi is currently seeking a financial partner who would be looking to help with travel and touring expenses in return for personal appearances and promotions as well as guest opportunities at tournaments throughout the year including Grand Slam events !
If you are interested in helping Naomi please contact us here.
please send mail to - Naomi Broady c/o The Northern, Palatine Road, West Didsbury, Manchester M20 3YA.


text:
package org.jasig.cas.authentication.principal;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.jasig.services.persondir.IPersonAttributeDao;
import org.jasig.services.persondir.IPersonAttributes;
import org.jasig.services.persondir.support.merger.IAttributeMerger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.PreDestroy;
import javax.cache.Cache;
import javax.cache.CacheManager;
import javax.cache.Caching;
import javax.cache.configuration.MutableConfiguration;
import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;
import javax.validation.constraints.NotNull;
import java.io.Closeable;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * Wrapper around an attribute repository where attributes cached for a configurable period.
 * @author Misagh Moayyed
 * @since 4.1
 */
public final class CachingPrincipalAttributesRepository implements PrincipalAttributesRepository, Closeable {
    private static final long serialVersionUID = 6350244643948535906L;

    private static final TimeUnit DEFAULT_CACHE_EXPIRATION_UNIT = TimeUnit.HOURS;
    private static final long DEFAULT_CACHE_EXPIRATION_DURATION = 2;

    private static final Logger LOGGER = LoggerFactory.getLogger(CachingPrincipalAttributesRepository.class);

    private final IPersonAttributeDao attributeRepository;

    private final Cache<String, Map<String, Object>> cache;

    private final String cacheName = this.getClass().getSimpleName().concat(UUID.randomUUID().toString());

    private Duration duration;

    /**
     * The merging strategy that deals with existing principal attributes
     * and those that are retrieved from the source. By default, existing attributes
     * are ignored and the source is always consulted.
     */
    private IAttributeMerger mergingStrategy;

    /**
     * Init the caching repository, solely used for serialization purposes
     * and nothing else.
     */
    private CachingPrincipalAttributesRepository() {
        this.attributeRepository = null;
        this.cache = null;
        this.duration = null;
    }

    /**
     * Instantiates a new caching attributes principal factory.
     * Caches the attributes based on duration units of {@link #DEFAULT_CACHE_EXPIRATION_DURATION}
     * and {@link #DEFAULT_CACHE_EXPIRATION_UNIT}.
     * @param attributeRepository the attribute repository
     */
    public CachingPrincipalAttributesRepository(final IPersonAttributeDao attributeRepository) {
        this(attributeRepository, DEFAULT_CACHE_EXPIRATION_DURATION);
    }

    /**
     * Instantiates a new caching attributes principal factory.
     * Caches the attributes based on duration units of {@link #DEFAULT_CACHE_EXPIRATION_DURATION}
     * and the given time.
     * @param attributeRepository the attribute repository
     * @param expiryDuration the expiry duration based on the unit of {@link #DEFAULT_CACHE_EXPIRATION_DURATION}
     */
    public CachingPrincipalAttributesRepository(final IPersonAttributeDao attributeRepository, final long expiryDuration) {
        this(attributeRepository, DEFAULT_CACHE_EXPIRATION_UNIT, expiryDuration);
    }

    /**
     * Instantiates a new caching attributes principal factory.
     *
     * @param attributeRepository the attribute repository
     * @param timeUnit the time unit
     * @param expiryDuration the expiry duration
     */
    public CachingPrincipalAttributesRepository(final IPersonAttributeDao attributeRepository,
                                                final TimeUnit timeUnit,
                                                final long expiryDuration) {
        this(attributeRepository, new Duration(timeUnit, expiryDuration));
    }

    /**
     * Instantiates a new caching attributes principal factory.
     *
     * @param attributeRepository the attribute repository
     * @param duration the duration
     */
    private CachingPrincipalAttributesRepository(final IPersonAttributeDao attributeRepository,
                                                 final Duration duration) {
        this(attributeRepository, createCacheConfiguration(duration));
        this.duration = duration;
    }

    /**
     * Instantiates a new caching attributes principal factory.
     *
     * @param attributeRepository the attribute repository
     * @param config the config
     */
    private CachingPrincipalAttributesRepository(final IPersonAttributeDao attributeRepository,
                                                 final MutableConfiguration<String, Map<String, Object>> config) {
        this(attributeRepository, config, Caching.getCachingProvider().getCacheManager());
    }

    /**
     * Instantiates a new caching attributes principal factory.
     *
     * @param attributeRepository the attribute repository
     * @param config the config
     * @param cacheProviderFullClassName the cache provider full class name
     */
    private CachingPrincipalAttributesRepository(final IPersonAttributeDao attributeRepository,
                                                 final MutableConfiguration<String, Map<String, Object>> config,
                                                 final String cacheProviderFullClassName) {
        this(attributeRepository, config,
                Caching.getCachingProvider(cacheProviderFullClassName).getCacheManager());
    }

    /**
     * Instantiates a new caching attributes principal factory.
     *
     * @param attributeRepository the attribute repository
     * @param config the config
     * @param manager the manager
     */
    private CachingPrincipalAttributesRepository(final IPersonAttributeDao attributeRepository,
                                                 final MutableConfiguration<String, Map<String, Object>> config,
                                                 final CacheManager manager) {
        this.attributeRepository = attributeRepository;
        this.cache = manager.createCache(this.cacheName, config);
    }

    /**
     * Instantiates a new caching attributes principal factory.
     *
     * @param attributeRepository the attribute repository
     * @param cache the cache
     */
    private CachingPrincipalAttributesRepository(final IPersonAttributeDao attributeRepository,
                                                 final Cache<String, Map<String, Object>> cache) {
        this.attributeRepository = attributeRepository;
        this.cache = cache;
    }

    /**
     * Gets attribute repository.
     *
     * @return the attribute repository
     */
    public IPersonAttributeDao getAttributeRepository() {
        return this.attributeRepository;
    }

    public Duration getDuration() {
        return this.duration;
    }

    /**
     * Gets cache configuration.
     *
     * @return the configuration
     */
    @JsonIgnore
    public MutableConfiguration<String, Map<String, Object>> getConfiguration() {
        return this.cache.getConfiguration(MutableConfiguration.class);
    }

    /**
     * The merging strategy that deals with existing principal attributes
     * and those that are retrieved from the source. By default, existing attributes
     * are ignored and the source is always consulted.
     * @param mergingStrategy the strategy to use for conflicts
     */
    public void setMergingStrategy(final IAttributeMerger mergingStrategy) {
        this.mergingStrategy = mergingStrategy;
    }

    public IAttributeMerger getMergingStrategy() {
        return mergingStrategy;
    }

    /**
     * Prep cache configuration.
     *
     * @param expiryDuration the expiry duration
     * @return the mutable configuration
     */
    protected static MutableConfiguration<String, Map<String, Object>> createCacheConfiguration(final Duration expiryDuration) {
        final MutableConfiguration<String, Map<String, Object>> config = new MutableConfiguration<>();
        config.setStatisticsEnabled(true);
        config.setManagementEnabled(true);
        config.setStoreByValue(true);
        config.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(expiryDuration));
        return config;
    }

    /**
     * Set/add the received attributes into the cache.
     * @param id the principal id that controls the grouping of the attributes in the cache.
     * @param attributes principal attributes to add to the cache
     */
    private void addPrincipalAttributesIntoCache(final String id, final Map<String, Object> attributes) {
        synchronized (this.cache) {
            if (attributes.isEmpty()) {

                this.cache.remove(id);
                LOGGER.debug("No attributes are provided, so removed principal id [{}] from the cache", id);
            } else {
                this.cache.put(id, attributes);
                LOGGER.debug("Cached [{}] attributes for the principal id [{}]", attributes.size(), id);
            }
        }
    }

    @Override
    public Map<String, Object> getAttributes(@NotNull final Principal p) {
        final Map<String, Object> cachedAttributes = this.cache.get(p.getId());
        if (cachedAttributes != null) {
            LOGGER.debug("Found [{}] cached attributes for principal [{}]", cachedAttributes.size(), p.getId());
            return cachedAttributes;
        }

        final Map<String, List<Object>> sourceAttributes = retrievePersonAttributesToPrincipalAttributes(p.getId());
        LOGGER.debug("Found [{}] attributes for principal [{}] from the attribute repository.",
                sourceAttributes.size(), p.getId());

        if (this.mergingStrategy == null) {
            LOGGER.debug("No merging strategy found, so attributes retrieved from the repository will be used instead.");
            final Map<String, Object> finalAttributes = convertPersonAttributesToPrincipalAttributes(sourceAttributes);
            addPrincipalAttributesIntoCache(p.getId(), finalAttributes);
            return finalAttributes;
        }

        final Map<String, List<Object>> principalAttributes = convertPrincipalAttributesToPersonAttributes(p);

        LOGGER.debug("Merging current principal attributes with that of the repository via strategy [{}]",
                this.mergingStrategy.getClass().getSimpleName());
        final Map<String, List<Object>> mergedAttributes =
                this.mergingStrategy.mergeAttributes(principalAttributes, sourceAttributes);

        final Map<String, Object> finalAttributes = convertPersonAttributesToPrincipalAttributes(mergedAttributes);
        addPrincipalAttributesIntoCache(p.getId(), finalAttributes);
        return finalAttributes;

    }

    /***
     * Convert principal attributes to person attributes.
     * @param p  the principal carrying attributes
     * @return person attributes
     */
    private Map<String, List<Object>> convertPrincipalAttributesToPersonAttributes(final Principal p) {
        final Map<String, List<Object>> convertedAttributes = new HashMap<>(p.getAttributes().size());
        final Map<String, Object> principalAttributes = p.getAttributes();

        for (final Map.Entry<String, Object> entry : principalAttributes.entrySet()) {
            final Object values = entry.getValue();
            final String key = entry.getKey();
            if (values instanceof List) {
                convertedAttributes.put(key, (List) values);
            } else {
                convertedAttributes.put(key, Collections.singletonList(values));
            }
        }
        return convertedAttributes;
    }

    /**
     * Convert person attributes to principal attributes.
     * @param attributes person attributes
     * @return principal attributes
     */
    private Map<String, Object> convertPersonAttributesToPrincipalAttributes(final Map<String, List<Object>> attributes) {
        final Map<String, Object> convertedAttributes = new HashMap<>();
        for (final Map.Entry<String, List<Object>> entry : attributes.entrySet()) {
            final List<Object> values = entry.getValue();
            convertedAttributes.put(entry.getKey(), values.size() == 1 ? values.get(0) : values);
        }
        return convertedAttributes;
    }

    /**
     * Obtains attributes first from the repository by calling
     * {@link org.jasig.services.persondir.IPersonAttributeDao#getPerson(String)}.
     *
     * @param id the person id to locate in the attribute repository
     * @return the map of attributes
     */
    private Map<String, List<Object>> retrievePersonAttributesToPrincipalAttributes(final String id) {

        final IPersonAttributes attrs = this.attributeRepository.getPerson(id);
        if (attrs == null) {
            LOGGER.debug("Could not find principal [{}] in the repository so no attributes are returned.", id);
            return Collections.emptyMap();
        }

        final Map<String, List<Object>> attributes = attrs.getAttributes();
        if (attributes == null) {
            LOGGER.debug("Principal [{}] has no attributes and so none are returned.", id);
            return Collections.emptyMap();
        }
        return attributes;
    }

    @Override
    @PreDestroy
    public void close() throws IOException {
        this.cache.close();
        this.cache.getCacheManager().close();
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("attributeRepository", attributeRepository)
                .append("cache", cache)
                .append("cacheName", cacheName)
                .append("durationTimeUnit", duration.getTimeUnit())
                .append("durationAmount", duration.getDurationAmount())
                .append("mergingStrategy", mergingStrategy)
                .toString();
    }

    @Override
    public boolean equals(final Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj == this) {
            return true;
        }
        if (obj.getClass() != getClass()) {
            return false;
        }
        final CachingPrincipalAttributesRepository rhs = (CachingPrincipalAttributesRepository) obj;
        final EqualsBuilder builder = new EqualsBuilder();
        return builder
                .append(this.duration, rhs.duration)
                .isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder(13, 133)
                .append(duration)
                .toHashCode();
    }

}


text:
3185 - Examining Racial Equality: Durham Public Schools over the Past 50 Years
This course will examine racial equality in Durham Public Schools. Required reading for the class will be Osha Gray Davidson's book "The Best of Enemies: Race and Redemption in the New South," which provides an in-depth history of Durham's race relations from its inception in 1869 to 1996. Students will be asked to reflect upon Durham's historical race relations to evaluate objectively how far the city has progressed, particularly regarding racial equality in its educational system. Participants will have an opportunity to discuss Davidson's book; hear from speakers who knew Ann Atwater and C. P. Ellis; and interact with educators, retired public servants, and students who contributed to and experienced DPS's evolution. In addition, the class will be given the opportunity to explore ways to support DPS's racial equality efforts now and in the future. | Lecture + Q&A.
Examining Racial Equality: Durham Public Schools over the Past 50 Years
Tuition non-credit $90.00 Click here to get more information
Susan Dennison
Marion Jervay
Class sessions are recorded. (Please note additional required information below)
Guest Information:
Bill Bell, Former Mayor of Durham
Kelvin Bullock, Executive Director of DPS Office of Equity Affairs
Osha Gray Davidson, Author of "The Best of Enemies: Race and Redemption in the New South"
Eddie Davis, Former DPS Teacher and Former Member of the North Carolina State Board of Education
Floyd McKissick Jr., Former DPS Student and Son of Floyd McKissick Sr.
Bill Riddick, Consultant, Conducted the Charrette
Helen "Sunny" Ladd, Susan B. King Professor Emerita of Public Policy and Economics at Duke's Sanford School of Public Policy
Magan Gonzales-Smith, Executive Director of DPS Foundation
Required: Students are expected to read the assigned book before the course begins. Required reading: Osha Gray Davidson, The Best of Enemies (9780807858691)
Ibram Kendi, How to be an Antiracist (9781847925992)
Debbie Irving, Waking up White (9780991331307)
3185 - 001 - Examining Racial Equality: Durham Public Schools over the Past 50 Years
Susan Dennison is a retired academic who helped design and open the first Joint Master of Social Work program at a historically Black college or university (HBCU) and what had been the white Woman's College (UNC-Greensboro). Susan's research and publications have focused on school treatment programs for at-risk K-12 students. She served 25 years as a national school consultant.
Marion Jervay is a retired transactional attorney for business/academic entities. She is a graduate of UNC-Wilmington and Duke Law School. Marion is a rarity within OLLI because she is a native North Carolinian who grew up in Raleigh in a small African American community. She attended parochial schools, including Cardinal Gibbons High School, which provided her with a unique integrated experience in the 1960s.


The Ancient Celtic Church continues an old church tradition for people of the current time. Find out more about the modern Celtic spirituality of the Ancient Celtic Church or about News in the Bulletin.
The Ancient Celtic Church is a community of nature connection and is part of the reconstruction movement of the Celtic Christian Spirituality starting in the 1950ies and 60ies in France and England. The Ancient Celtic Church is an open, inclusive, emancipated, universal community in the Celtic tradition. The name of the church originated from its founder Saint Tugdual´s Hermitage of the Ancient Celtic Church. St. Tugdual was the Archbishop of the Holy Celtic Church and druid member of the Breton Gorsedd. Modern Druidry and Celtic Christianity can well be combined and together with the Arthurian Grail Quest it makes the spirit of the Ancient Celtic Church as we understand it today.


Work orders should be submitted for non-emergency housing maintenance requests. The first time you submit a request, you will need to register. Thereafter, your contact information will pull up automatically. Please make sure to complete all fields on the work order form (name, email, building, area, room, etc). This information will help us to respond to your work order request in a timely manner.
For all internet or phone issues, please DO NOT submit a maintenance request. Instead, contact the USF IT Help desk at help@usf.edu or 813-974-1222 for 24/7 support.
Please fill out the registration information on the next page. Follow the prompts to setup your account.
The account number is 107698592.
At the bottom of the maintenance request page, you will be prompted to enter the submittal password. Please enter "usf" as the password.
Click "Submit a Maintenance Request."
On the next page, select "Forgot Password?"


text:
package com.facebook.react.uimanager;

import javax.annotation.Nullable;
import javax.annotation.concurrent.GuardedBy;

import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

import com.facebook.react.animation.Animation;
import com.facebook.react.animation.AnimationRegistry;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.SoftAssertions;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener;
import com.facebook.systrace.Systrace;
import com.facebook.systrace.SystraceMessage;

/**
 * This class acts as a buffer for command executed on {@link NativeViewHierarchyManager} or on
 * {@link AnimationRegistry}. It expose similar methods as mentioned classes but instead of
 * executing commands immediately it enqueues those operations in a queue that is then flushed from
 * {@link UIManagerModule} once JS batch of ui operations is finished. This is to make sure that we
 * execute all the JS operation coming from a single batch a single loop of the main (UI) android
 * looper.
 *
 * TODO(7135923): Pooling of operation objects
 * TODO(5694019): Consider a better data structure for operations queue to save on allocations
 */
public class UIViewOperationQueue {

  private final int[] mMeasureBuffer = new int[4];

  /**
   * A mutation or animation operation on the view hierarchy.
   */
  protected interface UIOperation {

    void execute();
  }

  /**
   * A spec for an operation on the native View hierarchy.
   */
  private abstract class ViewOperation implements UIOperation {

    public int mTag;

    public ViewOperation(int tag) {
      mTag = tag;
    }
  }

  private final class RemoveRootViewOperation extends ViewOperation {

    public RemoveRootViewOperation(int tag) {
      super(tag);
    }

    @Override
    public void execute() {
      mNativeViewHierarchyManager.removeRootView(mTag);
    }
  }

  private final class UpdatePropertiesOperation extends ViewOperation {

    private final ReactStylesDiffMap mProps;

    private UpdatePropertiesOperation(int tag, ReactStylesDiffMap props) {
      super(tag);
      mProps = props;
    }

    @Override
    public void execute() {
      mNativeViewHierarchyManager.updateProperties(mTag, mProps);
    }
  }

  /**
   * Operation for updating native view's position and size. The operation is not created directly
   * by a {@link UIManagerModule} call from JS. Instead it gets inflated using computed position
   * and size values by CSSNode hierarchy.
   */
  private final class UpdateLayoutOperation extends ViewOperation {

    private final int mParentTag, mX, mY, mWidth, mHeight;

    public UpdateLayoutOperation(
        int parentTag,
        int tag,
        int x,
        int y,
        int width,
        int height) {
      super(tag);
      mParentTag = parentTag;
      mX = x;
      mY = y;
      mWidth = width;
      mHeight = height;
      Systrace.startAsyncFlow(Systrace.TRACE_TAG_REACT_VIEW, "updateLayout", mTag);
    }

    @Override
    public void execute() {
      Systrace.endAsyncFlow(Systrace.TRACE_TAG_REACT_VIEW, "updateLayout", mTag);
      mNativeViewHierarchyManager.updateLayout(mParentTag, mTag, mX, mY, mWidth, mHeight);
    }
  }

  private final class CreateViewOperation extends ViewOperation {

    private final ThemedReactContext mThemedContext;
    private final String mClassName;
    private final @Nullable ReactStylesDiffMap mInitialProps;

    public CreateViewOperation(
        ThemedReactContext themedContext,
        int tag,
        String className,
        @Nullable ReactStylesDiffMap initialProps) {
      super(tag);
      mThemedContext = themedContext;
      mClassName = className;
      mInitialProps = initialProps;
      Systrace.startAsyncFlow(Systrace.TRACE_TAG_REACT_VIEW, "createView", mTag);
    }

    @Override
    public void execute() {
      Systrace.endAsyncFlow(Systrace.TRACE_TAG_REACT_VIEW, "createView", mTag);
      mNativeViewHierarchyManager.createView(
          mThemedContext,
          mTag,
          mClassName,
          mInitialProps);
    }
  }

  private final class ManageChildrenOperation extends ViewOperation {

    private final @Nullable int[] mIndicesToRemove;
    private final @Nullable ViewAtIndex[] mViewsToAdd;
    private final @Nullable int[] mTagsToDelete;

    public ManageChildrenOperation(
        int tag,
        @Nullable int[] indicesToRemove,
        @Nullable ViewAtIndex[] viewsToAdd,
        @Nullable int[] tagsToDelete) {
      super(tag);
      mIndicesToRemove = indicesToRemove;
      mViewsToAdd = viewsToAdd;
      mTagsToDelete = tagsToDelete;
    }

    @Override
    public void execute() {
      mNativeViewHierarchyManager.manageChildren(
          mTag,
          mIndicesToRemove,
          mViewsToAdd,
          mTagsToDelete);
    }
  }

  private final class UpdateViewExtraData extends ViewOperation {

    private final Object mExtraData;

    public UpdateViewExtraData(int tag, Object extraData) {
      super(tag);
      mExtraData = extraData;
    }

    @Override
    public void execute() {
      mNativeViewHierarchyManager.updateViewExtraData(mTag, mExtraData);
    }
  }

  private final class ChangeJSResponderOperation extends ViewOperation {

    private final int mInitialTag;
    private final boolean mBlockNativeResponder;
    private final boolean mClearResponder;

    public ChangeJSResponderOperation(
        int tag,
        int initialTag,
        boolean clearResponder,
        boolean blockNativeResponder) {
      super(tag);
      mInitialTag = initialTag;
      mClearResponder = clearResponder;
      mBlockNativeResponder = blockNativeResponder;
    }

    @Override
    public void execute() {
      if (!mClearResponder) {
        mNativeViewHierarchyManager.setJSResponder(mTag, mInitialTag, mBlockNativeResponder);
      } else {
        mNativeViewHierarchyManager.clearJSResponder();
      }
    }
  }

  private final class DispatchCommandOperation extends ViewOperation {

    private final int mCommand;
    private final @Nullable ReadableArray mArgs;

    public DispatchCommandOperation(int tag, int command, @Nullable ReadableArray args) {
      super(tag);
      mCommand = command;
      mArgs = args;
    }

    @Override
    public void execute() {
      mNativeViewHierarchyManager.dispatchCommand(mTag, mCommand, mArgs);
    }
  }

  private final class ShowPopupMenuOperation extends ViewOperation {

    private final ReadableArray mItems;
    private final Callback mSuccess;

    public ShowPopupMenuOperation(
        int tag,
        ReadableArray items,
        Callback success) {
      super(tag);
      mItems = items;
      mSuccess = success;
    }

    @Override
    public void execute() {
      mNativeViewHierarchyManager.showPopupMenu(mTag, mItems, mSuccess);
    }
  }

  /**
   * A spec for animation operations (add/remove)
   */
  private static abstract class AnimationOperation implements UIViewOperationQueue.UIOperation {

    protected final int mAnimationID;

    public AnimationOperation(int animationID) {
      mAnimationID = animationID;
    }
  }

  private class RegisterAnimationOperation extends AnimationOperation {

    private final Animation mAnimation;

    private RegisterAnimationOperation(Animation animation) {
      super(animation.getAnimationID());
      mAnimation = animation;
    }

    @Override
    public void execute() {
      mAnimationRegistry.registerAnimation(mAnimation);
    }
  }

  private class AddAnimationOperation extends AnimationOperation {
    private final int mReactTag;
    private final Callback mSuccessCallback;

    private AddAnimationOperation(int reactTag, int animationID, Callback successCallback) {
      super(animationID);
      mReactTag = reactTag;
      mSuccessCallback = successCallback;
    }

    @Override
    public void execute() {
      Animation animation = mAnimationRegistry.getAnimation(mAnimationID);
      if (animation != null) {
        mNativeViewHierarchyManager.startAnimationForNativeView(
            mReactTag,
            animation,
            mSuccessCallback);
      } else {
        // node or animation not found
        // TODO(5712813): cleanup callback in JS callbacks table in case of an error
        throw new IllegalViewOperationException("Animation with id " + mAnimationID
            + " was not found");
      }
    }
  }

  private final class RemoveAnimationOperation extends AnimationOperation {

    private RemoveAnimationOperation(int animationID) {
      super(animationID);
    }

    @Override
    public void execute() {
      Animation animation = mAnimationRegistry.getAnimation(mAnimationID);
      if (animation != null) {
        animation.cancel();
      }
    }
  }

  private class SetLayoutAnimationEnabledOperation implements UIOperation {
    private final boolean mEnabled;

    private SetLayoutAnimationEnabledOperation(final boolean enabled) {
      mEnabled = enabled;
    }

    @Override
    public void execute() {
      mNativeViewHierarchyManager.setLayoutAnimationEnabled(mEnabled);
    }
  }

  private class ConfigureLayoutAnimationOperation implements UIOperation {
    private final ReadableMap mConfig;

    private ConfigureLayoutAnimationOperation(final ReadableMap config) {
      mConfig = config;
    }

    @Override
    public void execute() {
      mNativeViewHierarchyManager.configureLayoutAnimation(mConfig);
    }
  }

  private final class MeasureOperation implements UIOperation {

    private final int mReactTag;
    private final Callback mCallback;

    private MeasureOperation(
        final int reactTag,
        final Callback callback) {
      super();
      mReactTag = reactTag;
      mCallback = callback;
    }

    @Override
    public void execute() {
      try {
        mNativeViewHierarchyManager.measure(mReactTag, mMeasureBuffer);
      } catch (NoSuchNativeViewException e) {
        // Invoke with no args to signal failure and to allow JS to clean up the callback
        // handle.
        mCallback.invoke();
        return;
      }

      float x = PixelUtil.toDIPFromPixel(mMeasureBuffer[0]);
      float y = PixelUtil.toDIPFromPixel(mMeasureBuffer[1]);
      float width = PixelUtil.toDIPFromPixel(mMeasureBuffer[2]);
      float height = PixelUtil.toDIPFromPixel(mMeasureBuffer[3]);
      mCallback.invoke(0, 0, width, height, x, y);
    }
  }

  private ArrayList<UIOperation> mOperations = new ArrayList<>();

  private final class FindTargetForTouchOperation implements UIOperation {

    private final int mReactTag;
    private final float mTargetX;
    private final float mTargetY;
    private final Callback mCallback;

    private FindTargetForTouchOperation(
        final int reactTag,
        final float targetX,
        final float targetY,
        final Callback callback) {
      super();
      mReactTag = reactTag;
      mTargetX = targetX;
      mTargetY = targetY;
      mCallback = callback;
    }

    @Override
    public void execute() {
      try {
        mNativeViewHierarchyManager.measure(
            mReactTag,
            mMeasureBuffer);
      } catch (IllegalViewOperationException e) {
        mCallback.invoke();
        return;
      }

      // Because React coordinates are relative to root container, and measure() operates
      // on screen coordinates, we need to offset values using root container location.
      final float containerX = (float) mMeasureBuffer[0];
      final float containerY = (float) mMeasureBuffer[1];

      final int touchTargetReactTag = mNativeViewHierarchyManager.findTargetTagForTouch(
          mReactTag,
          mTargetX,
          mTargetY);

      try {
        mNativeViewHierarchyManager.measure(
            touchTargetReactTag,
            mMeasureBuffer);
      } catch (IllegalViewOperationException e) {
        mCallback.invoke();
        return;
      }

      float x = PixelUtil.toDIPFromPixel(mMeasureBuffer[0] - containerX);
      float y = PixelUtil.toDIPFromPixel(mMeasureBuffer[1] - containerY);
      float width = PixelUtil.toDIPFromPixel(mMeasureBuffer[2]);
      float height = PixelUtil.toDIPFromPixel(mMeasureBuffer[3]);
      mCallback.invoke(touchTargetReactTag, x, y, width, height);
    }
  }

  private final class SendAccessibilityEvent extends ViewOperation {

    private final int mEventType;

    private SendAccessibilityEvent(int tag, int eventType) {
      super(tag);
      mEventType = eventType;
    }

    @Override
    public void execute() {
      mNativeViewHierarchyManager.sendAccessibilityEvent(mTag, mEventType);
    }
  }

  private final NativeViewHierarchyManager mNativeViewHierarchyManager;
  private final AnimationRegistry mAnimationRegistry;

  private final Object mDispatchRunnablesLock = new Object();
  private final DispatchUIFrameCallback mDispatchUIFrameCallback;
  private final ReactApplicationContext mReactApplicationContext;

  @GuardedBy("mDispatchRunnablesLock")
  private final ArrayList<Runnable> mDispatchUIRunnables = new ArrayList<>();

  private @Nullable NotThreadSafeViewHierarchyUpdateDebugListener mViewHierarchyUpdateDebugListener;

  public UIViewOperationQueue(
      ReactApplicationContext reactContext,
      NativeViewHierarchyManager nativeViewHierarchyManager) {
    mNativeViewHierarchyManager = nativeViewHierarchyManager;
    mAnimationRegistry = nativeViewHierarchyManager.getAnimationRegistry();
    mDispatchUIFrameCallback = new DispatchUIFrameCallback(reactContext);
    mReactApplicationContext = reactContext;
  }

  public void setViewHierarchyUpdateDebugListener(
      @Nullable NotThreadSafeViewHierarchyUpdateDebugListener listener) {
    mViewHierarchyUpdateDebugListener = listener;
  }

  public boolean isEmpty() {
    return mOperations.isEmpty();
  }

  public void addRootView(
      final int tag,
      final SizeMonitoringFrameLayout rootView,
      final ThemedReactContext themedRootContext) {
    if (UiThreadUtil.isOnUiThread()) {
      mNativeViewHierarchyManager.addRootView(tag, rootView, themedRootContext);
    } else {
      final Semaphore semaphore = new Semaphore(0);
      mReactApplicationContext.runOnUiQueueThread(
          new Runnable() {
            @Override
            public void run() {
              mNativeViewHierarchyManager.addRootView(tag, rootView, themedRootContext);
              semaphore.release();
            }
          });
      try {
        SoftAssertions.assertCondition(
            semaphore.tryAcquire(5000, TimeUnit.MILLISECONDS),
            "Timed out adding root view");
      } catch (InterruptedException e) {
        throw new RuntimeException(e);
      }
    }
  }

  /**
   * Enqueues a UIOperation to be executed in UI thread. This method should only be used by a
   * subclass to support UIOperations not provided by UIViewOperationQueue.
   */
  protected void enqueueUIOperation(UIOperation operation) {
    mOperations.add(operation);
  }

  public void enqueueRemoveRootView(int rootViewTag) {
    mOperations.add(new RemoveRootViewOperation(rootViewTag));
  }

  public void enqueueSetJSResponder(
      int tag,
      int initialTag,
      boolean blockNativeResponder) {
    mOperations.add(
        new ChangeJSResponderOperation(
            tag,
            initialTag,
            false /*clearResponder*/,
            blockNativeResponder));
  }

  public void enqueueClearJSResponder() {
    // Tag is 0 because JSResponderHandler doesn't need one in order to clear the responder.
    mOperations.add(new ChangeJSResponderOperation(0, 0, true /*clearResponder*/, false));
  }

  public void enqueueDispatchCommand(
      int reactTag,
      int commandId,
      ReadableArray commandArgs) {
    mOperations.add(new DispatchCommandOperation(reactTag, commandId, commandArgs));
  }

  public void enqueueUpdateExtraData(int reactTag, Object extraData) {
    mOperations.add(new UpdateViewExtraData(reactTag, extraData));
  }

  public void enqueueShowPopupMenu(
      int reactTag,
      ReadableArray items,
      Callback error,
      Callback success) {
    mOperations.add(new ShowPopupMenuOperation(reactTag, items, success));
  }

  public void enqueueCreateView(
      ThemedReactContext themedContext,
      int viewReactTag,
      String viewClassName,
      @Nullable ReactStylesDiffMap initialProps) {
    mOperations.add(
        new CreateViewOperation(
            themedContext,
            viewReactTag,
            viewClassName,
            initialProps));
  }

  public void enqueueUpdateProperties(int reactTag, String className, ReactStylesDiffMap props) {
    mOperations.add(new UpdatePropertiesOperation(reactTag, props));
  }

  public void enqueueUpdateLayout(
      int parentTag,
      int reactTag,
      int x,
      int y,
      int width,
      int height) {
    mOperations.add(
        new UpdateLayoutOperation(parentTag, reactTag, x, y, width, height));
  }

  public void enqueueManageChildren(
      int reactTag,
      @Nullable int[] indicesToRemove,
      @Nullable ViewAtIndex[] viewsToAdd,
      @Nullable int[] tagsToDelete) {
    mOperations.add(
        new ManageChildrenOperation(reactTag, indicesToRemove, viewsToAdd, tagsToDelete));
  }

  public void enqueueRegisterAnimation(Animation animation) {
    mOperations.add(new RegisterAnimationOperation(animation));
  }

  public void enqueueAddAnimation(
      final int reactTag,
      final int animationID,
      final Callback onSuccess) {
    mOperations.add(new AddAnimationOperation(reactTag, animationID, onSuccess));
  }

  public void enqueueRemoveAnimation(int animationID) {
    mOperations.add(new RemoveAnimationOperation(animationID));
  }

  public void enqueueSetLayoutAnimationEnabled(
      final boolean enabled) {
    mOperations.add(new SetLayoutAnimationEnabledOperation(enabled));
  }

  public void enqueueConfigureLayoutAnimation(
      final ReadableMap config,
      final Callback onSuccess,
      final Callback onError) {
    mOperations.add(new ConfigureLayoutAnimationOperation(config));
  }

  public void enqueueMeasure(
      final int reactTag,
      final Callback callback) {
    mOperations.add(
        new MeasureOperation(reactTag, callback));
  }

  public void enqueueFindTargetForTouch(
      final int reactTag,
      final float targetX,
      final float targetY,
      final Callback callback) {
    mOperations.add(
        new FindTargetForTouchOperation(reactTag, targetX, targetY, callback));
  }

  public void enqueueSendAccessibilityEvent(int tag, int eventType) {
    mOperations.add(new SendAccessibilityEvent(tag, eventType));
  }

  /* package */ void dispatchViewUpdates(final int batchId) {
    // Store the current operation queues to dispatch and create new empty ones to continue
    // receiving new operations
    final ArrayList<UIOperation> operations = mOperations.isEmpty() ? null : mOperations;
    if (operations != null) {
      mOperations = new ArrayList<>();
    }

    if (mViewHierarchyUpdateDebugListener != null) {
      mViewHierarchyUpdateDebugListener.onViewHierarchyUpdateEnqueued();
    }

    synchronized (mDispatchRunnablesLock) {
      mDispatchUIRunnables.add(
          new Runnable() {
             @Override
             public void run() {
               SystraceMessage.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "DispatchUI")
                   .arg("BatchId", batchId)
                   .flush();
               try {
                 if (operations != null) {
                   for (int i = 0; i < operations.size(); i++) {
                     operations.get(i).execute();
                   }
                 }

                 // Clear layout animation, as animation only apply to current UI operations batch.
                 mNativeViewHierarchyManager.clearLayoutAnimation();

                 if (mViewHierarchyUpdateDebugListener != null) {
                   mViewHierarchyUpdateDebugListener.onViewHierarchyUpdateFinished();
                 }
               } finally {
                 Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE);
               }
             }
           });
    }
  }

  /* package */ void resumeFrameCallback() {
    ReactChoreographer.getInstance()
        .postFrameCallback(ReactChoreographer.CallbackType.DISPATCH_UI, mDispatchUIFrameCallback);
  }

  /* package */ void pauseFrameCallback() {

    ReactChoreographer.getInstance()
        .removeFrameCallback(ReactChoreographer.CallbackType.DISPATCH_UI, mDispatchUIFrameCallback);
  }

  /**
   * Choreographer FrameCallback responsible for actually dispatching view updates on the UI thread
   * that were enqueued via {@link #dispatchViewUpdates(int)}. The reason we don't just enqueue
   * directly to the UI thread from that method is to make sure our Runnables actually run before
   * the next traversals happen:
   *
   * ViewRootImpl#scheduleTraversals (which is called from invalidate, requestLayout, etc) calls
   * Looper#postSyncBarrier which keeps any UI thread looper messages from being processed until
   * that barrier is removed during the next traversal. That means, depending on when we get updates
   * from JS and what else is happening on the UI thread, we can sometimes try to post this runnable
   * after ViewRootImpl has posted a barrier.
   *
   * Using a Choreographer callback (which runs immediately before traversals), we guarantee we run
   * before the next traversal.
   */
  private class DispatchUIFrameCallback extends GuardedChoreographerFrameCallback {

    private DispatchUIFrameCallback(ReactContext reactContext) {
      super(reactContext);
    }

    @Override
    public void doFrameGuarded(long frameTimeNanos) {
      synchronized (mDispatchRunnablesLock) {
        for (int i = 0; i < mDispatchUIRunnables.size(); i++) {
          mDispatchUIRunnables.get(i).run();
        }
        mDispatchUIRunnables.clear();
      }

      ReactChoreographer.getInstance().postFrameCallback(
          ReactChoreographer.CallbackType.DISPATCH_UI, this);
    }
  }
}


Sometimes, you're not the victim of merchandise productivity declines. Instead, the real problem is changes in creative strategy.
Back in the day, at Lands' End, we knew that creative could cause a +/- 30% change the productivity of an item. We knew that because we tested the strategy.
Most companies don't test creative. I'll take you back to my time at Eddie Bauer. We built a brand marketing department, from scratch. The brand marketing folks absorbed the creative team. Together, it was determined that our catalogs needed to "get younger". No, not from a merchandising standpoint, but from a creative standpoint. Out went the grizzled 40 year old male in jeans fly fishing ... in came shirtless twenty-five year old men carrying a canoe overhead.
Within hours of the change, sales dropped, by between 10% and 15%. And that's where they stayed. Sometimes we tumbled to -20%, other times -5%, but overall, it wasn't pretty.
Our catalog marketing team was responsible for prospect catalogs. We didn't change the creative of prospect catalogs ... the rules for those things were "best creative / best merchandise". Those catalogs stayed on plan.
You'd think we would have been rewarded for not sending the entire business down the toilet, but no. The creative folks were constantly badgering me ... "you are the problem, you acquire old customers and then old customers don't respond to our creative changes." I'd remind the creative team that 97% of our twelve-month buyer file came on prior to the creative changes ... so I was hardly the problem. Didn't matter.
I am always amazed by how few employees are actually motivated by sales, and by profit, especially given the fact that the small number of employees who are motivated by sales and profit seem to climb the corporate ladder much, much faster than everybody else. During that experience, back in the late 1990s, a large team of marketers / creatives cared about creative faith more than sales proof.
Maybe it's always been that way.
But as a marketer, you have the ability to put a stop to creative nonsense. Use the comp segment framework to measure the problem. Put a number to the problem. At Eddie Bauer, we could show that the creative changes were costing us $60,000,000 of demand and $15,000,000 profit. It's funny ... the Finance folks become alarmed when $15,000,000 of profit disappear in an effort to make creative imagery look appealing to younger customers.
Marketers have a disproportionate amount of impact on the business. When a marketer helps a company avoid a $15,000,000 cliff, people take notice.
Don't focus on omnichannel theory that helps generate page views and revenue for folks who do not work at your company.
Focus on helping your co-workers achieve their potential.


Its pronounced hicema. A root veggie that resembles a large turnip that you peel like a potato and tastes something of a combination of an apple/green bean maybe?
Whatever it is its darn good!
I have seen it used many times on tv and in magazines and for the life of me I wasn't sure why we'd never had it before until last night! It is commonly eaten raw - which is how I prepared it but I've also seen recipes for soups and stir frys using the veg.
Since yesterday was Cinco de Mayo and we had Chipotle Chicken Quesadillas I thought this salad fitting as a side.
First thing I did was peel and cut the jicama into matchstick pieces so that I could try it out and I have to say it took me a little bit to put it to my lips.
I actually gave it to Little Ugh first and said "here, you'll like it".
I'm not sure why I felt his palate would encourage me to try it, maybe seeing his reaction?
He tried to tell me it tasted like onion - could have been that I was chopping onion prior too - teehee he is not a fan of onions. But he didn't spit it out or cringe so I being the brave mom that I am threw a whole chunk in my mouth.
By George! I think I love it!
Folks, Jicama gets 2 thumbs up from this gal!
Add in your leaf lettuce and toss around.
To make your dressing, simply add all ingredients into a bowl and whisk together.
Drizzle 1/2 over the salad and mix to coat. I found that this recipe made quite a lot of dressing and didn't want to feel like it was swimming so add a bit more if you need to.
They are crunchy and juicy when you bite to them. Yeah we used to eat them like fruit. Great idea to put in salad and looks yummy!


Picking has really ramped up over the past two weeks, literally bring all our hard work to fruition in our main test patch of strawberries!
What started out as just a few berries quickly increased few punnets and on to a few kilograms per day, and with many of our berry IOU's cleared we had to secure our first sales asap.
Claire has become the 'strawberry lady' at work and Pete has been delivering regularly to Daylesford Health Foods & Organics, helping to clear all the punnets we pick and set up a regular sales outlet in Daylesford.
This has made everyone on the farm very happy, with the chickens and goats getting lots of strawberry ends, dogs getting fun time in the sun, the only ones left unhappy were the birds on account of the frost cloth being changed out for netting!
Remember to like us on Facebook and Instagram to see the latest from the team.