text:
Diversity in U.S. Law Firms: 'It's Always Going to Be Incremental'
Post author By Doug Saphire
Photo by Christina Morillo on Pexels.com
By Susan Kostal for attorneyatwork.com
NALP's report on law firm diversity in the U.S. shows little improvement, as pandemic pressures stoke concern that even incremental progress is at risk.
Spoiler alert: Reading the findings in NALP's 2020 Report on Diversity in U.S. Law Firms was hardly cause for celebration.
The annual report, released by the National Association of Law Placement in early February, shows "incremental progress" for women and attorneys of color in major U.S. law firms. Drawn from analysis of the NALP Directory of Legal Employers (NDLE), which focuses on Big Law but includes more than 1,000 public and private legal employers, you need to squint at some tables and charts to see any upward tilt in the trendlines.
Alexis Robertson, Director of Diversity & Inclusion at Foley, summarized the findings for Black lawyers in a LinkedIn post:
"In 2020, the percentage of Black associates surpassed 5% for the first time.
Black women associates (3.04%) finally exceeded the 2009 figure of 2.93%. Despite these increases, Black women's representation at the associate level has increased by just one-tenth of a percentage point over 11 years.
The percentage of Black partners overall finally surpassed 2% for the first time since NALP began collecting data. The percentage of equity partners of color rose from 4.4% in 2019 to 4.5% in 2020.
Based on the above, it's clear that Black equity partners represent less than 1% of law firm equity partners (likely far less than 1%).
To put it another way, the U.S. has had a higher percentage of Black U.S. Presidents than large law firms have of Black equity partners."
"Every year when these numbers come out, it's disheartening," Robertson said in an interview.
"But I am also very familiar with the pace of change. We should not expect to see orders of magnitude year over year. Diversifying the partnership with homegrown talent takes a decade. It's always going to be incremental," she said.
Robertson said firms have been focusing on pro bono work and financial support of racial justice organizations and improving training around implicit bias. "But if we really want to see change speed up, we need to look at the overall picture, at the holistic talent management systems in organizations. And it remains to be seen if all law firms will make a big investment there."
The Stats on Diversity in U.S. Firms Tell a Familiar Tale
People of color enter law firms but leave, for a variety of reasons, before hitting partnership. "It can be very hard to get traction, to get good work, with good clients that matter, to find a sponsor," Robertson said. Ultimately, firms are focused on the business as a whole, but not so much on getting the ideal training for associates based on their interests and goals and focusing on individual success.
"I would love to say that this gives midsized firms and small firms an advantage," Robertson said. "But they fall into the same trap of relying on internal referrals for hiring, and so they hire more of the same."
One Small Firm Solution
Not always. Meyers Nave, a 62-attorney California firm, was one of the first among very few U.S. law firms with a minority woman as managing principal. Jayne Williams, former Oakland City Attorney, served as the firm's managing principal for two terms, from 2004 to 2010. Today, women and minority attorneys make up 77% of Meyers Nave attorneys.
But it wasn't always this way. Despite Williams' leadership, the firm still had some "difficult conversations" seven or eight years ago when it committed formally to a more diverse firm and partnership, said principal Eric Casher. Casher chairs the firm's Diversity Committee and is chair of its Municipal and Special District Law Practice Group and a board member of the California Minority Counsel Program.
Like many small and midsize firms, the firm does not have a summer program or participate in on-campus interviewing. So, the firm launched a Diversity Fellowship Program in 2017.
The Diversity Fellowship offers 1Ls a paid, full-time 10-week fellowship, with possible extension to a second year, and $10,000 in tuition assistance following each completed summer program.
The second fellow in the program, Shandyn Pierce, joined the firm in 2020 as an associate after two years as a fellow, often working under Casher. Pierce said he went to law school to be a "servant leader" in his community and realized he could do that within the context of a law firm.
Casher himself was not in the top 25% of his class, nor did he go to a top 50 law school. After two years, he moved to Meyers Nave. "I got a big firm job, but it wasn't because of my grades," he said. "I want someone who is scrappy and hungry. They come off the struggle bus and are willing to work hard."
When recruiting laterals, the firm has its own version of the Rooney Rule, in which practice group leaders must advertise openings at affinity bar associations (the Hispanic National Bar Association, for instance) to build the right kind of candidate pool before looking elsewhere.
The firm also has a partnership track for reduced-time employees (those working an 80% schedule) and has elevated several reduced-time attorneys to principal.
Debating the Pipeline Problem: A Common Refrain
Many law schools, from No. 1 ranked Yale, to Berkeley Law at No. 9, to UC Hastings, at No. 59, are enrolling "majority minority" classes, according to data reported per ABA requirements. This year at Yale, there are 16 1Ls who identify as Black or African American among the 107 minority students. There are 99 white 1Ls in a class of 209.
Many local bar associations have outreach programs in which they send panels of diverse attorneys to speak at local colleges (here's just one). And law schools are stepping up. UC Hastings, for example, has two programs targeting Black applicants. Its California Scholars program provides a full three-year scholarship to graduates of HBCUs (historically black colleges and universities). The college also has an accelerated joint degree program with Spelman College, the top women's HBCU. Qualified graduates can complete their undergrad and law degrees in six years, with scholarship funding.
"We'd like to pretend we have a pipeline problem, but we don't," Robertson says. But when firms limit their on-campus interviews and hiring targets to the top graduates of the top 10 or 20 schools, and perhaps a local law school, they miss a huge swath of talent. "We know that we cannot only look to the top schools as a proxy for excellence," she said. The result: hundreds of firms fighting over the same small crop of top achievers, at least by traditional definitions.
"There's a lot to be said for someone who goes to law school while working part-time. A person with a B average, or something other than the prototypical path, will do well in a law firm environment in terms of grit and resilience. But right now, large law firms are not particularly good at assessing that," Robertson said.
So, Where Are Black Law Grads Going?
To help gauge that, I spoke with Carmia Caesar, Assistant Dean of Career Services at Howard University School of Law. Of the 112 graduates of the class of 2019 employed at the 10-month post-graduation mark, 35 were in law firms, 26 were in government positions, 13 were in public interest jobs, 11 had clerkships, and one was in a graduate program.
"Our numbers have been steady for the last 10 to 20 years," Caesar said. "Howard has always been a top producer for graduates going into large, top-ranked law firms."
But when they don't find good work, good mentoring, and the possibility of advancement, they move to more receptive spaces, she said.
Will #BLM Help? What About Coca-Cola?
Since George Floyd was killed in May 2020 after a white police officer kneeled on his neck, putting new focus on the Black Lives Matter movement, firms are acknowledging "they have work to do, and that work includes bringing in lateral attorneys," said Merle Vaughn, a partner with Major, Lindsey & Africa and the recruiting firm's National Law Firm Diversity Practice Leader. But even then, after introducing a new hire to their new partners, most firms simply leave them to sink or swim. "There are firms that are doing a much better job with the integration process, and it starts in the interview," Vaughn said, with a discussion of a strategy to create a win-win for the lateral and the firm.
Turnover for diverse lawyers tends to be higher at the associate level.
"Once you make partner, you are less likely to leave," Vaughn said. In fact, "diverse lawyers and even women tend to be more loyal to their firms."
Some firms are starting to strategically recruit lateral partners to serve certain clients. "When clients say they want more diverse lawyers on their matters, some firms are recruiting intentionally for these opportunities," Vaughn said. That kind of tailor-made recruiting can often immediately make a difference for a firm.
Enter stage left the Coca-Cola Co. In January, Coca-Cola's general counsel, Bradley Gayton, announced he was tired of "good intentions" and that law firms working on new matters will have to meet stringent new diversity guidelines or face stiff penalties — including a 30% haircut on fees, or losing the beverage giant's business.
Gayton wrote:
"We have developed scorecards, held summits, established committees and written action plans. These efforts are not working. I'm reminded of this by the alarming number of new partner headshots that continue to be proudly published with an obvious lack of diversity, and then I read that Black equity partners will not reach parity with the Black U.S. population until 2391."
Firms need to make systemic changes for diverse attorneys to stay. "Firms are happy to celebrate Juneteenth or serve cookies on Martin Luther King Jr. Day, but they do not want to reevaluate their policies on origination credit," said Sonya Olds Som, a partner with Heidrick & Struggles who focuses on in-house legal recruiting. Firms may brag about the number of Black first-year associates, but who is still around in seven years, and wants to commit to that firm, is ultimately more important.
"Women and minorities have increased opportunities in-house," Som said. "It's not just about how much business you bring in. EQ (emotional intelligence) skills matter, leadership skills, collaboration and culture matter, and the ability to connect with those who aren't lawyers, internally and externally."
What's the Future Hold for Law Firm Diversity?
A just-released survey from the American Bar Association predicts that many lawyers, but especially women with children and lawyers of color, feel overwhelmed by pandemic-exacerbated pressures — with many considering leaving the profession. If those fears are borne out, we will be mourning the loss of even the lackluster but steady "incremental progress."
But if they stay, these attorneys have a shot at taking over the client relationships as baby boomer partners retire. Focusing on intentional transitions and "legacy recruiting" can pacify clients and change firms.
Som is optimistic. "I hope this pandemic helps firms find a way to challenge a long list of long-held assumptions," she said. Now that attorneys have proved they can successfully work remotely, more will be voting with their feet and switching firms if faced with rigid requirements for face time, she predicts.
Meyers Nave took its own public position on the pipeline problem. The firm publicly supported California's Prop 16 on the November 2020 ballot. The measure, which ultimately failed, would have been the first step in curtailing the state's infamous Prop 209, which did away with race and gender affirmative action admissions at public universities. When Prop 209 passed, minority enrollment at the University of California campuses plummeted.
"We were the only law firm that took that position," said Casher. "We supported the ballot measure financially as well. It was a bold statement, and I hope it gives other law firms cover" to take similar actions in the future.
Next year's stats and story will tell. Stay tuned.
Want to get inside the heads of minority law students and associates and learn what they are looking for? Listen in to discussions hosted by Akin Gump, on Law.com, for diverse attorneys interested in Big Law careers. It's one of a series of initiatives among large firms to bolster the ranks of minority lawyers.
Then try these podcasts from Merle Vaughn, "B.S.: Beyond Stereotypes," and Alexis Robertson, "The Path & The Practice."
In "8 Steps for Retaining Women of Color Lawyers," Jayne Reardon shares insights from people in the diversity, equity and inclusion space on approaches that may help organizations retain female lawyers of color.
And read this post by Link Christin if you are a law firm leader concerned about turnover or an unhappy practitioner trying to figure out if a move is right.
← 33rd Annual PILF Auction & Celebration of Public Interest → Law Firm Staffers Don't Want to Return to Offices. Should They Get the Choice?


We ship only jewelry & enameled trinket boxes to Canada.
Unfortunately, we no longer ship wood jewelry boxes or standard ring boxes to our Canada customers. We found some manufacturers simply do not package their products well enough for the item to arrive in perfect condition. Note however that we DO ship the enameled trinket boxes shown here to Canada.
"Generally ships in..." This is the approximate time it takes to ship and is usually provided on the order page and also in the shopping cart once an item has been added.
Shipping fees apply to ALL orders shipping to Canada... orders that indicate they ship free to a USA address are charged a flat fee of $15. If the fee shown on the right is not automatically added before you check out, it will be applied when we begin processing your order.
fee does NOT appear on our package labels.
ship for a reduced fee of $15 to a Canada address.
Credit card must be Canada or USA issued. All prices are in USA dollars.
Important: Shipping fees apply to ALL orders shipping to Canada ... orders that indicate they ship free to a USA address are charged a flat fee of $15. If not automatically added before you check out, the fees above will be applied when we begin processing your order.
Jewelry Delivery Method- US Registered Mail* ONLY. This is the only method of shipping accepted by the US Postal Service for jewelry shipping to Canada. See below. The US Postal Service states this delivery method takes approximately 6-10 days but is not guaranteed to arrive in this time frame. We strongly recommend that you allow up to 3 weeks for delivery to avoid disappointment because of the time required to get through customs. Remember to ADD the production time or the time indicated it takes an item to leave our store. All orders are shipped insured and we use our private insurer... insurance fees do not appear on the shipping label!
Enamel Trinket Box Delivery Method- We ship our enameled trinket boxes shown at this address only via insured Priority Mail International which is estimated to be approximately 6-10 days but is not guaranteed to arrive in this time frame.
IMPORTANT: Customers are responsible for all customs, duties, tariffs, taxes, etc. On the advice of the Canada Border Services Agency, we do not collect these fees from you before we ship. So you are required to pay upon receipt of your order... this is to prevent any confusion or customers having to pay these taxes twice, then having to apply for a refund.
GST- A Goods and Services Tax .
PST- A Provincial Sales Tax in most Canadian provinces.
HST- A Harmonized Sales Tax- GST & PST combined- collected by some provinces.
A luxury tax also applies to jewelry made outside Canada, the United States and Mexico.
A mail fee may apply if the CBSA is unable to track a registered package at the CanadaPost.com online site.
Canada Restrictions- Coins; banknotes; currency notes; securities payable to bearer; traveler's checks; gold, silver, platinum, manufactured or not; jewelry; and other valuable articles may be sent only in registered items.


text:
Jupiter et le Métayer est la quatrième fable du livre  de Jean de La Fontaine situé dans le premier recueil des Fables de La Fontaine, édité pour la première fois en 1668.

Liens externes

  Jupiter et le Métayer, Musée Jean-de-La-Fontaine à Château-Thierry.

Fable de La Fontaine

redpajama_set_name: RedPajamaWikipedia


With renewed attention to human rights and family planning, attention is being paid to what it means for programs to offer a full range of contraceptive methods. Currently, the UN estimates that the method mix is unbalanced in many countries, with one or two methods accounting for most use in many countries. Such a skewed method mix constrains contraceptive use and limits the contraceptive options of women and couples.
Women's contraceptive needs change over the course of their lives. At some points they may want to space their births, at other times limit the number of children they have. Ensuring that a range of contraceptive methods is available to meet women's changing needs over their life course is a critical program and policy issue.
The Evidence Project is exploring women's contraceptive preferences during different stages of their lives—married and unmarried adolescents, and women in early and later stages of childbearing. The project is generating evidence to help implementers introduce an expanded method mix that is acceptable, feasible, and sustainable.


Set up, craftsmanship and quality are at the core of Ferrata's creations. The Milan-based brand has launched a range of exquisitely designed jewellery types to join its watch collections for men and women.
Ferrata chose to launch its jewellery collection after multiple requests from Italian blokes, in particular. "Ferrata's watches are particularly popular among Italian fashion lovers due to their quality and versatile envisage, and we have been asked by many of them to launch other accessories made according to the same philosophy", requires the company's Milan based head of PR. "The clean and classic style combined with consistent quality and use of high-end matters across both watch and jewellery collections is still quite unusual in our price range".
Ferrata's jewellery collecting features elegant Italian necklaces and bangles crafted from 925 sterling silver and inset with Swarovski crystals in vibrant disguises. The jewellery pieces have been designed to match beautifully with Ferrata's watch collections, but look equally superb when worn on their own or stacked together.
Ferrata's heritage collection features 5 series of timepieces that all dole out the ethos of Italian style with a Swiss heart – every watch is fitted with Swiss quartz move, supplied by Ronda, one of the leading Swiss movement producers, for ultimate precision, reliability and durability.
The watches are made with 316L stainless nerve, chosen for its robust strength, exceptional resistance to corrosion, and sleek aesthetics. Each watch face is fitted with sapphire crystal specs, the hardest and most scratch-resistant crystal in the world.
Ferrata's interchangeable watch bands are made from the finest Italian leather, callous NATO style nylon, or high strength Milanese style mesh. The timepieces are constructed to the highest quality gauges, at watch assembly facilities with over 20 years of experience in producing remarkable timepieces.
All Ferrata parts are designed to be versatile, and can be dressed up or down. Combining classic Italian style with durable, high-quality materials, Ferrata's watches and ornaments are truly exceptional for their price range. Ferrata Watches retail from $200-$280, and Ferrata Gems retails from $70 to $150. All products can be purchased online from www.ferratawatches.com.


text:
College news (24)
Research news (16)
Chemical Biology & Medicinal Chemistry (2)
Health Outcomes (1)
Molecular Pharmaceutics and Drug Delivery (2)
Pharmacology & Toxicology (4)
(-) John DiGiovanni, Ph.D. (1)
(-) Karen Vasquez, Ph.D. (5)
(-) Michael Johnsrud, Ph.D., R.Ph. (1)
(-) Robert O. (Bill) Williams III, Ph.D. (8)
(-) Rueben A. Gonzales, Ph.D. (1)
(-) Skyller Walkes, Ph.D. (11)
(-) Walter L. Fast, Ph.D. (2)
Ashley Castleberry, Pharm.D., M.Ed. (1)
Christopher R. Frei, Pharm.D., M.Sc. (1)
Debadyuti (Rana) Ghosh, Ph.D. (1)
Diane B. Ginsburg, Ph.D., M.S., R.Ph., FASHP (4)
Edward M. Mills, Ph.D. (1)
Jamie C. Barner, Ph.D., FAACP, FAPhA (2)
Jennifer Ridings-Myhra, M.Ed. (1)
Kelly Renee Reveles, Pharm.D., Ph.D., BCPS (1)
Kimberly Nixon, Ph.D. (1)
Kirk Evoy, Pharm.D., BCACP, BC-ADM, CTTS (1)
Kristin Janzen, Pharm.D., BCPS (1)
Laura Cannon, Pharm.D., MPH (1)
M. Lynn Crismon, Pharm.D., FCCP, DABCP, BCPP (8)
Nathan D. Pope, Pharm.D., FAPhA (1)
Tonia Guida, Ph.D. (1)
Equity & Diversity (11)
TxCORE (1)
Student Awards (1)
Thin Film Freezing (1)
Nick Nobel (14)
Alyssa Trudeau (1)
(-) John DiGiovanni, Ph.D.
(-) Karen Vasquez, Ph.D.
(-) Michael Johnsrud, Ph.D., R.Ph.
(-) Robert O. (Bill) Williams III, Ph.D.
(-) Rueben A. Gonzales, Ph.D.
(-) Skyller Walkes, Ph.D.
(-) Walter L. Fast, Ph.D.
AAPS Addresses "Infodemic," Scientific Credibility and the Public On TV
Leaders from the American Association of Pharmaceutical Scientists (AAPS), including the College of Pharmacy's Dr. Robert O. (Bill) Williams III, address the "infodemic" and AAPS' role in evaluating and bringing attention to credible science on a November 5 episode of "Advancements with Ted Danson."
Vasquez Writes in Nature Reviews Genetics on Alternative DNA Structures
Division Head and Professor of Pharmacology & Toxicology Karen Vasquez, Ph.D. published in the latest issues of Nature Reviews Genetics regarding repetitive elements in the human genome. Once considered "junk DNA," they are now known to adopt more than a dozen alternative DNA structures. These dynamic conformations can act as functional genomic elements involved in DNA replication and transcription, chromatin organization and genome stability.
College of Pharmacy Researchers Share Latest Findings on Novel Drug Delivery Technology
Researchers in the lab of Dr. Robert O. (Bill) Williams III, Division Head and Professor of Molecular Pharmaceutics and Drug Delivery at the College of Pharmacy, are advancing an innovative platform technology known as Thin Film Freezing, which could revolutionize administration, distribution and access to both vaccines and therapies.
Faculty Earn State Grants for Cancer Research
The Cancer Prevention and Research Institute of Texas (CPRIT) has released its grant research funding awards for the upcoming year. All three awarded research projects at The University of Texas at Austin involve College of Pharmacy faculty.
Celebrating the Latest Awards, Appointments and Achievements from the UT Pharmacy Community
From student scholarships to national recognition awards to prestigious appointments, the UT Pharmacy community has a lot to celebrate and be proud of right now.
Williams Talks to KXAN About How Thin Film Freezing Can Help Treat COVID Patients
Division Head and Professor of Molecular Pharmaceutics and Drug Delivery Dr. Bill Williams was on KXAN News to talk about promising new data from TFF Pharmaceuticals and Augmenta Bioworks. The companies plan to develop Dr. Williams' thin film freezing technology to better deliver antibody treatment directly to the lungs of COVID patients.
Vasquez Appears on BBC World Service to Discuss Z-DNA
Division Head and Professor of Pharmacology and Toxicology Karen Vasquez, Ph.D. appeared on BBC World Service's Science in Action to talk about Z-DNA. Dr. Vasquez's research focuses on DNA damage and repair, genomic instability, gene targeting, DNA structure and cancer therapeutics.
UT Austin Students Earn Diversity Leadership Awards
The University of Texas at Austin community members won several Emerging Leaders Spotlight Awards during the recent chapter meeting of the Texas Association of Diversity Officers in Higher Education (TADOHE). The inaugural awards seek to highlight and acknowledge individuals in higher education who actively support TADOHE's mission and diversity, equity, accessibility and inclusion (DEAI) as a whole.
Fight Against Antibiotic-Resistant Bacteria Has a Glowing New Weapon
Chemistry Assistant Professor Emily Que, Ph.D. and the College of Pharmacy's Walt Fast, Ph.D. are working together to research new methods to fight against antibiotic resistance. The fluorescent chemical probe developed by Que and Fast may help find a different way to combat resistant bacteria.

redpajama_set_name: RedPajamaCommonCrawl


Buy Acetonitrile D3 in septa packs from Carbanio. Carbanio provides the best quality Acetonitrile D3 in septa packs at the best competitive price. Carbanio assures your payment which will be made for Acetonitrile D3 in septa packs is safe and secure.


In a recent report, the UN Intergovernmental Panel on Climate Change (IPCC) warned that we have only twelve years to make unprecedented reductions in carbon emissions in order to avoid significant impacts from global climate change. While politically challenging, the IPCC report also indicates that this level of change is both feasible and affordable. Action is required at all sectors and all levels—individual efforts like driving less and carpooling or biking more, increased usage of energy efficient appliances and lighting, all the way up to systemic changes in our energy production across the world.
According to NOAA, 2016 was the hottest year on the historical record and the third consecutive record-breaking year. The 10 hottest years ever recorded have all happened since 1998.
Per NASA, global concentrations of Carbon Dioxide this year reached as high as 410.79 parts per million – the highest in 650,000 years. Global sea level rose about 17 centimeters (6.7 inches) in the last century. The rate of sea level rise in the last decade, however, is nearly double that of the last century.
On June 1, 2017 President Trump announced his intent to withdraw from the Paris Climate Accords, the voluntary international agreement that directs each country to set targets for reduction of climate-changing greenhouse gas emissions, with a goal of avoiding an average increase in global temperatures of 2 degrees Celsius. On October 9, 2017, the Trump Administration announced a similar plan to terminate the National Clean Power Plan. These actions demonstrate a significant change in direction for the world and our nation; all progress for the United States in addressing climate change will need to be made on the local or state level for the foreseeable future.
Climate change is here and we are already starting to see the impacts. But it's not too late to make a difference–and biggest potential for progress is on the local level.
The Ecology Action Center, as the environmental agency for Bloomington-Normal and McLean County, is currently conducting its second inventory of greenhouse gas emissions for our community. The first GHG inventory was conducted in 2014 using 2008 energy use data to create an emissions baseline. This year's inventory is broader in scope, also looking at other air quality emissions such as ozone, which are regulated under the National Ambient Air Quality Standards, and can be dangerous to public health. This time around, following the quantification of current emissions levels, the EAC will launch a collaborative strategic planning process to establish goals for emissions reductions and develop strategies for meeting these goals.
This program has limited financial support from the City of Bloomington and Town of Normal; the Ecology Action Center needs your help to make it successful. Accordingly, the EAC has launched a new public-private partnership; donations to the new BN Clean Air Fund will support our efforts to improve and maintain air quality in Bloomington-Normal. As a 501(c)(3) nonprofit organization, contributions to the EAC are deductible to the extent allowable by law. Donate now to help fight climate change and protect air quality in our community.
Contributions may be made using the form below or by sending a check made out to the Ecology Action Center, 202 W College Ave, Normal, IL 61761. Please indicate "BN Clean Air" on the memo line of your check.


An unknown Nvidia GPU has appeared in the Final Fantasy XV benchmark database. This boilerplate entry is considerably faster than the GTX 1070 and falls only a little shy of the GTX 1070 Ti. In theory, this mystery GPU occupies the same ground that a future GTX/RTX 2060 might someday soon be vying for.
Granted, that's not a huge amount of information to go on. The generic entry sits betwixt two of Nvidia's Pascal generation cards, occupying a segment not yet tapped by the green team, but that's our only indicator that it could be an unreleased GPU.
The 'Nvidia Graphics Device' entry falls just four percent short of the GTX 1070 Ti in the 4K 'Standard' quality benchmark, and eight percent faster than the GTX 1070.
The Final Fantasy XV benchmark is evidently being utilised as a proving grounds for unreleased graphics cards, with RX 590 performance and 7nm Vega 20 graphics cards making unannounced appearances within the benchmarking suite's database. But, while these may be somewhat useful markers in terms of relative performance, Square Enix's benchmark isn't a be all and end all of comparative performance.
The benchmark is arguably one of the more GeForce-friendly runs due to its heavy-use of Nvidia GameWorks, which AMD's graphics cards shudder at the sight of. It's also not a model of consistency, as evident within these very results where the RX Vega 56 actually leads the more capable RX Vega 64 in performance.
So if a generic entry wasn't reason enough to tread lightly with these results, there's also an inconsistent benchmark to contend with. Scepticism aside, however, the Final Fantasy XV benchmarks, spotted by tech detective TUM_APISAK, could be some indication of the mid-range GPUs expected from Nvidia sometime in the near-future.
Nothing is yet known about the entry-level and mid-range lineup for the Turing architecture, although this is arguably the segment of the market the majority of gamers will be interested in. The RTX 2080 Ti, RTX 2080, and RTX 2070 are all on the shelves, but the latest architecture from the green team isn't yet available for less than $499.
Nvidia is reportedly prepping a GTX 1060 equipped with GDDR5X memory for imminent launch. This looks to be a reactionary move to compete around the AMD RX 590 release date, although could be construed as a sign that the Turing mid-range is still a ways off.
Whether Nvidia will carry over any of the RTX functionality to the mainstream cards is yet another unknown, but it's widely assumed that Nvidia will be ditching ray tracing support of any cards below the RTX 2070. This GPU is fitted with just enough RT Cores for the bare minimum of ray tracing performance to make it worthwhile, six Giga Rays/s, and the cost of this extra silicon is surely too great for any price-conscious cards.
With the RTX 2070 currently outperforming the last generation GTX 1080 by a considerably margin, and potentially even clocking close to GTX 1080 Ti numbers with third-party augmentations, it wouldn't be all that surprising to see Nvidia's GTX/RTX 2060 manage to edge close to the GTX 1070 Ti in raw performance.


I am beginning to be concerned about the lack of blogging motivation I'm feeling this week; you've seen my excuse — does it buy me some slack?
We're still playing catch up with a bulging ideas folder here at L-HC. A recent NYTimes column updates us on the ever-intriguing topic: women in corporate America.
One might ask: why are we still confounded by this? After all, U.S. women began to flood the workplace after the economic shocks of the 1970's put single income families on the endangered species list. Why would a fact of work life for more than 30 years be cause for comment?
The new reality of $80 fuel fill ups has begun to penetrate the consciousness of this nation's employers, many of whom are responding to their employees' pain in a variety of intriguing ways.
Increased telecommuting, or working from home, suddenly is not only tolerated, but actually encouraged by many forward-thinking managers who suddenly are experiencing attrition of valued staff for reasons of excessive commuting expense. And, as an electronic collaboration professional, I can't help but be heartened by this trend, since tools such as web conferencing allow dispersed workers to interact most productively.
I consider myself technologically sophisticated. Made my living by writing really sophisticated code for; creating applications for; using; and lately teaching the advanced use of; electronic computational devices for nearly 40 years.
Started when the average of such computational devices filled large, refrigerated, raised-floor (to clear the boa constrictor cabling) floor to ceiling windowed but locked chambers.
Large box (think refrigerator sized) with colorful lighting containing the computer itself with its proud array of 64,000 bytes of hand-assembled magnetic core memory. Folks, that was 64KB.
Today's home PCs are stunted if they have less than 512MB. I recently upgraded the memory in my own PC: bought 2GB (about 31,000 times larger than that 64KB magnetic core processor for which we wrote so cleverly, and compactly!) for about $100.
The U.S. Navy has long been a favorite subject for yr (justifiably) humble svt, long before he became your svt, quite long before.
The elemental battles of men against the implacably overwhelming forces of nature, while simultaneously battling to the death a human enemy, has always captured the imagination.
Lord Nelson at Trafalgar; Monitor going where no ship had gone before (thus tweaking our simultaneous lifelong interest in the history of technology ); Morison's epic of the U.S. Navy in the four years of its Second World War: all these read as a kid, reread as an adult, and by the by, picked up by my older son, perhaps pointing him toward his own Navy career.
Now, that's a cautionary tale! Parents! Be careful what reading material you leave around for your kids to find! Or, maybe, turn off the TV and read a book or two — you are influential beyond your ken.
Faithful reader might recall a couple of recent posts with the Navy as the theme (here and here).
In these unfortunate times of general governmental ineptitude, cultivated by an administration that consistently over-controls what should be left alone (found any weapons of mass destruction in Iraq yet?), and leaves alone too many negligible details (such as: armor for Humvee personnel carriers!), why should the Navy be left out?
With the crack of a Champagne bottle against its bow, the newly minted Navy warship, bedecked with bunting, slid sideways into the Menominee River in Wisconsin with a titanic splash.


Many customers choose our hotel with parking near Ancona because they know that we have a place in our large fenced parking always find it.
Our parking is able to accommodate buses and coaches with enough space to maneuver. Convenient to load and unload passengers and luggage directly to the hotel entrance.
Convenient for those who must embark at the port of Ancona on the day after, with the security of not having to worry about luggage and ideal for a stopover while traveling.
Ours is a hotel in Falconara Marittima with Free parking for all customers and we provide our interior garage free to our PREMIUM Clients and we allow the other clients to use the garage for a small fee of EUR 5.00.
Arrive, park and not waste time ... the hotel Touring comfort is at home!


Don't drink this coffee. We had brunch, that was amazing. Delicious food. However, the coffee, Five Senses "Dark Horse" blend, really didn't do it for me. I found it a bit.. hollow? Not full-bodied enough, and on the sour side. Yeah, just have an amazing brunch then head next door for coffee!


text:
package com.xhao.config;

import com.xhao.security.CustomUserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;

/**
 * 创建时间:2017/1/17 14:24
 * 作者:WangXianHao.
 */
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

    @Bean
    UserDetailsService customUserService(){
        return new CustomUserService();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        /*
        auth.inMemoryAuthentication()
                .withUser("wxh").password("wxh").roles("ADMIN")
                .and()
                .withUser("test").password("test").roles("USER");
        */
        auth.userDetailsService(customUserService());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage("/login").permitAll()
                .and()
                .logout().permitAll();
        super.configure(http);
    }
}

redpajama_set_name: RedPajamaGithub


Ep. #33 Bias series: Wow, there's a whole other side of you.
This episode was entirely unplanned. We sat down to work on something else, but I had already hit record and the mic was on. With Yasmin's permission, we're sharing this vulnerable story, and our conversation that came out of it.
In the beginning, we reference a blog post by author Luvvie Ajayi titled "The Weary Weaponizing of White Women's Tears." Click through to read it and understand our comments in context.
Thanks for listening to Smartest Person in the Room! You can follow us on Instagram and Facebook, and sign up below to receive an email with each new episode.


text:
Scamandro () o Xanto è un personaggio della mitologia greca.

Secondo Esiodo, è figlio di Oceano e Teti. mentre secondo altri sarebbe figlio di Zeus e padre di Teucro (la quale madre sarebbe la ninfa Idea).
Scamandro  è riconosciuto anche come padre di Glaucia che a sua volta ebbe da Dimaco (uno degli amici di Eracle) un bambino a cui fu dato lo stesso nome del nonno (Scamandro).

Mitologia

Suo padre gli diede l'onore di festeggiare le giovani donne che in seguito al matrimonio andavano a bagnarsi nelle sue acque ed appena uscite dall'acqua, Scamandro usciva dal suo letto e le accompagnava nel suo palazzo.

Durante la guerra di Troia, quando Patroclo viene ucciso da una lancia scagliata da Ettore, Achille, furioso, fa strage dei troiani e dei loro alleati; non essendo riuscito ad uccidere Ettore si rivolge contro i nemici superstiti che cercano di rifugiarsi sulla sponda opposta del fiume Scamandro. Achille si getta nel fiume inseguendo e falciando i fuggiaschi, riempiendo l'acqua di cadaveri, armi e scudi.

Il dio Scamandro, sdegnato per la carneficina, scaglia le sue acque contro di lui ed Achille, appesantito dall'armatura, rischia di annegare e viene salvato dall'intervento di Efesto che prosciuga le acque del fiume con una tremenda pioggia di fuoco.

Note

Bibliografia
Fonti primarie
 Omero, Iliade
 Plutarco, Quaestiones Graecae
 Pseudo-Apollodoro, Libro III
 Strabone, Libro XIII

Fonti secondarie
 Robert Graves, I miti greci

Altri progetti

Collegamenti esterni

Divinità fluviali della religione greca
Figli di Zeus
Personaggi della guerra di Troia


NOW HIRING: The Olympia Film Society is looking for a full time, experienced Film Programming Director. The Film Programming Director oversees the annual film programming and scheduling for one of the longest running arts organizations in the Pacific Northwest. Our success will rely on a candidate who sees the big picture and is committed to the importance and value of films. If you are our dream candidate, you will need to be prepared to hit the ground running on planning the Annual Olympia Film Festival, a multi-day event taking place November 2017.


Well, I will say I was my own experiment, did a lot of research and then bit the bullet. This product is fantastic!!! Within 2-3 weeks I started noticing the difference. I have thyroid issues (plus other issues at 51) But I tell you, this made me feel 'lifted'. I feel energized and younger, so much healthier than what I have in years. I just mix it into a wee amount of water and down the hatch. Now Im being honest here, what it smells like (grass) is what it tastes like, but its over n done with and for the benefits you receive its a no-brainer. You get used to it quickly and we just need to put our big pants on and get the job done because the pay off is terrific. 2 final words...'Do it'!
This is a new product for me and am enjoying it in my green blended juice. Love that I can buy organic goods through HealthPost. Cheers!


Did you know the university has its own racing team?
Hartford Motor Sports is the University's own racing team. Each year the teams goal is to build a prototype race car and compete against other teams from around the world. The team has even been contracted by a manufacturing company to design an F1 style race car for possible production. This gives team members business experience because they must make a presentation to the company on why there prototype is the most financially feasible. Bob Dinan has been a member for three years, and says experience like this stands out on a resume. If you are interested in joining send an email to HartfordFSAE@gmail.com.


text:
Q: Communicate of USB-HID device on windows 8 I have an embedded board with USB device port and i would like to transfer data from/to the PC at a rate of 1600Kbps.
The actual data transferred is ADC data. Basically, i  need to transfer this data to a Windows 8 machine as fast as possible.
Device side : I have a HID device  which is recognized by the windows as a HID. The HID uses one interface with 2 endpoint, a interrupt based IN endpoint (as in any HID device) which can send a 64 byte to the Windows. I have another interrupt OUT endpoint can receive 64 bytes of data. And as all USB devices i have End Point 0 to send Control transfers.
I would like to build a tool with .Net and some USB based driver. Could anybody kindly please suggest me the best library i can use for USB communication? some samples would be fine.
Thanks in advance

A: You might look into using HIDAPI, but in order to call it from C# you will have to define a bunch of tricky methods using PInvoke.
There is also the HidLibrary project for .NET but it looks unmaintained.

A: If you want to transfer binary data over HID - you can look for approach and design that MS did in their Component Firmware Update (CFU) spec and in corresponding example code.

redpajama_set_name: RedPajamaStackExchange


text:
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="items_grid" template="Swarming_SubscribePro::order/create/items/grid.phtml"/>
    </body>
</page>


text:
CLEAN ENERGY WON'T SAVE US
https://www.theguardian.com/global-development-professionals-network/2016/jul/15/clean-energy-wont-save-us-economic-system-can#comment-79148927
Only a new economic system can save us.
'That 30% chunk of greenhouse gases that comes from non-fossil fuel sources isn't static. It is adding more to the atmosphere each year.' Photograph: Ashley Cooper/Global Warming Images/Alamy
By Jason Hickel
Friday 15 July 2016 07.00 EDTLast modified on Friday 15 July 2016 07.01 EDT
It's time to pour our creative energies into imagining a new global economy. Infinite growth is a dangerous illusion
Earlier this year media outlets around the world announced that February had broken global temperature records by a shocking amount. March broke all the records, too. In June our screens were covered with surreal images of Paris flooding, the Seine bursting its banks and flowing into the streets. In London, the floods sent water pouring into the tube system right in the heart of Covent Garden. Roads in south-east London became rivers two metres deep.
With such extreme events becoming more commonplace, few deny climate change any longer. Finally, a consensus is crystallising around one all-important fact: fossil fuels are killing us. We need to switch to clean energy, and fast.
But while this growing awareness about the dangers of fossil fuels represents a crucial shift in our consciousness, I can't help but fear we've missed the point. As important as clean energy might be, the science is clear: it won't save us from climate change.
What would we do with 100% clean energy? Exactly what we're doing with fossil fuels
Let's imagine, just for argument's sake, that we are able to get off fossil fuels and switch to 100% clean energy. There is no question this would be a vital step in the right direction, but even this best-case scenario wouldn't be enough to avert climate catastrophe.
Why? Well, first, the burning of fossil fuels only accounts for about 70% of all anthropogenic greenhouse gas emissions. The other 30% comes from a number of causes, including deforestation, and industrial livestock farming, which produces 90m tonnes of methane per year and most of the world's anthropogenic nitrous oxide. Both of these gases are vastly more potent than CO2 when it comes to global warming. Livestock farming alone contributes more to global warming than all the cars, trains, planes and ships in the world. There are also a number of industrial processes that contribute significantly, and then there are our landfills, which pump out huge amounts of methane – 16% of the world's total.
Jeffrey's Bay wind farm in South Africa. Photograph: Nic Bothma/EPA
But when it comes to climate change, the problem is not just the type of energy we are using, it's what we're doing with it. What would we do with 100% clean energy? Exactly what we are doing with fossil fuels: raze more forests, build more meat farms, expand industrial agriculture, produce more cement, and fill more landfill sites, all of which will pump deadly amounts of greenhouse gas into the air. We will do these things because our economic system demands endless compound growth, and for some reason we have not thought to question this.
Forget 'developing' poor countries,
it's time to 'de-develop' rich countries
Think of it this way. That 30% chunk of greenhouse gases that comes from non-fossil fuel sources isn't static. It is adding more to the atmosphere each year. Scientists project that our tropical forests will be completely destroyed by 2050, releasing a 200bn tonne carbon bomb into the air. The world's topsoils could be depleted within just 60 years, releasing more still. Emissions from the cement industry are growing at more than 9% per year. And our landfills are multiplying at an eye-watering pace: the by 2100 we will be producing 11m tonnes of solid waste per day, three times more than we do now. Switching to clean energy will do nothing to slow this down.
If we keep growing at 3% a year, that means that every 20 years we need to double the size of the global economy
The climate movement made an enormous mistake. We focused all our attention on fossil fuels, when we should have been pointing to something much deeper: the basic logic of our economic operating system. After all, we're only using fossil fuels in the first place to fuel the broader imperative of GDP growth.
The root problem is the fact that our economic system demands ever-increasing levels of extraction, production and consumption. Our politicians tell us that we need to keep the global economy growing at more than 3% each year – the minimum necessary for large firms to make aggregate profits. That means every 20 years we need to double the size of the global economy – double the cars, double the fishing, double the mining, double the McFlurries and double the iPads. And then double them again over the next 20 years from their already doubled state.
Current projections show that by 2040 we will more than double the world's shipping miles, air miles, and trucking miles. Photograph: Feature China/Barcroft Images
Our more optimistic pundits claim that technological innovations will help us to decouple economic growth from material throughput. But sadly there is no evidence that this is happening. Global material extraction and consumption has grown by 94% since 1980, and is still going up. Current projections show that by 2040 we will more than double the world's shipping miles, air miles, and trucking miles – along with all the material stuff that those vehicles transport – almost exactly in keeping with the rate of GDP growth.
The pope vs the UN: who will save the world first?
Clean energy, important as it is, won't save us from this nightmare. But rethinking our economic system might. GDP growth has been sold to us as the only way to create a better world. But we now have robust evidence that it doesn't make us any happier, it doesn't reduce poverty, and its "externalities" produce all sorts of social ills: debt, overwork, inequality, and climate change. We need to abandon GDP growth as our primary measure of progress, and we need to do this immediately – as part and parcel of the climate agreement that will be ratified in Morocco later this year.
It's time to pour our creative power into imagining a new global economy – one that maximises human well-being while actively shrinking our ecological footprint. This is not an impossible task. A number of countries have already managed to achieve high levels of human development with very low levels of consumption. And Daniel O'Neill, an economist at the University of Leeds, has demonstrated that even material de-growth is not incompatible with high levels of human well-being.
Our focus on fossil fuels has lulled us into thinking we can continue with the status quo so long as we switch to clean energy, but this is a dangerously simplistic assumption. If we want to stave off disaster, we need to confront its underlying cause.
It's time to pour our creative energies into imagining a new global economy. Infinite growth is a dangerous illusion.
Join our community of development professionals and humanitarians.
Follow @GuardianGDP on Twitter.
#economics, #Global Warming, #Science, #social change, Articles, ENVIRONMENT
#economics, #environment
← COMPANIONS
Poor at 20, Poor for Life →


text:
The Gallery's Acknowledgement of Country, and information on culturally sensitive and restricted content and the use of historic language in the collection can be found here.
Lady Loch
Tuttle & Co
gelatin silver photograph on card (support: 17.5 cm x 11 cm, image: 15.4 cm x 10.9 cm)
Purchased with funds provided by Graham Smith 2009
The National Portrait Gallery respects the artistic and intellectual property rights of others. Works of art from the collection are reproduced as per the Australian Copyright Act 1968 (Cth). The use of images of works from the collection may be restricted under the Act. Requests for a reproduction of a work of art can be made through a Reproduction request. For further information please contact NPG Copyright.
Currently not on display
Let me know when this portrait's on display
Request a digital copy for publication
Artist and subject
Lady Elizabeth Loch (age 49 in 1890)
Subject professions
Public identity
Graham Smith (18 portraits supported)
The Companion
Permanent collection catalogue
On one level The Companion talks about the most famous and frontline Australians, but on another it tells us about ourselves: who we read, who we watch, who we listen to, who we cheer for, who we aspire to be, and who we'll never forget. The Companion is available to buy online and in the Portrait Gallery Store.


text:
BT says lightning may have caused phone blackout
Adam Guest	July 27, 2015 5
BT has issued a statement in a bid to explain why a fault at one of its radio transmitters caused major disruption on Saturday.
The communications company said damage may have been caused by previous lightning strikes, but they could not confirm that to be the case.
Mobile phone and landline connections were lost for several hours, and Sumburgh Airport closed at lunchtime because of the problem.
Eleven flights were cancelled and one was diverted to Kirkwall. Local businesses were also affected as they were unable to process card transactions for a number of hours.
BT said it experienced problems at Wideford Hill radio station in Orkney at 1pm on Saturday which affected services in Orkney and Shetland.
The company said engineers traced the fault to blown rectifiers and fuses at the radio station and service was restored about five hours later when all the blown equipment was replaced.
MSP Tavish Scott is demanding an investigation into what went wrong.
Isles MSP Tavish Scott, said yesterday that major questions needed to be answered.
BT is investigating the problem and this afternoon the organisation's press office Ian Arnot provided the following unattributed statement:
"The BT network serving Orkney and Shetland is designed to provide back-up for most services in most scenarios.
"The Wideford Hill facility and other sites route traffic over separate radio and sub-sea cable routes, to provide service resilience and protection against long-duration outages.
"However, following the damage to the power rectifiers and fuses, some traffic was found to be relying on Wideford for both the main and back-up paths.
"We are investigating why this happened and working on reconfiguring the network to prevent any repeat. It is possible that damage may have been caused by previous lightning strikes locally damaging our equipment, but we cannot confirm that at this stage. We're sorry for the disruption caused on Saturday."
The Shetland Times has asked for more information from BT and is waiting to hear back from the organisation.
Sumburgh Airport
Three posts to go at Shetland Arts
Clinical Spurs progress to Manson Cup final
David Allan
July 27th, 2015 18:17
And then they send out emails to say they are raising the price of line rental. Disgusting attitude by Bt.
Let's put BT's comments into plain, non-technical English.
The main and the back-up traffic paths pass through Wideford Hill station because BT designed their system that way to reduce cost. To increase reliability, both paths should not pass through the same station.
The rectifiers supply direct current (DC) for the communications equipment and keep the battery charged. After the rectifiers shut down, the battery supplies the communications equipment for several hours until the rectifiers turn on or until the battery is exhausted. Service technicians are notified by an alarm that the rectifiers are shut down and must restore them before the battery is exhausted. It seems to me that the battery ran to exhaustion and then both the main and back-up traffic paths failed.
"We are investigating why this happened and working on reconfiguring the network to prevent any repeat."
This happened because BT designed it to happen. A repeat is likely until BT arranges their kit so both traffic paths do not pass through Wideford Hill station.
John Tulloch
Chapter and verse!
Alex Aitken
BT have products on the market which enable this entity to provide a seamless service regardless of power supply failures at distant terminals.
2 power supplies going down and not being repaired in a timely manner that is crass, it is money saving at best or crass maintenance at worst. The 999 service was available this is like saying we have a piece of string still available/
For hospitals airports and the private businesses to be without communication for whole day Saturday the management should be sacked forthwith
You're right, of course, BT have got egg on their faces. In my own experience, however, where the signals pass through a single remote site, a bad lightning strike can get into every piece of equipment and destroy the lot.
As this is the first time this has happened, such a strike is presumably, rare and it would be expensive to have a completely (geographically) separate system.
I'm not familiar with Shetland's communications infrastructure however I understand a fibre optic cable runs from Scotland to Faroe which Shetland is tapped into? If so, It may be possible for BT to rent emergency bandwidth on that cable as a standby for use if their own system fails?
The weakness has been highlighted, spectacularly, and the question is, how avoid a recurrence without incurring horrendous cost? Yes, BT should have the very best protection on their equipment – perhaps, they did? – but a separate standby channel would make sense.
When it comes down to it, hospital phones are more important than browsing the internet and it may, even, be possible to do both without anyone noticing much difference?
I don't doubt Shetland Telecom (name?) will be pleased to hear from BT?
About Adam Guest
Reporter for The Shetland Times. I have also worked as a senior news reporter at The Press and Journal, The Barnsley Chronicle and as a freelance reporter for The Doncaster Free Press. Alongside news reporting I specialise in music and sports journalism. Pork pie lover.
VIEW OTHER STORIES BY: Adam Guest
Sumburgh figures down almost by half following pandemic
Sumburgh Airport has seen passenger numbers cut by 47 per cent after Covid-19.
Updated: 'Framework for discussion' reached in air traffic control dispute
The union representing air traffic controllers is suspending its industrial action over centralisation following an agreement with Highlands and Islands Airports limited (Hial) on a
October 25, 2021 | 9.04am
Loganair to fly direct to Dundee and connect to London from 2022
Folk from Shetland will be able to fly direct from Sumburgh to Dundee from May 2022. They will also be able to fly on to…
September 8, 2021 | 9.28am
Air traffic controllers to stage one-day strike in centralisation protest
Air traffic controllers at Sumburgh will stage a one-day walkout later this month in protest to Highlands and Islands Airports Limited (Hial) plans to centralise…
July 15, 2021 | 11.13am
Covid results in huge drop in passenger numbers at Sumburgh
Sumburgh Airport saw passenger numbers suffer a huge decline over the last 12 months as a result of the pandemic. Figures released by Highlands and…
April 29, 2021 | 3.00pm
Aeroplane lands at Sumburgh with special cargo
An aeroplane has arrived in the isles with a somewhat unusual cargo to help a new-to-Shetland hospital procedure be carried out. The Cessna aircraft landed…
February 22, 2021 | 12.51pm


text:
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Windows;
using System.Windows.Forms.VisualStyles;
using System.Windows.Input;
using System.Xml.Linq;
using C1.WPF;
using C1.WPF.Docking;
using Microsoft.Crm.UnifiedServiceDesk.BaseControl;
using Microsoft.Crm.UnifiedServiceDesk.CommonUtility.DataLoader;
using Microsoft.Crm.UnifiedServiceDesk.CommonUtility.UserProfileManager;
using Microsoft.Crm.UnifiedServiceDesk.Dynamics;
using Microsoft.Crm.UnifiedServiceDesk.Dynamics.PanelLayouts;
using System.Windows.Markup;
using Microsoft.Uii.AifServices;
using Microsoft.Uii.Csr;
using Microsoft.Uii.Desktop.SessionManager;
using Microsoft.Uii.Desktop.UI.Controls;
using Microsoft.Xrm.Tooling.Connector;

namespace Microsoft.USD.ComponentLibrary.ComponentOne
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class USDDockControl : PanelLayoutBase, IComponentConnector
    {
        #region Fields

        private Dictionary<string, Dictionary<string, object>> _userSettings;
        private Dictionary<string, string> _panelLocations; //Any time the MoveToPanel is used will add or update this.

        #endregion

        #region Constructors

        public USDDockControl()
        {
            InitializeComponent();
        }

        public USDDockControl(Guid appID, string appName, string initString)
            : base(appID, appName, initString)
        {
            this.InitializeComponent();
        }

        #endregion

        #region Overrides

        public override void DesktopLoadingComplete()
        {
            if (_client == null)
            {
                _client = AifServiceContainer.Instance.GetService<ICrmUtilityHostedControl>();
            }
            _userSettings = GetUserSettingsCache();
            base.DesktopLoadingComplete();
        }

        #endregion

        #region Events

        /// <summary>
        /// Raised when an app in panel changes.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void SelectedAppChangedHander(object sender, EventArgs e)
        {
            string selectedAppName = String.Empty;
            if (DesktopApplicationUIBase.AppWithFocus != null)
                selectedAppName = DesktopApplicationUIBase.AppWithFocus.ApplicationName;

            if (sender is IUSDPanel)
            {
                string panelName = ((IUSDPanel)sender).Name;
                if (!string.IsNullOrEmpty(panelName))
                    FireEvent("SelectedAppChanged", new Dictionary<string, string>() { { "Panel", panelName }, { "Selection", selectedAppName } });
            }
        }

        private void mainLayout_ViewChanged(object sender, EventArgs e)
        {
            var dock = (C1UsdDockControl)sender;
            if (dock != null)
            {
                //Should always have the 2 dock groups. Only look when count over 2
                for (int i = 2; i < dock.Items.Count; i++)
                {
                    if (dock.Items[i] is C1USDTabBasePanel)
                    {
                        var tabPanel = (C1USDTabBasePanel)dock.Items[i];

                        if (tabPanel.Items.Count > 0 && !((C1USDTabBasePanel)dock.Items[i]).Name.StartsWith("Main Layout"))
                        {
                            var id = Guid.NewGuid().ToString();
                            ((C1USDTabBasePanel)dock.Items[i]).Name = "Main Layout/" + id;

                            var style = this.FindResource("MainPanelC1USDTabBasePanelStyle") as Style;
                            ((C1USDTabBasePanel)dock.Items[i]).Style = style;
                            ((C1USDTabBasePanel)dock.Items[i]).DockWidth = 600;
                            ((C1USDTabBasePanel)dock.Items[i]).DockHeight = 600;
                            ((C1USDTabBasePanel)dock.Items[i]).DockMode = DockMode.Floating;
                            ((C1USDTabBasePanel)dock.Items[i]).ItemsChanged += newFloatingPanel_ItemsChanged;
                            if (desktopFeatureAccess == null)
                                desktopFeatureAccess = AifServiceContainer.Instance.GetService<IDesktopFeatureAccess>();
                            var addPanelResult = desktopFeatureAccess.AddPanel(((C1USDTabBasePanel)dock.Items[i]));
                            if (tabPanel.ApplicationList.Count > 0)
                            {
                                var app = (DynamicsBaseHostedControl)tabPanel.ApplicationList[0];

                                DoPanelRegistration();
                                var pan = desktopFeatureAccess.GetPanel("Main Layout/" + id);

                                if (_panelLocations != null)
                                {
                                    if (_panelLocations.ContainsKey(app.ApplicationName))
                                    {
                                        var previousPanel = _panelLocations[app.ApplicationName];
                                        var thisPanel = ((C1USDTabBasePanel)dock.Items[i]).Name;
                                        var userSetting = GetUserDisplayGroup(app.ApplicationName + "PanelLocation");

                                        //This panel is different than last moved to panel and my saved user setting.
                                        //Update the user panel
                                        if (!thisPanel.Equals(previousPanel, StringComparison.InvariantCultureIgnoreCase) &&
                                            !thisPanel.Equals(userSetting, StringComparison.InvariantCultureIgnoreCase))
                                        {

                                            var fullPanelName = thisPanel;

                                            UpsertUserSetting(app.ApplicationName + "PanelLocation", thisPanel);
                                        }
                                        else if (previousPanel.Equals(thisPanel, StringComparison.InvariantCultureIgnoreCase) &&
                                                 !userSetting.Equals(thisPanel, StringComparison.InvariantCultureIgnoreCase))
                                        {
                                            MovePanel(app);
                                        }
                                        else if (thisPanel.Equals(userSetting, StringComparison.InvariantCultureIgnoreCase) &&
                                                 previousPanel != thisPanel)
                                        {
                                            MovePanel(app);
                                        }
                                    }
                                }
                            }

                        }
                        ////Create new panel and set panel id to userDisplayGroup
                        //var newFloatingPanel = new C1USDTabBasePanel();

                        //var style = this.FindResource("MainPanelC1USDTabBasePanelStyle") as Style;
                        //newFloatingPanel.Name = "Main Layout/" + ((C1USDTabBasePanel)dock.Items[i]).Name;
                        //newFloatingPanel.Style = style;
                        //newFloatingPanel.DockWidth = 600;
                        //newFloatingPanel.DockHeight = 600;
                        //newFloatingPanel.DockMode = DockMode.Floating;
                        //newFloatingPanel.Visibility = Visibility.Visible;
                        //newFloatingPanel.ItemsChanged += newFloatingPanel_ItemsChanged;

                        //for (int x = 0; x < ((C1USDTabBasePanel) dock.Items[i]).Items.Count; x++)
                        //{
                        //    newFloatingPanel.Items.Add(((C1USDTabBasePanel)dock.Items[i]).Items[x]);
                        //}

                        //foreach (var item in ((C1USDTabBasePanel) dock.Items[i]).Items)
                        //{

                        //}

                        //foreach (var item in tabPanel.Items)
                        //{

                        //    if (!_floaingTabs.Contains((C1USDDockTabItem)item))
                        //    {
                        //        _floaingTabs.Add((C1USDDockTabItem)item);
                        //        var app = (DynamicsBaseHostedControl)((C1USDDockTabItem)item).Tag;

                        //        UpsertUserSetting(app.ApplicationName + "PanelLocation", ((C1USDTabBasePanel)dock.Items[i]).Name);
                        //        tabPanel.DockWidth = 800;
                        //        tabPanel.DockHeight = 600;
                        //    }
                        //}
                    }
                }
            }
        }
        private void mainLayout_PickerLoading(object sender, C1.WPF.Docking.PickerLoadingEventArgs e)
        {
            e.ShowLeftInnerPart = false;
            e.ShowLeftOuterPart = false;
            e.ShowTopInnerPart = false;
            e.ShowTopOuterPart = false;
            e.ShowRightInnerPart = false;
            e.ShowRightOuterPart = false;
            e.ShowBottomInnerPart = false;
            e.ShowBottomOuterPart = false;
        }

        private void newFloatingPanel_ItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            var dock = (C1USDTabBasePanel)sender;

            //Use this to keep track of the tabs within the main panel
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                if (dock.DockMode == DockMode.Hidden)
                    dock.DockMode = DockMode.Floating;
                if (e.NewItems.Count > 0)
                {
                    var newTabItem = (C1USDDockTabItem)e.NewItems[0];
                    var app = (DynamicsBaseHostedControl)newTabItem.Tag;
                    if (app != null)
                    {
                        if (_panelLocations != null)
                        {
                            if (_panelLocations.ContainsKey(app.ApplicationName))
                            {
                                var previousPanel = _panelLocations[app.ApplicationName];
                                var thisPanel = dock.Name.Remove(0,12);
                                var userSetting = GetUserDisplayGroup(app.ApplicationName + "PanelLocation");

                                //This panel is different than last moved to panel and my saved user setting.
                                //Update the user panel
                                if (!thisPanel.Equals(previousPanel, StringComparison.InvariantCultureIgnoreCase) &&
                                    !thisPanel.Equals(userSetting, StringComparison.InvariantCultureIgnoreCase))
                                {
                                    UpsertUserSetting(app.ApplicationName + "PanelLocation", thisPanel);
                                }
                                else if (previousPanel.Equals(thisPanel, StringComparison.InvariantCultureIgnoreCase) &&
                                         !userSetting.Equals(thisPanel, StringComparison.InvariantCultureIgnoreCase))
                                {
                                    MovePanel(app);
                                }
                                else if (thisPanel.Equals(userSetting, StringComparison.InvariantCultureIgnoreCase) &&
                                         previousPanel != thisPanel)
                                {
                                    MovePanel(app);
                                }
                            }
                        }
                    }
                }
            }
            else if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                if (dock.Items.Count == 0)
                    dock.DockMode = DockMode.Hidden;
            }
        }

        private void MainPanel_OnItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            var dock = (C1USDDockTabControl)sender;

            //Use this to keep track of the tabs within the main panel
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                if (e.NewItems.Count > 0)
                {
                    var newTabItem = (C1USDDockTabItem)e.NewItems[0];
                    var app = (DynamicsBaseHostedControl)newTabItem.Tag;
                    if (app != null)
                    {
                        if (_panelLocations != null)
                        {
                            if (_panelLocations.ContainsKey(app.ApplicationName))
                            {
                                var previousPanel = _panelLocations[app.ApplicationName];
                                var thisPanel = dock.Name;
                                var userSetting = GetUserDisplayGroup(app.ApplicationName + "PanelLocation");

                                //This panel is different than last moved to panel and my saved user setting.
                                //Update the user panel
                                if (!thisPanel.Equals(previousPanel, StringComparison.InvariantCultureIgnoreCase) &&
                                    !thisPanel.Equals(userSetting, StringComparison.InvariantCultureIgnoreCase))
                                {
                                    var newPanelName = (C1USDDockTabControl)sender;
                                    var fullPanelName = "Main Layout/" + newPanelName.Name;

                                    UpsertUserSetting(app.ApplicationName + "PanelLocation", newPanelName.Name);
                                }
                                else if (previousPanel.Equals(thisPanel, StringComparison.InvariantCultureIgnoreCase) &&
                                         !userSetting.Equals(thisPanel, StringComparison.InvariantCultureIgnoreCase))
                                {
                                    MovePanel(app);
                                }
                                else if (thisPanel.Equals(userSetting, StringComparison.InvariantCultureIgnoreCase) &&
                                         previousPanel != thisPanel)
                                {
                                    MovePanel(app);
                                }
                            }
                        }

                    }
                }
            }
            else if (e.Action == NotifyCollectionChangedAction.Move)
            {

            }
            else if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                var oldTabItem = (C1USDDockTabItem)e.OldItems[0];
                var item = (C1USDDockTabControl)sender;

                Debug.WriteLine(item.DockMode);
            }
            else if (e.Action == NotifyCollectionChangedAction.Replace)
            {

            }
        }

        private void LeftPanel2_OnItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            MainPanel_OnItemsChanged(sender, e);
        }

        private void SessionExplorerPanel_OnItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            MainPanel_OnItemsChanged(sender, e);
        }

        private void HiddenBasePanel_OnItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                if (e.NewItems.Count > 0)
                {
                    var newTabItem = (C1USDDockTabItem)e.NewItems[0];
                    var app = (DynamicsBaseHostedControl)newTabItem.Tag;
                    if (app != null)
                    {
                        MovePanel(app);
                    }
                }
            }
        }

        #endregion

        #region Private Methods

        private string GetUserDisplayGroup(string name)
        {
            var result = string.Empty;
            if (_client == null)
                _client = AifServiceContainer.Instance.GetService<ICrmUtilityHostedControl>();
            string fetchXML = string.Format(USDConfigurationFetchXML.GetCurrentActiveUserSettingByName, name);
            var response = _client.CrmInterface.GetEntityDataByFetchSearch(fetchXML);
            if (response != null)
                result = _client.CrmInterface.GetDataByKeyFromResultsSet<string>(response.First().Value, "msdyusd_settingvalue");
            return result;
        }

        private IDesktopFeatureAccess desktopFeatureAccess;
        private ICRMWindowRouter router;

        private void MovePanel(object tabTag)
        {
            //Move Panel
            var userSettingPanel = string.Empty;
            if (desktopFeatureAccess == null)
                desktopFeatureAccess = AifServiceContainer.Instance.GetService<IDesktopFeatureAccess>();
            if (router == null)
                router = AifServiceContainer.Instance.GetService<ICRMWindowRouter>();
            var control = ((DynamicsBaseHostedControl)tabTag);
            var defaultPanel = Utility.GetConfigurationValue(control.ApplicationName + "Panel");
            userSettingPanel = GetUserDisplayGroup(control.ApplicationName + "PanelLocation");

            var panelNameToMoveTo = string.Empty;

            if (string.IsNullOrEmpty(userSettingPanel))
            {
                if (string.IsNullOrEmpty(defaultPanel))
                    panelNameToMoveTo = "MainPanel"; //Defaults to main panel
                else
                    panelNameToMoveTo = defaultPanel;
            }
            else if (userSettingPanel.Equals("MainPanel") || userSettingPanel.Equals("SessionExplorerPanel") ||
                     userSettingPanel.Equals("LeftPanel2"))
            {
                panelNameToMoveTo = userSettingPanel;
            }
            else
            {
                panelNameToMoveTo = userSettingPanel;
                //Determine if the panel exists. Will be floating panel. If doesn't exist create it.
                //var panel = this.FindName(userSettingPanel);
                var panelExists = false;

                foreach (var item in mainLayout.Items)
                {
                    if (item is C1USDTabBasePanel)
                    {
                        if (((C1USDTabBasePanel) item).Name.Contains(userSettingPanel))
                        {
                            panelExists = true;
                            break;
                        }
                    }
                }

                if (!panelExists)
                {
                    //Create new panel and set panel id to userDisplayGroup
                    var newFloatingPanel = new C1USDTabBasePanel();

                    var style = this.FindResource("MainPanelC1USDTabBasePanelStyle") as Style;
                    newFloatingPanel.Name = "Main Layout/" + panelNameToMoveTo;
                    newFloatingPanel.Style = style;
                    newFloatingPanel.DockWidth = 600;
                    newFloatingPanel.DockHeight = 600;
                    newFloatingPanel.DockMode = DockMode.Floating;
                    newFloatingPanel.Visibility = Visibility.Visible;
                    newFloatingPanel.ItemsChanged += newFloatingPanel_ItemsChanged;

                    var addPanelResult = desktopFeatureAccess.AddPanel(newFloatingPanel);

                    DoPanelRegistration();
                    var pan = desktopFeatureAccess.GetPanel("Main Layout/" + panelNameToMoveTo);

                    var eventInnerParams = new Dictionary<string, string>();
                    eventInnerParams.Add("Panel", "Main Layout/" + panelNameToMoveTo);

                    router.FireEvent(control.localSession, control.ApplicationName, "MoveToPanel", eventInnerParams);
                    mainLayout.UpdateLayout();
                    if (_panelLocations == null)
                        _panelLocations = new Dictionary<string, string>();
                    if (_panelLocations.ContainsKey(control.ApplicationName))
                        _panelLocations[control.ApplicationName] = panelNameToMoveTo;
                    else
                        _panelLocations.Add(control.ApplicationName, panelNameToMoveTo);

                    mainLayout.Items.Add(newFloatingPanel);
                    return;
                }
            }

            //desktopFeatureAccess = AifServiceContainer.Instance.GetService<IDesktopFeatureAccess>();
            //desktopFeatureAccess.MoveApplicationToPanel(GetApp(control.ApplicationName), "Main Layout/" + panelNameToMoveTo);
            var eventParams = new Dictionary<string, string>();
            eventParams.Add("Panel", "Main Layout/" + panelNameToMoveTo);

            var eventResult = router.FireEvent(control.localSession, control.ApplicationName, "MoveToPanel", eventParams);
            mainLayout.UpdateLayout();
            if (_panelLocations == null)
                _panelLocations = new Dictionary<string, string>();
            if (_panelLocations.ContainsKey(control.ApplicationName))
                _panelLocations[control.ApplicationName] = panelNameToMoveTo;
            else
                _panelLocations.Add(control.ApplicationName, panelNameToMoveTo);
        }

        /// <summary>
        /// Return true if already exists with same value. Otherwise returns false.
        /// </summary>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        private bool CheckUserLayoutSetting(string name, string value)
        {
            if (_userSettings == null)
                return false;
            foreach (var setting in _userSettings)
            {
                var nameSetting = _client.CrmInterface.GetDataByKeyFromResultsSet<string>(setting.Value, "msdyusd_name");
                if (nameSetting.Equals(name, StringComparison.InvariantCultureIgnoreCase))
                {
                    var valueSetting = _client.CrmInterface.GetDataByKeyFromResultsSet<string>(setting.Value, "msdyusd_settingvalue");
                    if (!string.IsNullOrEmpty(valueSetting) && valueSetting.Equals(value, StringComparison.InvariantCultureIgnoreCase))
                    {
                        return true;
                    }
                }
            }
            return false;
        }

        private Dictionary<string, Dictionary<string, object>> GetUserSettingsCache()
        {
            var result = new Dictionary<string, Dictionary<string, object>>();
            result = _client.CrmInterface.GetEntityDataByFetchSearch(USDConfigurationFetchXML.GetUserSettings);
            return result;
        }

        private void UpsertUserSetting(string name, string value)
        {
            if (CheckUserLayoutSetting(name, value))
            {
                return;
            }

            Guid myUserId = _client.CrmInterface.GetMyCrmUserId();

            // Create settings data payload.
            var settingData = new Dictionary<string, CrmDataTypeWrapper>();
            settingData.Add("msdyusd_name", new CrmDataTypeWrapper(name, CrmFieldType.String));
            settingData.Add("msdyusd_settingvalue", new CrmDataTypeWrapper(value, CrmFieldType.String));
            settingData.Add("msdyusd_user", new CrmDataTypeWrapper(myUserId, CrmFieldType.Lookup, "systemuser"));

            bool completed = false;

            string fetchXML = string.Format(USDConfigurationFetchXML.GetCurrentActiveUserSettingByName, name);
            var response = _client.CrmInterface.GetEntityDataByFetchSearch(fetchXML);
            if (response != null && response.Count > 0)
            {
                // Have value.. do an update.
                // get ID
                Guid guSettingId = _client.CrmInterface.GetDataByKeyFromResultsSet<Guid>(response.First().Value, "msdyusd_usersettingsid");
                if (guSettingId != Guid.Empty)
                {
                    completed = _client.CrmInterface.UpdateEntity("msdyusd_usersettings", "msdyusd_usersettingsid", guSettingId, settingData);
                }
            }
            else
            {
                // Do not have a value, do a create.
                Guid guSettingId = _client.CrmInterface.CreateNewRecord("msdyusd_usersettings", settingData);
                if (guSettingId != Guid.Empty)
                    completed = true;
            }
            _userSettings = GetUserSettingsCache();
        }

        private void SaveLayout(Uii.Csr.RequestActionEventArgs args)
        {
            var currentPanelLayout = mainLayout.Save().Root.ToString();
            UpsertUserSetting("C1PanelLayout", currentPanelLayout);
        }

        private void LoadLayout()
        {
            Guid myUserId = _client.CrmInterface.GetMyCrmUserId();

            // Create settings data payload.

            var completed = false;
            var fetchXML = string.Format(USDConfigurationFetchXML.GetCurrentActiveUserSettingByName, "C1Layout");
            var response = _client.CrmInterface.GetEntityDataByFetchSearch(fetchXML);
            if (response != null && response.Count > 0)
            {
                // Have value.. do an update.
                // get ID
                var guSettingId = _client.CrmInterface.GetDataByKeyFromResultsSet<Guid>(response.First().Value, "msdyusd_usersettingsid");

                if (guSettingId != Guid.Empty)
                {
                    var layout = _client.CrmInterface.GetDataByKeyFromResultsSet<string>(response.First().Value,
                        "msdyusd_settingvalue");
                    var layoutElement = XElement.Parse(layout);
                    mainLayout.Load(layoutElement);
                }
            }
        }

        private void SetLeftPanelWidth(string width)
        {
            try
            {
                LeftPanel2.DockWidth = Convert.ToDouble(width);
                SessionExplorerPanel.DockWidth = Convert.ToDouble(width);
            }
            catch
            {

            }
        }

        #endregion

        #region DoAction

        protected override void DoAction(Microsoft.Uii.Csr.RequestActionEventArgs args)
        {
            if (args.Action.Equals("SaveLayout", StringComparison.InvariantCultureIgnoreCase))
            {
                //Save to user settings the layout
                //TODO: Save layout to users settings.
                SaveLayout(args);
            }
            else if (args.Action.Equals("SetLeftPanelWidth", StringComparison.InvariantCultureIgnoreCase))
            {
                SetLeftPanelWidth(args.Data);
            }
            else if (args.Action.Equals("LoadLayout", StringComparison.InvariantCultureIgnoreCase))
            {
                LoadLayout();
            }
            else
            {
                base.DoAction(args);
            }
        }

        #endregion
    }
}


If a casual, relaxing ski town, properly-varied terrain for every single skiing level, kids' activities, lodging accommodations for just about every spending budget and preference sound like one thing you're hunting for in a ski vacation, then Winter Park ski region will please. It is simple to overheat in the spring temperatures and it is critical to don't forget you might not need that heavy winter parka. For us, getting ski equipment is out of the question, since we are NOT going to lug it from Singapore to Japan! Greyhounds just never have the body fat to aid them withstand a northern winter, and they also have a really thin coat – virtually no undercoat to their fur at all, and bare skin on the underparts – so their resistance to the cold is very limited. I am an intermediate, and I love the truth that Winter Park ski resort has bowl skiing close to the top for intermediate skiers!
My little ones are sporty, and that is why I knew they would take to it, and hence it created sense for us to invest in purchasing the ski put on. I have checked out the prices of the ski wear + glove rental rates for the ski resort that I program to go to in Japan. Practical guidance from two NOLS instructors on all elements of backcountry skiing and winter camping. Faux and fur stoles are also generating their way back in style and this winter ample of designers have adapted this appear in their collection. Give me a call at ext 3692 or email bill@ and let's talk about a trip to Winter Park!
As an adult, nevertheless, you want to hold those muscles sturdy and flexible so that when you are producing a sharp turn on the ski slopes or you take a fall, your muscles are in condition to deal with the pressure. I required to do this till the ski lift attendant recognised me. But when they changed rotated attendants, I had to do it all more than once more. If her ski jacket gets wet in the snow, I'll let her use mine, or we can take turns, haha. If Winter Park ski region sounds like the Colorado ski holiday you've been hunting to expertise this ski season, start off planning your trip right now.
Ultimately make positive you wear lengthy, comfy socks to remain warm and to keep away from a rash on your leg from the boots. When it rained, I could see that the exterior of the jackets got damp, but they said they were warm and dry inside. We also give insight and recommendations on where to ski and what off-mountain experiences you ought to attempt out while going to Winter Park. This is the type of winter jacket that you can wear whether it's snowing or raining – without having an umbrella! Specialists will be far more than pleased with the numerous difficult mogul runs at Mary Jane, as properly as Winter Park's inbound extreme zone: Vasquez Cirque, an annual host of an extreme skiing competitors. As the Columbia and The North Face brands are sized for Caucasians (they are both American brands), all 3 ski jackets are in S size. I came across your blog post as I am browsing for ski attire on taobao as properly.
At 22 rmb = S$five, I knew it was going to be soft and flexi, and probably won't final for much more than one winter trip. The hubby and I, and my two eldest sons are no longer going to outgrow the ski clothing anyway. If we choose to ski for a lot more than two days, I no longer have to consider about the expense of the ski put on rental. Anyway, I saw a Japanese man in a beige ski jacket which had a clear flap attachment on his jacket sleeve.