text:
DAVID WESSEL
B O O K S
W R I T I N G
M E D I A
"Understanding the economy is essential to being an informed citizen of our democracy. My goal is to explain trenchantly how the economy is changing and how economic policies we adopt today will shape the lives of future generations."
David Wessel is director of the Hutchins Center on Fiscal & Monetary Policy at the Brookings Institution, which he joined in 2014 after 30 years as a reporter, editor and columnist for The Wall Street Journal. He has shared two Pulitzer Prizes. David is the author of two New York Times best-sellers: "In Fed We Trust: Ben Bernanke's War on the Great Panic" and "Red Ink: Inside the High Stakes Politics of the Federal Budget." He tweets frequently at @davidmwessel.
New Release (October 2021)
Only the Rich Can Play:
How Washington Works in the New Gilded Age
Politics & Prose
A few pages quietly slipped into the 2017 tax cut law created an archipelago of 8,764 tax havens across the United States known as Opportunity Zones billed as a way to offer rich folks lucrative capital-gains tax breaks to put their money into left-behind communities. Illustrating how Washington really works in this new Gilded Age, Only the Rich Can Play traces the origins of OZs, as they're known, from their progenitor, Sean Parker of Napster and Facebook fame, and the think tank he funded to design them, organize a bipartisan coalition to support them, and lobby them into law – with Sen. Tim Scott, the sole Black Republican in the Senate, playing a pivotal role both in Congress and in winning Donald Trump's backing at a pivotal moment.
The book details the no-guardrails approach the Trump Treasury took to administering OZs and the choices (some good, some bad) that the nation's governors made in designating the zones from the list of eligible census tracts. Only the Rich Can Play describes the gold rush that was triggered when tax lawyers, accountants and real estate investors discovered the provision, and then turns to where the money went (a lot of it to places like prosperous downtown Portland, Oregon) and for what (often hotels, condos, self-storage facilities and luxury student-housing) and where it didn't (places like Baltimore) – and highlights a few places (South LA and Erie,Pa.) where Opportunity Zones are doing what they were supposed to do.
"David Wessel is a Washington treasure, and anything he writes is a must-read as far as I'm concerned. In Only the Rich Can Play David marries the depth of his understanding of economics with his years of experience as a Washington reporter and his skill at storytelling. He traces the origins of the Opportunity Zone Tax break from conception to birth and then shows how it actually working (or not) on the ground. This is both a great read and an important one because it shows those of us outside Washington how things really work there."
– Bryan Burrough, co-author of Barbarians at the Gate and Forget the Alamo
"David Wessel has long been one of the keenest observers of the American economy. This book shows his remarkable ability to combine intellectual meat with compelling narrative. Many Silicon Valley moguls are politically clueless, but Sean Parker of Napster and Facebook managed to slip his real estate investment scheme -- Opportunity Zones -- into law, despite almost no support from traditional thought leaders. You should read this book if you want to understand how to get things done in Washington. You should read this book if you want to understand the most important new urban policy in a generation. You should read this book if you just want to be entertained by a terrific political yarn."
– Edward Glaeser, Fred and Eleanor Glimp Professor of Economics Harvard University
"A fascinating and entertaining – albeit at times depressing and infuriating – story of how a major policy initiative came to be... a lesson in how social policy in America should not be made, but too often is, and an explanation of why the rich always seem to win."
– Melissa Kearney, Neil Moskowitz Professor of Economics at the University of Maryland
"Vegas, opulent parties, wine-filled dinners … not since the classic Showdown at Gucci Gulch has tax policy making been this much fun. But look beyond the vivid anecdotes and there's an important and underappreciated story about a program that will cost the federal treasury billions while helping a fraction of the people Congress intended. Wessel weaves together on-the-ground reporting, the best data and evidence, and deep knowledge of the policy process to show how strong moral convictions, vast wealth, and a turbocharged media presence can run up against entrenched special interests and inadequate vetting. The result, as one interviewee says, is a missed opportunity indeed."
– Tracy Gordon, The Urban Institute
"If you want to understand how the US has ended up with a tax code that on paper is progressive but in practice is so regressive that the very wealthy pay virtually no tax, Only the Rich Can Play is the place to start. In his wry style, Wessel uses the story of a tax provision dreamed up by a tech billionaire to show what happens when good intentions and arrogance collide with our tax-avoidance-industrial complex."
– Paul Romer, New York University, Nobel Laureate in Economics
"A must-read for anyone who wants to really understand how an idea can in time become a law—with the help of a large budget, skilled lobbying, and the support of a few key members of Congress. I thought I knew a bit about how Washington works, but I learned an enormous amount from David Wessel's very carefully researched and extremely well written book."
– David M. Rubenstein, cofounder and co-executive chairman of The Carlyle Group and author of How to Lead
The Rich Have Found Another Way to Pay Less Tax
The New York Times (Oct.10, 2021)
Congress tucked a provision into the 2017 tax bill that led to the creation of 8,764 tax havens across the United States called opportunity zones.
A capital-gains tax break sold as a way to induce the wealthy to invest in poor neighborhoods, opportunity zones appear to be providing more opportunity for the wealthy to cut their tax bills than to the people who live in designated zones. It's a case study on how very hard it is to tweak the tax code to direct money to places and activities that Congress favors without creating windfalls for the rich.
How a Tech Mogul Pushed Through a Tax Break
Wall Street Journal, Sept. 16, 2021
The U.S. tax code is larded with provisions that the wealthy use to reduce their taxes. Some get a lot of attention, while some are inserted into tax bills very quietly—like Opportunity Zones. Six pages tucked into the sprawling 2017 Tax Cuts and Jobs Act led to the creation of 8,764 of these tax havens across the U.S., ostensibly to lure private capital to poor neighborhoods.... The idea for Opportunity Zones didn't come from economists or policy experts. It was the brainchild of the tech investor Sean Parker, of Napster and facebook fame, who told me earlier this year that his objective was "to democratize access to capital."
@davidmwessel
© 2021 by David Wessel.


text:
Development Update: Monday, November 26
By The Futon Critic Staff (TFC)
LOS ANGELES (thefutoncritic.com) -- The latest development news, culled from recent wire reports:
Looking to keep track of all the various projects in development? Click here to visit our signature "Devwatch" section. There visitors can view our listings by network, genre, studio and even development stage (ordered to pilot, cast-contingent, script, etc.). It's updated every day!
25 WORDS OR LESS (Syndication) - Twentieth Television's Meredith Vieira-hosted game show is officially a go for a fall 2019 launch following a three-week trial run this summer. Executive producing for Dino Bones Productions, Is or Isn't Entertainment and Regular Brand are Vieira, Bruce Sterten, John Quinn, Lisa Kudrow, Dan Bucatinsky, Mary McCormack and Michael Morris. (Deadline.com)
3,000 HOURS (NBC, New!) - Erin Cardillo and Richard Keith have sold a third potential drama this season with a put pilot commitment from the Peacock. The project revolves around "a group of master's psychology candidates who embark on the 3,000 clinical hours they must spend in the field with patients to get their degrees - all while balancing their education, friendships and messy personal lives." Warner Bros. Television-based Berlanti Productions is behind the hour with Greg Berlanti and Sarah Schechter executive producing alongside In Good Company's Cardillo and Keith; and Ryan Lindenberg as a producer. (Deadline.com)
EDDY, THE (Netflix) - Olivier Bibas and Jimmy Desmarais of Atlantique Productions have signed on to executive produce Damien Chazelle's upcoming series at the streaming service, a musical drama set in contemporary multi-cultural Paris revolving around a club, its owner, the house band, and the chaotic city that surrounds them. (Variety.com)
GOOD FIGHT, THE (CBSAA) - Michael Urie will reprise his "The Good Wife" role of NSA lackey Stephen Dinovera on an upcoming episode of the spin-off series. (TVLine.com)
HAPPY ACCIDENT (ABC, New!) - Abraham Higginbotham and Jon Pollack are set to team for a single-camera comedy at the Alphabet about "two Pittsburgh families - a father with three adult daughters, and a hotel lounge singer with her med student son - who are forced together after a decades-old secret is revealed." ABC Studios and 20th Century Fox Television is behind the project, which has a pilot production commitment. (Deadline.com)
MACGYVER (CBS) - George Eads is bowing out of the series after three seasons. The actor "had an altercation in October and stormed off the show's Atlanta set despite having several hours of production remaining for the day." His final episode, where his Jack Dalton character is written out, will air sometime next year. (THR.com)
MODERN LOVE (Amazon) - Anne Hathaway, Tina Fey, John Slattery, Dev Patel, Catherine Keener, Andy Garcia, Cristin Milioti, Brandon Victor Dixon, Olivia Cooke, Andrew Scott, Julia Garner, Shea Whigham, Gary Carr, Sofia Boutella and John Gallagher, Jr. have all been cast in John Carney's half-hour romantic comedy anthology series. No specifics were given about their roles. Additionally, Emmy Rossum, Sharon Horgan and Tom Hall will direct episodes alongside Carney. Todd Hoffman, Sam Dolnick and Choire Sicha are also executive producing while Trish Hofmann serves as producer and Daniel Jones as consulting producer. Production is underway in New York. (Deadline.com)
SINGLE PARENTS (ABC) - Vanessa Bayer has been cast as Mia, the ex-wife of Taran Killam's Will, on the freshman comedy. Mia is described as "a scarf-wearing, bracelets-jangling human rights lawyer who has spent the last five years saving lives abroad. As such she regards Will's life to be a breeze and undermines his parenting at every turn." (TVLine.com)
SUNNY D (FOX, New!) - Saladin K. Patterson and Keenen Ivory Wayans are set to team for a domestic take on Dane Baptiste's BBC single-camera comedy about Dane, who "is deeply frustrated with life. He is approaching 30 and still lives with his parents in his childhood bedroom - an arrangement nobody is particularly happy about." Lionsgate Television is behind the half-hour, which has a penalty attached. The Tannenbaum Company's Eric and Kim Tannenbaum and Schwartz Management's Scott Schwartz will executive produce alongside Baptiste, Patterson and Wayans, the latter of which will direct. Jason Wang is co-executive producing. (Deadline.com)
SURVEILLANCE (CBS) - Dennis Haysbert is the latest addition to the Sophia Bush-led drama pilot as Barry, "the NSA Deputy Director, a father figure to Maddy and her longtime mentor." (Deadline.com)
UGLY DELICIOUS (Netflix) - David Chang took to social media over the holiday to reveal his series is coming back for a second season on the streaming service. (@davidchang)
· 25 WORDS OR LESS (SYNDICATION)
· 3,000 HOURS (NBC)
· DEVELOPMENT UPDATE (TFC)
· EDDY, THE (NETFLIX)
· GOOD FIGHT, THE (CBSAA)
· GOOD WIFE, THE (CBS)
· HAPPY ACCIDENT (ABC)
· MACGYVER (CBS)
· MODERN LOVE (AMAZON)
· SINGLE PARENTS (ABC)
· SUNNY D (FOX)
· SURVEILLANCE (CBS)
· UGLY DELICIOUS (NETFLIX)

redpajama_set_name: RedPajamaCommonCrawl


By David Melo. Discovered by Player FM and our community — copyright is owned by the publisher, not Player FM, and audio streamed directly from their servers.
39 episodes available. A new episode about every 9 days averaging 60 mins duration .
Puede un cristiano rebelarse a la autoridad?
Que nos divide y nos une como iglesia.
De la serie vida Cristiana, Sed De Dios, corrección histórica en la historia de Ravi y Hien cayó la Vietnam del Sur, no la del norte.
Start listening to David Melo on your phone right now with Player FM's free mobile app, the best podcasting experience on both iPhone and Android. Your subcriptions will sync with your account on this website too. Podcast smart and easy with the app that refuses to compromise.


text:
Home / Directory / John Bamforth, PhD
John Bamforth, PhD
Director, Eshelman Institute for Innovation
johnph@email.unc.edu
210 Beard Hall, , 7355, Chapel Hill, NC, 27599, locked
John is originally from the northwestern part of the UK but emigrated to the US in 2001. He now holds dual citizenship. A pharmacist with a PhD in neuropharmacology, John joined the Pharma industry in 1989 with Eli Lilly. Spending most of his career in commercial functions, he became recognized as a builder of global brands and leader of highly engaged teams.
Retiring from Lilly after 29 years, John returned to academia to lead the Eshelman Institute for Innovation at the University of North Carolina. The institute is focused on translating the brightest and best ideas on campus into products and services that impact patients. In his current role, John continues to advocate for diversity and inclusion and its demonstrated impact on performance and innovation.
John is on multiple boards including the Structural Genomics Consortium and Akanocure Pharma, where he is chairman of the board. John is also the interim Executive Director of READDI, a public-private partnership founded to develop novel anti-virals for the next pandemic.
John's passion outside work is his family; he has two children, Thomas and Rebecca, with his wife Sue. They also have two West Highland Terriers, Luke and Lucky, who he takes for endless walks. John and Sue founded the Ciara Arts and Science Foundation in 2017 which supports college scholarships for disadvantaged youth. John is a keen golfer and general sports geek. He loves to attend big sports events like the Masters, Ryder Cup, Super Bowl, and Rugby World Cup.


David Lowe from Lowe Wines has been kind enough to allow me to hold the October ACC sunset photo workshop at the famous Tinja Lane winery. I'm looking forward to some wonderful shots from our participants as the views are breathtaking. In addition to landscapes I'm hoping we will also fit in some portraiture, macro & environment photography.
Just to whet your appetite here is a quick birds eye view video of the winery.


From start to finish, Devotion is an excellent psychological horror game full of surreal imagery, creepy dolls, and wonderful environmental storytelling.
Wargroove is the best kind of strategy game because it has enough depth and complexity to be endlessly compelling in the hands of the best players but is also simple enough to understand for anyone to pick up and enjoy the charming pixel art. With a ton of content and an amazingly detailed level editor, Wargroove is like a love letter to turn-based strategy games.
Mutant Year Zero makes some subtle innovations for the tactical strategy genre outside of combat that transforms this from just another XCOM clone to a clever mixture of stealth, tactics, and RPG mechanics adding up to an adventure that's highly recommended.
Darksiders III will go down as the black sheep of the franchise. While the core gameplay itself is fun and it does a good enough job streamlining things with a more interesting cast of characters, it all just comes across as a bit too by-the-numbers to turn heads and doesn't push boundaries enough to really stand out. If it weren't for the technical issues this could be more highly-recommended, but as it stands, only die-hard fans should consider checking this one out.
While it may not bear the name Road Rash, Road Redemption is a spiritual successor that channels everything which made the original violent racer a classic.
Co-op zombie-splattering will never be devoid of fun, but Overkill's The Walking Dead is lacking in both the series' storytelling and technical polish.
Murkmire feels a bit more reserved than Summerset, but as a DLC that's expected -- and that doesn't mean this isn't well worth your time.
Ultimately the toys-to-life aspect feels like it gets in the way a bit of an otherwise competent and fun space shooter that's packed to the brim with things to do. Flying ships feels great and the occasional difficulty spikes rarely take away from the excitement of tearing through the atmosphere onto a new planet's surface. But not all platforms are created equally, with the Switch's Star Fox content shining as a bright point.
Super Mario Party elevates the franchise to a new platform and gives you plenty of things to do with friends. The randomness is still a bit more frustrating than it should be, but the high points make up for the occasional frustrations.
PUBG v1.0 on Xbox One runs smoothly, features three vastly different maps, and includes a ton of weapons, gear, and items to use in the deadliest online game. Its unique brand of tense, realistic shooting mixed with slow-paced tactical combat manages to stay fresh and exciting even after hundreds of matches. It makes coming back for another attempt at a "chicken dinner" victory hard to resist.
Phantom Doctrine has a lot of competition in the broader turn-based strategy genre and its unique Cold War-era setting isn't quite enough to really set it apart when all the cards are down. While the setting is great and fresh, the generally lackluster gameplay and mismatch of mechanics hold it back from feeling as clean as it should. Its best moments seem to happen almost completely at random or by accident instead of by design.
Earthfall is a valiant effort at trying to capture the lightning in a bottle once again that was Left 4 Dead. On paper it does a lot of things right, but in practice it lacks the soul and fire of what made Valve's iconic zombie games so effective almost a decade ago.
Ghost 1.0 is a lighthearted Metroidvania that adapts a sprawling sci-fi setting with some really creative takes on the genre. Even though it originally released on PC two years ago, it still manages to fit right into the Switch's growing library of quality sprite-based action adventures. If you're looking for a less somber journey after the harrowing depths of Hollow Knight, you could do far worse than Ghost 1.0 as long as the forgettable story and cringe-inducing humor aren't too off-putting..
Shining Resonance Refrain feels like a filler game. If you've been aching for a 3D action-RPG to sink some time into now that we're entering the summer months that are often a lull in the game industry then this totally fits the bill, but it'll do very little to surprise you.
Playing 20XX has an addictive rhythm to everything. You dive into the level, find loot like upgrades and currency bolts, kill bosses to take their weapons, and keep pushing until you die. After dying we'd often suffer from that 'just one more run' itch that's so common in roguelikes and the formula fits an action platformer like 20XX perfectly. The procedural engine does a good job of mixing things up, but after a while you can start to see a little repetition, but that's easily overshadowed by the sheer variety and amount of upgrades and customisation.
Antigraviator has a strong foundation for an fast-paced sci-fi racer, but lacks the content and unique footprint to really stand out. It's hard to recommend it over the likes of RedOut and WipEout, which offer highly similar experiences in much stronger overall packages.


text:
Governing Council Parties Are Said to Back Broad Autonomy for Kurds
EDWARD WONG New York Times
KIRKUK, Iraq, Jan. 9 The major political parties of the Iraqi Governing Council agreed at a meeting with Kurdish leaders on Thursday evening and Friday morning that the northern Kurdish region should keep much of the autonomy that it has held for the last 12 years, a senior Kurdish official said.
That includes allowing the region to remain together as one political body in a federalist system rather than dividing it up into several provinces, as some American officials had proposed, said the Kurdish official, Barham Salih, prime minister of the Patriotic Union of Kurdistan, one of two governing political parties in the Kurdish area.
Support of Governing Council members for broad Kurdish autonomy conflicts with the plans of the Bush administration, which is seeking to force Kurdish leaders to compromise on their demands for autonomous powers under the new government. L. Paul Bremer III, the top American administrator in Iraq, has met twice with Kurdish leaders, including Mr. Salih, in the last eight days to ask them to withdraw some requests, only to be rebuffed.
The issue of Kurdish autonomy has emerged as the most volatile one confronting American officials as they try to create a transitional government in Iraq by July 1. There is enormous reluctance by some senior White House officials to divide a federal Iraq along ethnic lines. Close regional allies of the United States like Turkey and Saudi Arabia have also chafed at this idea, for reasons related to their own concerns over ethnic and religious nationalism.
Mr. Salih, who attended the two-day meeting, said in an interview that the two main Kurdish parties were willing to accept the fact that they would not enjoy all the powers they had held since after the Persian Gulf war of 1991, when the United States and Britain declared northern Iraq a no-flight zone and protected the area from Saddam Hussein's forces.
The Kurds are ready to cede matters of foreign, monetary and national defense policy to the Iraqi national government, Mr. Salih said. Kurdish militiamen might become part of the national military, though they would answer to Kurdish authorities, he added.
"There was absolutely no dissension" from the need to "respect and defend many of the elements of the status quo in Kurdistan, including the governing structure of the Kurdish region," Mr. Salih said.
He added that leaders at the meeting discussed the future of Kirkuk, a city rich in oil and agricultural land 150 miles north of Baghdad and just south of the Kurdish region. The Kurdish parties have demanded control of the city of 1 million people. Some attendees supported a Kurdish proposal that would leave the decision of who governs Kirkuk up to a popular vote, Mr. Salih said.
Because of Kirkuk's natural resources and ethnic divisions, a vote would almost certainly stir enormous unrest throughout Iraq. The city's population is composed largely of Arabs, Kurds and Turkmens.
The outcome of a popular vote is hard to predict because no accurate census has been done since 1957. The 173rd Airborne Brigade, which controls the area, estimates that the population is 35 percent Arab, 35 percent Kurd, 26 percent Turkmen and 4 percent other, though those numbers are just rough guesses, said Maj. Douglas Vincent, a spokesman here for the occupation forces. The numbers are changing day by day, as Kurds move into the area and many Arabs move out.
The meeting took place in the area of Erbil, the capital of the half of the Kurdish region controlled by the Kurdish Democratic Party.
Several representatives could not be reached Friday for comment. In recent interviews, some prominent Governing Council members have said they favor a federal system in Iraq, with the Kurdish region remaining as one autonomous body.
"There will be a special structure for Kurdistan, and some kind of federal structure for Iraq, but we haven't gone into the details of that structure," said Adnan Pachachi, the head of the Governing Council.


Real Time Analysis refers to the ability to acquire "just in time" compositional data and also the ability to act on that data immediately to improve sorting efficiency and thus profitability. Real Time Analysis combines the capabilities of online analyzers, mechanical sampling systems and advanced computer technology to allow you to monitor and correct loading or blending while these activities are in progress.
Real Time Analysis is made possible by On-Line Analysis (OLA) systems. These systems allow mining operations, smelters, loading facilities, coal preparation plants and thermal power generators to monitor, control and optimize their loading, product sorting and blending processes during operation. OLA can indicate when modifications must be made that are beneficial to operations. This can have a substantial impact on your facility's efficiency and overall financial bottom line.


text:
Nina Golgowski
Three Florida high school students are threatening to sue Florida Gov. Ron DeSantis and the state of Florida over a recently announced statewide ban on a new Advanced Placement course on African American history.
The threatened legal action was announced Wednesday on behalf of the AP honors students who accuse the state and its Republican governor of censoring public education while heavily favoring white history over Black.
"Certainly there are other advanced placement histories, such as AP European History, AP U.S. History and AP World History, all predominantly generated towards white people," high school junior Victoria McQueen, one of the potential plaintiffs, said at a press conference alongside civil rights attorney Ben Crump, who would be representing them.
Crump, left, stands with the three Leon County high school students who are threatening to file a lawsuit against Gov. Ron DeSantis and his administration over Florida's ban of a proposed AP course on African American studies.
"If he does not negotiate with the College Board to allow African American studies to be taught in classrooms in the state of Florida, these three young people will be the lead plaintiffs in a historic lawsuit," Crump said of DeSantis.
The pilot program on African American studies was banned in Florida under DeSantis' so-called "Stop WOKE Act," which he signed into law last year. The legislation places restrictions on how racism and other aspects of history can be taught in schools and workplaces. It includes a ban on teaching "critical race theory," a college-level framework of study which argues that racism is embedded in legal systems and government policies.
Florida's Department of Education (DOE) said a number of topics ― including on critical race theory, Black queer studies and intersectionality ― need to be removed in order for the course to be taught in the state's schools.
A "Stop the Black Attack" rally in Tallahassee, Florida, on Wednesday, protests recent state legislation and policies that are seen as racist.
"As Governor DeSantis said, African American History is American History, and we will not allow any organization to use an academic course as a gateway for indoctrination and a political agenda," said Florida Department of Education Communications Director Alex Lanfranconi in a statement Wednesday.
The College Board announced Tuesday that it will present its official framework on the course on Feb. 1 after considering feedback it has received from high schools and colleges that have already participated in the pilot program nationwide.
"This framework, under development since March 2022, replaces the preliminary pilot course framework under discussion to date," the nonprofit organization said, without sharing any specifics on how the official course may differ from the pilot.
Florida Gov. Ron DeSantis has called the AP course
Florida Gov. Ron DeSantis has called the AP course "indoctrination, not education."
Florida's DOE, in a letter to the College Board last week, said the AP course includes historically inaccurate content and "significantly lacks educational value." It suggested that the course be amended for any future consideration.
The pilot course is "indoctrination, not education," DeSantis said at a press conference Monday.
"Who would say that an important part of Black history is queer theory?" he said. "That's the wrong side of the line for Florida standards. When you try to use Black history to shoehorn in queer theory, you are clearly trying to use that for political purposes."
Related...
Ron DeSantis' 'Anti-Woke' Education Agenda Just Got A Big Boost
Florida Bans AP African-American History Course Over 'Educational Value'
Ron DeSantis Proposes Permanently Banning COVID-19 Mandates
Conway, Mitchell help New Zealand down India in T20 opener
Opener Devon Conway and Daryl Mitchell hit quickfire fifties to set up a convincing 21-run victory for New Zealand in the first T20 international against India on Friday.Conway raised his fifty in 31 balls and found another attacking partner in Mitchell, who hit five sixes in his 30-ball blitz, as they added 36 for the fourth wicket.
At least 51 people were killed in two separate transport accidents in western Pakistan on Sunday, when a bus plunged off a bridge and a boat carrying a class of children capsized.The bus was reportedly carrying a total of 48 passengers when it hit a pillar on the bridge and careened off course earlier on Sunday.


text:
// Partial Copy of commons-io https://github.com/apache/commons-io/blob/29b70e156f9241b0c3e25896c931d1ef8725ad66/src/main/java/org/apache/commons/io/FilenameUtils.java

package io.fabric8.kubernetes.client.lib;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * General file name and file path manipulation utilities.
 *

 * When dealing with file names you can hit problems when moving from a Windows
 * based development machine to a Unix based production machine.
 * This class aims to help avoid those problems.
 *

 * NOTE: You may be able to avoid using this class entirely simply by
 * using JDK {@link java.io.File File} objects and the two argument constructor
 * {@link java.io.File#File(java.io.File, java.lang.String) File(File,String)}.
 *

 * Most methods on this class are designed to work the same on both Unix and Windows.
 * Those that don't include 'System', 'Unix' or 'Windows' in their name.
 *

 * Most methods recognize both separators (forward and back), and both
 * sets of prefixes. See the Javadoc of each method for details.
 *

 * This class defines six components within a file name
 * (example C:\dev\project\file.txt):
 *

 *
the prefix - C:\

 *
the path - dev\project\

 *
the full path - C:\dev\project\

 *
the name - file.txt

 *
the base name - file

 *
the extension - txt

 *

 * Note that this class works best if directory file names end with a separator.
 * If you omit the last separator, it is impossible to determine if the file name
 * corresponds to a file or a directory. As a result, we have chosen to say
 * it corresponds to a file.
 *

 * This class only supports Unix and Windows style names.
 * Prefixes are matched as follows:
 *

 * Windows:
 * a\b\c.txt           --> ""          --> relative
 * \a\b\c.txt          --> "\"         --> current drive absolute
 * C:a\b\c.txt         --> "C:"        --> drive relative
 * C:\a\b\c.txt        --> "C:\"       --> absolute
 * \\server\a\b\c.txt  --> "\\server\" --> UNC
 *
 * Unix:
 * a/b/c.txt           --> ""          --> relative
 * /a/b/c.txt          --> "/"         --> absolute
 * ~/a/b/c.txt         --> "~/"        --> current user
 * ~                   --> "~/"        --> current user (slash added)
 * ~user/a/b/c.txt     --> "~user/"    --> named user
 * ~user               --> "~user/"    --> named user (slash added)
 *

 * Both prefix styles are matched always, irrespective of the machine that you are
 * currently running on.
 *

 * Origin of code: Excalibur, Alexandria, Tomcat, Commons-Utils.
 *
 * @since 1.1
 */
public class FilenameUtils {

  private static final String[] EMPTY_STRING_ARRAY = new String[0];

  private static final String EMPTY_STRING = "";

  private static final int NOT_FOUND = -1;

  /**
   * The Unix separator character.
   */
  private static final char UNIX_SEPARATOR = '/';

  /**
   * The Windows separator character.
   */
  private static final char WINDOWS_SEPARATOR = '\\';

  /**
   * The system separator character.
   */
  private static final char SYSTEM_SEPARATOR = File.separatorChar;

  /**
   * The separator character that is the opposite of the system separator.
   */
  private static final char OTHER_SEPARATOR;
  static {
    if (isSystemWindows()) {
      OTHER_SEPARATOR = UNIX_SEPARATOR;
    } else {
      OTHER_SEPARATOR = WINDOWS_SEPARATOR;
    }
  }

  /**
   * Instances should NOT be constructed in standard programming.
   */
  private FilenameUtils() {
  }

  //-----------------------------------------------------------------------
  /**
   * Determines if Windows file system is in use.
   *
   * @return true if the system is Windows
   */
  static boolean isSystemWindows() {
    return SYSTEM_SEPARATOR == WINDOWS_SEPARATOR;
  }

  //-----------------------------------------------------------------------
  /**
   * Checks if the character is a separator.
   *
   * @param ch  the character to check
   * @return true if it is a separator character
   */
  private static boolean isSeparator(final char ch) {
    return ch == UNIX_SEPARATOR || ch == WINDOWS_SEPARATOR;
  }

  //-----------------------------------------------------------------------
  /**
   * Normalizes a path, removing double and single dot path steps.
   *

   * This method normalizes a path to a standard format.
   * The input may contain separators in either Unix or Windows format.
   * The output will contain separators in the format of the system.
   *

   * A trailing slash will be retained.
   * A double slash will be merged to a single slash (but UNC names are handled).
   * A single dot path segment will be removed.
   * A double dot will cause that path segment and the one before to be removed.
   * If the double dot has no parent path segment to work with, {@code null}
   * is returned.
   *

   * The output will be the same on both Unix and Windows except
   * for the separator character.
   *

   * /foo//               -->   /foo/
   * /foo/./              -->   /foo/
   * /foo/../bar          -->   /bar
   * /foo/../bar/         -->   /bar/
   * /foo/../bar/../baz   -->   /baz
   * //foo//./bar         -->   /foo/bar
   * /../                 -->   null
   * ../foo               -->   null
   * foo/bar/..           -->   foo/
   * foo/../../bar        -->   null
   * foo/../bar           -->   bar
   * //server/foo/../bar  -->   //server/bar
   * //server/../bar      -->   null
   * C:\foo\..\bar        -->   C:\bar
   * C:\..\bar            -->   null
   * ~/foo/../bar/        -->   ~/bar/
   * ~/../bar             -->   null
   *

   * (Note the file separator returned will be correct for Windows/Unix)
   *
   * @param fileName  the fileName to normalize, null returns null
   * @return the normalized fileName, or null if invalid. Null bytes inside string will be removed
   */
  public static String normalize(final String fileName) {
    return doNormalize(fileName, SYSTEM_SEPARATOR, true);
  }

  /**
   * Normalizes a path, removing double and single dot path steps,
   * and removing any final directory separator.
   *

   * This method normalizes a path to a standard format.
   * The input may contain separators in either Unix or Windows format.
   * The output will contain separators in the format specified.
   *

   * A trailing slash will be removed.
   * A double slash will be merged to a single slash (but UNC names are handled).
   * A single dot path segment will be removed.
   * A double dot will cause that path segment and the one before to be removed.
   * If the double dot has no parent path segment to work with, {@code null}
   * is returned.
   *

   * The output will be the same on both Unix and Windows including
   * the separator character.
   *

   * /foo//               -->   /foo
   * /foo/./              -->   /foo
   * /foo/../bar          -->   /bar
   * /foo/../bar/         -->   /bar
   * /foo/../bar/../baz   -->   /baz
   * //foo//./bar         -->   /foo/bar
   * /../                 -->   null
   * ../foo               -->   null
   * foo/bar/..           -->   foo
   * foo/../../bar        -->   null
   * foo/../bar           -->   bar
   * //server/foo/../bar  -->   //server/bar
   * //server/../bar      -->   null
   * C:\foo\..\bar        -->   C:\bar
   * C:\..\bar            -->   null
   * ~/foo/../bar/        -->   ~/bar
   * ~/../bar             -->   null
   *

   *
   * @param fileName  the fileName to normalize, null returns null
   * @param unixSeparator {@code true} if a unix separator should
   * be used or {@code false} if a windows separator should be used.
   * @return the normalized fileName, or null if invalid. Null bytes inside string will be removed
   * @since 2.0
   */
  public static String normalizeNoEndSeparator(final String fileName, final boolean unixSeparator) {
    final char separator = unixSeparator ? UNIX_SEPARATOR : WINDOWS_SEPARATOR;
    return doNormalize(fileName, separator, false);
  }

  /**
   * Internal method to perform the normalization.
   *
   * @param fileName  the fileName
   * @param separator The separator character to use
   * @param keepSeparator  true to keep the final separator
   * @return the normalized fileName. Null bytes inside string will be removed.
   */
  private static String doNormalize(final String fileName, final char separator, final boolean keepSeparator) {
    if (fileName == null) {
      return null;
    }

    requireNonNullChars(fileName);

    int size = fileName.length();
    if (size == 0) {
      return fileName;
    }
    final int prefix = getPrefixLength(fileName);
    if (prefix < 0) {
      return null;
    }

    final char[] array = new char[size + 2];  // +1 for possible extra slash, +2 for arraycopy
    fileName.getChars(0, fileName.length(), array, 0);

    // fix separators throughout
    final char otherSeparator = separator == SYSTEM_SEPARATOR ? OTHER_SEPARATOR : SYSTEM_SEPARATOR;
    for (int i = 0; i < array.length; i++) {
      if (array[i] == otherSeparator) {
        array[i] = separator;
      }
    }

    // add extra separator on the end to simplify code below
    boolean lastIsDirectory = true;
    if (array[size - 1] != separator) {
      array[size++] = separator;
      lastIsDirectory = false;
    }

    // adjoining slashes
    for (int i = prefix + 1; i < size; i++) {
      if (array[i] == separator && array[i - 1] == separator) {
        System.arraycopy(array, i, array, i - 1, size - i);
        size--;
        i--;
      }
    }

    // dot slash
    for (int i = prefix + 1; i < size; i++) {
      if (array[i] == separator && array[i - 1] == '.' &&
        (i == prefix + 1 || array[i - 2] == separator)) {
        if (i == size - 1) {
          lastIsDirectory = true;
        }
        System.arraycopy(array, i + 1, array, i - 1, size - i);
        size -=2;
        i--;
      }
    }

    // double dot slash
    outer:
    for (int i = prefix + 2; i < size; i++) {
      if (array[i] == separator && array[i - 1] == '.' && array[i - 2] == '.' &&
        (i == prefix + 2 || array[i - 3] == separator)) {
        if (i == prefix + 2) {
          return null;
        }
        if (i == size - 1) {
          lastIsDirectory = true;
        }
        int j;
        for (j = i - 4 ; j >= prefix; j--) {
          if (array[j] == separator) {
            // remove b/../ from a/b/../c
            System.arraycopy(array, i + 1, array, j + 1, size - i);
            size -= i - j;
            i = j + 1;
            continue outer;
          }
        }
        // remove a/../ from a/../c
        System.arraycopy(array, i + 1, array, prefix, size - i);
        size -= i + 1 - prefix;
        i = prefix + 1;
      }
    }

    if (size <= 0) {  // should never be less than 0
      return EMPTY_STRING;
    }
    if (size <= prefix) {  // should never be less than prefix
      return new String(array, 0, size);
    }
    if (lastIsDirectory && keepSeparator) {
      return new String(array, 0, size);  // keep trailing separator
    }
    return new String(array, 0, size - 1);  // lose trailing separator
  }

  /**
   * Converts all separators to the Unix separator of forward slash.
   *
   * @param path  the path to be changed, null ignored
   * @return the updated path
   */
  public static String separatorsToUnix(final String path) {
    if (path == null || path.indexOf(WINDOWS_SEPARATOR) == NOT_FOUND) {
      return path;
    }
    return path.replace(WINDOWS_SEPARATOR, UNIX_SEPARATOR);
  }

  /**
   * Converts all separators to the Windows separator of backslash.
   *
   * @param path  the path to be changed, null ignored
   * @return the updated path
   */
  public static String separatorsToWindows(final String path) {
    if (path == null || path.indexOf(UNIX_SEPARATOR) == NOT_FOUND) {
      return path;
    }
    return path.replace(UNIX_SEPARATOR, WINDOWS_SEPARATOR);
  }

  /**
   * Converts all separators to the system separator.
   *
   * @param path  the path to be changed, null ignored
   * @return the updated path
   */
  public static String separatorsToSystem(final String path) {
    if (path == null) {
      return null;
    }
    return isSystemWindows() ? separatorsToWindows(path) : separatorsToUnix(path);
  }

  /**
   * Returns the length of the fileName prefix, such as {@code C:/} or {@code ~/}.
   *

   * This method will handle a file in either Unix or Windows format.
   *

   * The prefix length includes the first slash in the full fileName
   * if applicable. Thus, it is possible that the length returned is greater
   * than the length of the input string.
   *

   * Windows:
   * a\b\c.txt           --> 0           --> relative
   * \a\b\c.txt          --> 1           --> current drive absolute
   * C:a\b\c.txt         --> 2           --> drive relative
   * C:\a\b\c.txt        --> 3           --> absolute
   * \\server\a\b\c.txt  --> 9           --> UNC
   * \\\a\b\c.txt        --> -1          --> error
   *
   * Unix:
   * a/b/c.txt           --> 0           --> relative
   * /a/b/c.txt          --> 1           --> absolute
   * ~/a/b/c.txt         --> 2           --> current user
   * ~                   --> 2           --> current user (slash added)
   * ~user/a/b/c.txt     --> 6           --> named user
   * ~user               --> 6           --> named user (slash added)
   * //server/a/b/c.txt  --> 9
   * ///a/b/c.txt        --> -1          --> error
   * C:                  --> 0           --> valid filename as only null byte and / are reserved characters
   *

   *

   * The output will be the same irrespective of the machine that the code is running on.
   * ie. both Unix and Windows prefixes are matched regardless.
   *
   * Note that a leading // (or \\) is used to indicate a UNC name on Windows.
   * These must be followed by a server name, so double-slashes are not collapsed
   * to a single slash at the start of the fileName.
   *
   * @param fileName  the fileName to find the prefix in, null returns -1
   * @return the length of the prefix, -1 if invalid or null
   */
  public static int getPrefixLength(final String fileName) {
    if (fileName == null) {
      return NOT_FOUND;
    }
    final int len = fileName.length();
    if (len == 0) {
      return 0;
    }
    char ch0 = fileName.charAt(0);
    if (ch0 == ':') {
      return NOT_FOUND;
    }
    if (len == 1) {
      if (ch0 == '~') {
        return 2;  // return a length greater than the input
      }
      return isSeparator(ch0) ? 1 : 0;
    }
    if (ch0 == '~') {
      int posUnix = fileName.indexOf(UNIX_SEPARATOR, 1);
      int posWin = fileName.indexOf(WINDOWS_SEPARATOR, 1);
      if (posUnix == NOT_FOUND && posWin == NOT_FOUND) {
        return len + 1;  // return a length greater than the input
      }
      posUnix = posUnix == NOT_FOUND ? posWin : posUnix;
      posWin = posWin == NOT_FOUND ? posUnix : posWin;
      return Math.min(posUnix, posWin) + 1;
    }
    final char ch1 = fileName.charAt(1);
    if (ch1 == ':') {
      ch0 = Character.toUpperCase(ch0);
      if (ch0 >= 'A' && ch0 <= 'Z') {
        if (len == 2 && !FileSystem.getCurrent().supportsDriveLetter()) {
          return 0;
        }
        if (len == 2 || !isSeparator(fileName.charAt(2))) {
          return 2;
        }
        return 3;
      } else if (ch0 == UNIX_SEPARATOR) {
        return 1;
      }
      return NOT_FOUND;

    } else if (isSeparator(ch0) && isSeparator(ch1)) {
      int posUnix = fileName.indexOf(UNIX_SEPARATOR, 2);
      int posWin = fileName.indexOf(WINDOWS_SEPARATOR, 2);
      if (posUnix == NOT_FOUND && posWin == NOT_FOUND || posUnix == 2 || posWin == 2) {
        return NOT_FOUND;
      }
      posUnix = posUnix == NOT_FOUND ? posWin : posUnix;
      posWin = posWin == NOT_FOUND ? posUnix : posWin;
      final int pos = Math.min(posUnix, posWin) + 1;
      final String hostnamePart = fileName.substring(2, pos - 1);
      return isValidHostName(hostnamePart) ? pos : NOT_FOUND;
    } else {
      return isSeparator(ch0) ? 1 : 0;
    }
  }

  /**
   * Checks the input for null bytes, a sign of unsanitized data being passed to to file level functions.
   *
   * This may be used for poison byte attacks.
   *
   * @param path the path to check
   */
  private static void requireNonNullChars(final String path) {
    if (path.indexOf(0) >= 0) {
      throw new IllegalArgumentException("Null byte present in file/path name. There are no "
        + "known legitimate use cases for such data, but several injection attacks may use it");
    }
  }

  /**
   * Checks whether a given string is a valid host name according to
   * RFC 3986.
   *
   *
Accepted are IP addresses (v4 and v6) as well as what the
   * RFC calls a "reg-name". Percent encoded names don't seem to be
   * valid names in UNC paths.

   *
   * @see "https://tools.ietf.org/html/rfc3986#section-3.2.2"
   * @param name the hostname to validate
   * @return true if the given name is a valid host name
   */
  private static boolean isValidHostName(final String name) {
    return isIPv6Address(name) || isRFC3986HostName(name);
  }

  private static final Pattern IPV4_PATTERN =
    Pattern.compile("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$");
  private static final int IPV4_MAX_OCTET_VALUE = 255;

  /**
   * Checks whether a given string represents a valid IPv4 address.
   *
   * @param name the name to validate
   * @return true if the given name is a valid IPv4 address
   */
  // mostly copied from org.apache.commons.validator.routines.InetAddressValidator#isValidInet4Address
  private static boolean isIPv4Address(final String name) {
    final Matcher m = IPV4_PATTERN.matcher(name);
    if (!m.matches() || m.groupCount() != 4) {
      return false;
    }

    // verify that address subgroups are legal
    for (int i = 1; i <= 4; i++) {
      final String ipSegment = m.group(i);
      final int iIpSegment = Integer.parseInt(ipSegment);
      if (iIpSegment > IPV4_MAX_OCTET_VALUE) {
        return false;
      }

      if (ipSegment.length() > 1 && ipSegment.startsWith("0")) {
        return false;
      }

    }

    return true;
  }

  private static final int IPV6_MAX_HEX_GROUPS = 8;
  private static final int IPV6_MAX_HEX_DIGITS_PER_GROUP = 4;
  private static final int MAX_UNSIGNED_SHORT = 0xffff;
  private static final int BASE_16 = 16;

  // copied from org.apache.commons.validator.routines.InetAddressValidator#isValidInet6Address
  /**
   * Checks whether a given string represents a valid IPv6 address.
   *
   * @param inet6Address the name to validate
   * @return true if the given name is a valid IPv6 address
   */
  private static boolean isIPv6Address(final String inet6Address) {
    final boolean containsCompressedZeroes = inet6Address.contains("::");
    if (containsCompressedZeroes && (inet6Address.indexOf("::") != inet6Address.lastIndexOf("::"))) {
      return false;
    }
    if ((inet6Address.startsWith(":") && !inet6Address.startsWith("::"))
      || (inet6Address.endsWith(":") && !inet6Address.endsWith("::"))) {
      return false;
    }
    String[] octets = inet6Address.split(":");
    if (containsCompressedZeroes) {
      final List<String> octetList = new ArrayList<>(Arrays.asList(octets));
      if (inet6Address.endsWith("::")) {
        // String.split() drops ending empty segments
        octetList.add("");
      } else if (inet6Address.startsWith("::") && !octetList.isEmpty()) {
        octetList.remove(0);
      }
      octets = octetList.toArray(EMPTY_STRING_ARRAY);
    }
    if (octets.length > IPV6_MAX_HEX_GROUPS) {
      return false;
    }
    int validOctets = 0;
    int emptyOctets = 0; // consecutive empty chunks
    for (int index = 0; index < octets.length; index++) {
      final String octet = octets[index];
      if (octet.isEmpty()) {
        emptyOctets++;
        if (emptyOctets > 1) {
          return false;
        }
      } else {
        emptyOctets = 0;
        // Is last chunk an IPv4 address?
        if (index == octets.length - 1 && octet.contains(".")) {
          if (!isIPv4Address(octet)) {
            return false;
          }
          validOctets += 2;
          continue;
        }
        if (octet.length() > IPV6_MAX_HEX_DIGITS_PER_GROUP) {
          return false;
        }
        int octetInt = 0;
        try {
          octetInt = Integer.parseInt(octet, BASE_16);
        } catch (final NumberFormatException e) {
          return false;
        }
        if (octetInt < 0 || octetInt > MAX_UNSIGNED_SHORT) {
          return false;
        }
      }
      validOctets++;
    }
    return validOctets <= IPV6_MAX_HEX_GROUPS && (validOctets >= IPV6_MAX_HEX_GROUPS || containsCompressedZeroes);
  }
  private static final Pattern REG_NAME_PART_PATTERN = Pattern.compile("^[a-zA-Z0-9][a-zA-Z0-9-]*$");

  /**
   * Checks whether a given string is a valid host name according to
   * RFC 3986 - not accepting IP addresses.
   *
   * @see "https://tools.ietf.org/html/rfc3986#section-3.2.2"
   * @param name the hostname to validate
   * @return true if the given name is a valid host name
   */
  private static boolean isRFC3986HostName(final String name) {
    final String[] parts = name.split("\\.", -1);
    for (int i = 0; i < parts.length; i++) {
      if (parts[i].isEmpty()) {
        // trailing dot is legal, otherwise we've hit a .. sequence
        return i == parts.length - 1;
      }
      if (!REG_NAME_PART_PATTERN.matcher(parts[i]).matches()) {
        return false;
      }
    }
    return true;
  }
}

redpajama_set_name: RedPajamaGithub


text:
{-# LANGUAGE QuasiQuotes,
             BangPatterns,
             ScopedTypeVariables,
             TemplateHaskell,
             OverloadedStrings #-}

{-
  The compactor does link-time optimization. It is much simpler
  than the Optimizer, no fancy dataflow analysis here.

  Optimizations:
  - rewrite all variables starting with h$$ to shorter names,
       these are internal names
  - write all function metadata compactly
 -}

module Gen2.Compactor where

import           DynFlags

import           Control.Applicative
import           Control.Lens
import           Control.Monad.State.Strict

import qualified Data.Binary.Get as DB
import qualified Data.Binary.Put as DB
import           Data.Bits
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString as BS
import           Data.Char (chr, ord)
import           Data.Function (on)
import           Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HM
import           Data.Int
import           Data.List
import           Data.Maybe
import           Data.Monoid
import           Data.Text (Text)
import qualified Data.Text as T

import           Compiler.JMacro
import           Compiler.Settings

import           Gen2.Base
import           Gen2.ClosureInfo
import           Gen2.Utils (buildingProf, buildingDebug)

-- | collect global objects (data / CAFs). rename them and add them to the table
collectGlobals :: [StaticInfo]
               -> State CompactorState ()
collectGlobals = mapM_ (\(StaticInfo i _ _) -> renameObj i)

debugShowStat :: (JStat, [ClosureInfo], [StaticInfo]) -> String
debugShowStat (_s, cis, sis) = "closures:\n" ++ unlines (map show cis) ++ "\nstatics:" ++ unlines (map show sis) ++ "\n\n"

renameInternals :: GhcjsSettings
                -> DynFlags
                -> CompactorState
                -> [(JStat, [ClosureInfo], [StaticInfo])]
                -> (CompactorState, [JStat], JStat)
renameInternals _settings dflags cs0 stats0 = (cs, stats, meta)
  where
    ((stats, meta), cs) = runState renamed cs0
    renamed :: State CompactorState ([JStat], JStat)
    renamed
      | buildingDebug dflags || buildingProf dflags = do
        cs <- get
        let renamedStats = map (\(s,_,_) -> s & identsS %~ lookupRenamed cs) stats0
            statics      = map (renameStaticInfo cs)  $ concatMap (\(_,_,x) -> x) stats0
            infos        = map (renameClosureInfo cs) $ concatMap (\(_,x,_) -> x) stats0
            -- render metadata as individual statements
            meta = mconcat (map staticDeclStat statics) <>
                   mconcat (map (staticInitStat $ buildingProf dflags) statics) <>
                   mconcat (map (closureInfoStat True) infos)
        return (renamedStats, meta)
      | otherwise = do
        -- collect all global objects and entries, add them to the renaming table
        mapM_ (\(_, cis, sis) -> do
               mapM_ (renameEntry . TxtI . ciVar) cis
               mapM_ (renameObj . siVar) sis
               mapM_ collectLabels sis) stats0

        -- sort our entries, store the results
        -- propagate all renamings throughtout the code
        cs <- get
        let renamedStats = map (\(s,_,_) -> s & identsS %~ lookupRenamed cs) stats0
            sortedInfo   = concatMap (\(_,xs,_) -> map (renameClosureInfo cs) xs) stats0
            entryArr     = map (TxtI . fst) . sortBy (compare `on` snd) . HM.toList $ cs ^. entries
            lblArr       = map (TxtI . fst) . sortBy (compare `on` snd) . HM.toList $ cs ^. labels
            ss           = concatMap (\(_,_,xs) -> map (renameStaticInfo cs) xs) stats0
            infoBlock    = encodeStr (concatMap (encodeInfo cs) sortedInfo)
            staticBlock  = encodeStr (concatMap (encodeStatic cs) ss)
            staticDecls  = mconcat (map staticDeclStat ss)
            meta = staticDecls <>
                   [j| h$scheduleInit(`entryArr`, h$staticDelayed, `lblArr`, `infoBlock`, `staticBlock`);
                       h$staticDelayed = [];
                     |]
        return (renamedStats, meta)

-- | rename a heap object, which means adding it to the
--  static init table in addition to the renamer
renameObj :: Text
          -> State CompactorState Text
renameObj xs = do
  (TxtI xs') <- renameVar (TxtI xs)
  addItem statics statics numStatics numStatics parentStatics xs'
  return xs'

renameEntry :: Ident
            -> State CompactorState Ident
renameEntry i = do
  i'@(TxtI i'') <- renameVar i
  addItem entries entries numEntries numEntries parentEntries i''
  return i'

addItem :: Getting (HashMap Text Int) CompactorState (HashMap Text Int)
        -> Setting (->) CompactorState CompactorState (HashMap Text Int) (HashMap Text Int)
        -> Getting Int CompactorState Int
        -> ASetter' CompactorState Int
        -> Getting (HashMap Text Int) CompactorState (HashMap Text Int)
        -> Text
        -> State CompactorState ()
addItem items items' numItems numItems' parentItems i = do
  s <- use items
  case HM.lookup i s of
    Just _ -> return ()
    Nothing -> do
      sp <- use parentItems
      case HM.lookup i sp of
        Just _  -> return ()
        Nothing -> do
          ni <- use numItems
          items' %= HM.insert i ni
          numItems' += 1

collectLabels :: StaticInfo -> State CompactorState ()
collectLabels si = mapM_ (addItem labels labels numLabels numLabels parentLabels) (labelsV . siVal $ si)
  where
    labelsV (StaticData _ args) = concatMap labelsA args
    labelsV (StaticList args _) = concatMap labelsA args
    labelsV _                   = []
    labelsA (StaticLitArg l) = labelsL l
    labelsA _                = []
    labelsL (LabelLit _ lbl) = [lbl]
    labelsL _                = []

lookupRenamed :: CompactorState -> Ident -> Ident
lookupRenamed cs i@(TxtI t) =
  case HM.lookup t (cs ^. nameMap) of
    Nothing -> i
    Just i' -> i'

renameVar :: Ident                      -- ^ text identifier to rename
          -> State CompactorState Ident -- ^ the updated renamer state and the new ident
renameVar i@(TxtI t)
  | "h$$" `T.isPrefixOf` t = do
      m <- use nameMap
      case HM.lookup t m of
        Just r  -> return r
        Nothing -> do
          y <- newIdent
          nameMap %= HM.insert t y
          return y
  | otherwise = return i

newIdent :: State CompactorState Ident
newIdent = do
  (y:ys) <- use identSupply
  identSupply .= ys
  return y

-- | rename a compactor info entry according to the compactor state (no new renamings are added)
renameClosureInfo :: CompactorState
                  -> ClosureInfo
                  -> ClosureInfo
renameClosureInfo cs (ClosureInfo v rs n l t s)  =
  (ClosureInfo (renameV v) rs n l t (f s))
    where
      renameV t = maybe t (\(TxtI t') -> t') (HM.lookup t m)
      m                   = cs ^. nameMap
      f (CIStaticRefs rs) = CIStaticRefs (map renameV rs)

-- | rename a static info entry according to the compactor state (no new renamings are added)
renameStaticInfo :: CompactorState
                 -> StaticInfo
                 -> StaticInfo
renameStaticInfo cs si = si & staticIdents %~ renameIdent
  where
    renameIdent t = maybe t (\(TxtI t') -> t') (HM.lookup t $ cs ^. nameMap)

staticIdents :: Traversal' StaticInfo Text
staticIdents f (StaticInfo i v cc) = StaticInfo <$> f i <*> staticIdentsV f v <*> pure cc

staticIdentsV :: Traversal' StaticVal Text
staticIdentsV f (StaticFun i)          = StaticFun <$> f i
staticIdentsV f (StaticThunk (Just i)) = StaticThunk . Just <$> f i
staticIdentsV f (StaticData con args)  = StaticData <$> f con <*> traverse (staticIdentsA f) args
staticIdentsV f (StaticList xs t)      = StaticList <$> traverse (staticIdentsA f) xs <*> traverse f t
staticIdentsV _ x                      = pure x

staticIdentsA :: Traversal' StaticArg Text
staticIdentsA f (StaticObjArg t) = StaticObjArg <$> f t
staticIdentsA _ x                = pure x

{-
   simple encoding of naturals using only printable low char points,
   rely on gzip to compress repeating sequences,
   most significant bits first
      1 byte: ascii code 32-123  (0-89), \ and " unused
      2 byte: 124 a b            (90-8189)
      3 byte: 125 a b c          (8190-737189)
-}
encodeStr :: [Int] -> String
encodeStr = concatMap encodeChr
  where
    c :: Int -> Char
    c i | i > 90 || i < 0 = error ("encodeStr: c " ++ show i)
        | i >= 59   = chr (34+i)
        | i >= 2    = chr (33+i)
        | otherwise = chr (32+i)
    encodeChr i
      | i < 0       = error "encodeStr: negative"
      | i <= 89     = [c i]
      | i <= 8189   = let (c1, c2)  = (i - 90) `divMod` 90 in [chr 124, c c1, c c2]
      | i <= 737189 = let (c2a, c3) = (i - 8190) `divMod` 90
                          (c1, c2)  = c2a `divMod` 90
                      in [chr 125, c c1, c c2, c c3]
      | otherwise = error "encodeStr: overflow"

entryIdx :: String
         -> CompactorState
         -> Text
         -> Int
entryIdx msg cs i = fromMaybe lookupParent (HM.lookup i' (cs ^. entries))
  where
    (TxtI i')    = lookupRenamed cs (TxtI i)
    lookupParent = maybe err (+ cs ^. numEntries) (HM.lookup i' (cs ^. parentEntries))
    err = error (msg ++ ": invalid entry: " ++ T.unpack i')

objectIdx :: String
          -> CompactorState
          -> Text
          -> Int
objectIdx msg cs i = fromMaybe lookupParent (HM.lookup i' (cs ^. statics))
  where
    (TxtI i')    = lookupRenamed cs (TxtI i)
    lookupParent = maybe err (+ cs ^. numStatics) (HM.lookup i' (cs ^. parentStatics))
    err          = error (msg ++ ": invalid static: " ++ T.unpack i')

labelIdx :: String
         -> CompactorState
         -> Text
         -> Int
labelIdx msg cs l = fromMaybe lookupParent (HM.lookup l (cs ^. labels))
  where
    lookupParent = maybe err (+ cs ^. numLabels) (HM.lookup l (cs ^. parentLabels))
    err          = error (msg ++ ": invalid label: " ++ T.unpack l)

encodeInfo :: CompactorState
           -> ClosureInfo  -- ^ information to encode
           -> [Int]
encodeInfo cs (ClosureInfo _var regs name layout typ static)
  | CIThunk              <- typ = [0] ++ ls
  | (CIFun _arity regs0) <- typ, regs0 /= argSize regs
     = error ("encodeInfo: inconsistent register metadata for " ++ T.unpack name)
  | (CIFun arity _regs0) <- typ = [1, arity, encodeRegs regs] ++ ls
  | (CICon tag)          <- typ = [2, tag] ++ ls
  | CIStackFrame         <- typ = [3, encodeRegs regs] ++ ls
-- (CIPap ar)         <- typ = [4, ar] ++ ls  -- these should only appear during runtime
  | otherwise                  = error ("encodeInfo, unexpected closure type: " ++ show typ)
  where
    ls         = encodeLayout layout ++ encodeSrt static
    encodeLayout CILayoutVariable      = [0]
    encodeLayout (CILayoutUnknown s)   = [s+1]
    encodeLayout (CILayoutFixed s _vs) = [s+1]
    encodeSrt (CIStaticRefs rs) = length rs : map (objectIdx "encodeInfo" cs) rs
    encodeRegs CIRegsUnknown = 0
    encodeRegs (CIRegs skip regTypes) = let nregs = sum (map varSize regTypes)
                                        in  encodeRegsTag skip nregs
    encodeRegsTag skip nregs
      | skip < 0 || skip > 1 = error "encodeRegsTag: unexpected skip"
      | otherwise            = 1 + (nregs `shiftL` 1) + skip
    argSize (CIRegs skip regTypes) = sum (map varSize regTypes) - 1 + skip
    argSize _ = 0

encodeStatic :: CompactorState
             -> StaticInfo
             -> [Int]
encodeStatic cs (StaticInfo _to sv _)
    | StaticFun f <- sv                           = [1, entry f]
    | StaticThunk (Just t) <- sv                  = [2, entry t]
    | StaticThunk Nothing <- sv                   = [0]
    | StaticUnboxed (StaticUnboxedBool b) <- sv   = [3 + fromEnum b]
    | StaticUnboxed (StaticUnboxedInt i) <- sv    = [5] -- ++ encodeInt i
    | StaticUnboxed (StaticUnboxedDouble d) <- sv = [6] -- ++ encodeDouble d
--    | StaticString t <- sv         = [7, T.length t] ++ map encodeChar (T.unpack t)
--    | StaticBin bs <- sv           = [8, BS.length bs] ++ map fromIntegral (BS.unpack bs)
    | StaticList [] Nothing <- sv                 = [8]
    | StaticList args t <- sv                     = [9, length args] ++ maybe [0] (\t' -> [1, obj t']) t ++ concatMap encodeArg (reverse args)
    | StaticData con args <- sv =
      (if length args <= 6 then [11+length args] else [10,length args]) ++ [entry con] ++ concatMap encodeArg args
  where
    obj   = objectIdx "encodeStatic" cs
    entry = entryIdx  "encodeStatic" cs
    lbl   = labelIdx  "encodeStatic" cs
    -- | an argument is either a reference to a heap object or a primitive value
    encodeArg (StaticLitArg (BoolLit b))    = [0 + fromEnum b]
    encodeArg (StaticLitArg (IntLit 0))     = [2]
    encodeArg (StaticLitArg (IntLit 1))     = [3]
    encodeArg (StaticLitArg (IntLit i))     = [4] ++ encodeInt i
    encodeArg (StaticLitArg NullLit)        = [5]
    encodeArg (StaticLitArg (DoubleLit d))  = [6] ++ encodeDouble d
    encodeArg (StaticLitArg (StringLit s))  = [7] ++ encodeString s
    encodeArg (StaticLitArg (BinLit b))     = [8] ++ encodeBinary b
    encodeArg (StaticLitArg (LabelLit b l)) = [9, fromEnum b, lbl l]
    encodeArg (StaticConArg con args)       = [10, entry con, length args] ++ concatMap encodeArg args
    encodeArg (StaticObjArg t)              = [11 + obj t]
    -- encodeArg x                             = error ("encodeArg: unexpected: " ++ show x)
    encodeChar = ord -- fixme make characters more readable

encodeString :: Text -> [Int]
encodeString xs = T.length xs : map ord (T.unpack xs)

-- ByteString is prefixed with length, then blocks of 4 numbers encoding 3 bytes
encodeBinary :: BS.ByteString -> [Int]
encodeBinary bs = BS.length bs : go bs
  where
    go b | BS.null b = []
         | l == 1    = let b0 = b `BS.index` 0
                       in  map fromIntegral [ b0 `shiftR` 2, (b0 .&. 3) `shiftL` 4 ]
         | l == 2    = let b0 = b `BS.index` 0
                           b1 = b `BS.index` 1
                       in  map fromIntegral [ b0 `shiftR` 2
                                            , ((b0 .&. 3) `shiftL` 4) .|. (b1 `shiftR` 4)
                                            , (b1 .&. 15) `shiftL` 2
                                            ]
         | otherwise = let b0 = b `BS.index` 0
                           b1 = b `BS.index` 1
                           b2 = b `BS.index` 2
                       in  map fromIntegral [ b0 `shiftR` 2
                                            , ((b0 .&. 3)  `shiftL` 4) .|. (b1 `shiftR` 4)
                                            , ((b1 .&. 15) `shiftL` 2) .|. (b2 `shiftR` 6)
                                            , b2 .&. 63
                                            ] ++ go (BS.drop 3 b)
      where l = BS.length b

encodeInt :: Integer -> [Int]
encodeInt i
  | i >= -10 && i < encodeMax - 11 = [fromIntegral i + 12]
  | i > 2^(31::Int)-1 || i < -2^(31::Int) = error "encodeInt: integer outside 32 bit range"
  | otherwise = let i' :: Int32 = fromIntegral i
                in [0, fromIntegral ((i' `shiftR` 16) .&. 0xffff), fromIntegral (i' .&. 0xffff)]

-- encode a possibly 53 bit int
encodeSignificand :: Integer -> [Int]
encodeSignificand i
  | i >= -10 && i < encodeMax - 11      = [fromIntegral i + 12]
  | i > 2^(53::Int) || i < -2^(53::Int) = error ("encodeInt: integer outside 53 bit range: " ++ show i)
  | otherwise = let i' = abs i
                in  [if i < 0 then 0 else 1] ++
                    map (\r -> fromIntegral ((i' `shiftR` r) .&. 0xffff)) [48,32,16,0]

encodeDouble :: SaneDouble -> [Int]
encodeDouble (SaneDouble d)
  | isNegativeZero d      = [0]
  | d == 0                = [1]
  | isInfinite d && d > 0 = [2]
  | isInfinite d          = [3]
  | isNaN d               = [4]
  | abs exponent <= 30    = [6 + fromIntegral exponent + 30] ++ encodeSignificand significand
  | otherwise             = [5] ++ encodeInt (fromIntegral exponent) ++ encodeSignificand significand
    where
      (significand, exponent) = decodeFloat d

encodeMax :: Integer
encodeMax = 737189

{- |
  The Base data structure contains the information we need
  to do incremental linking against a base bundle.

  base file format:
  GHCJSBASE
  [renamer state]
  [linkedPackages]
  [packages]
  [modules]
  [symbols]
 -}

renderBase :: Base                                   -- ^ base metadata
           -> BL.ByteString                          -- ^ rendered result
renderBase = DB.runPut . putBase

loadBase :: FilePath -> IO Base
loadBase file = DB.runGet (getBase file) <$> BL.readFile file

----------------------------

{-# INLINE identsS #-}
identsS :: Traversal' JStat Ident
identsS f (DeclStat i)         = DeclStat       <$> f i
identsS f (ReturnStat e)       = ReturnStat     <$> identsE f e
identsS f (IfStat e s1 s2)     = IfStat         <$> identsE f e <*> identsS f s1 <*> identsS f s2
identsS f (WhileStat b e s)    = WhileStat b    <$> identsE f e <*> identsS f s
identsS f (ForInStat b i e s)  = ForInStat b    <$> f i <*> identsE f e <*> identsS f s
identsS f (SwitchStat e xs s)  = SwitchStat     <$> identsE f e <*> (traverse . traverseCase) f xs <*> identsS f s
  where traverseCase g (e,s) = (,) <$> identsE g e <*> identsS g s
identsS f (TryStat s1 i s2 s3) = TryStat        <$> identsS f s1 <*> f i <*> identsS f s2 <*> identsS f s3
identsS f (BlockStat xs)       = BlockStat   <$> (traverse . identsS) f xs
identsS f (ApplStat e es)      = ApplStat    <$> identsE f e <*> (traverse . identsE) f es
identsS f (UOpStat op e)       = UOpStat op  <$> identsE f e
identsS f (AssignStat e1 e2)   = AssignStat  <$> identsE f e1 <*> identsE f e2
identsS _ (UnsatBlock{})       = error "identsS: UnsatBlock"
identsS _ (AntiStat{})         = error "identsS: AntiStat"
identsS f (LabelStat l s)      = LabelStat l <$> identsS f s
identsS _ b@(BreakStat{})      = pure b
identsS _ c@(ContinueStat{})   = pure c

{-# INLINE identsE #-}
identsE :: Traversal' JExpr Ident
identsE f (ValExpr v)         = ValExpr     <$> identsV f v
identsE f (SelExpr e i)       = SelExpr     <$> identsE f e <*> pure i -- do not rename properties
identsE f (IdxExpr e1 e2)     = IdxExpr     <$> identsE f e1 <*> identsE f e2
identsE f (InfixExpr s e1 e2) = InfixExpr s <$> identsE f e1 <*> identsE f e2
identsE f (UOpExpr o e)       = UOpExpr o   <$> identsE f e
identsE f (IfExpr e1 e2 e3)   = IfExpr      <$> identsE f e1 <*> identsE f e2 <*> identsE f e3
identsE f (ApplExpr e es)     = ApplExpr    <$> identsE f e <*> (traverse . identsE) f es
identsE _ (UnsatExpr{})       = error "identsE: UnsatExpr"
identsE _ (AntiExpr{})        = error "identsE: AntiExpr"

{-# INLINE identsV #-}
identsV :: Traversal' JVal Ident
identsV f (JVar i)       = JVar  <$> f i
identsV f (JList xs)     = JList <$> (traverse . identsE) f xs
identsV _ d@(JDouble{})  = pure d
identsV _ i@(JInt{})     = pure i
identsV _ s@(JStr{})     = pure s
identsV _ r@(JRegEx{})   = pure r
identsV f (JHash m)      = JHash <$> (traverse . identsE) f m
identsV f (JFunc args s) = JFunc <$> traverse f args <*> identsS f s
identsV _ (UnsatVal{})   = error "identsV: UnsatVal"

compact :: GhcjsSettings
        -> DynFlags
        -> CompactorState
        -> [(JStat, [ClosureInfo], [StaticInfo])]
        -> (CompactorState, [JStat], JStat) -- ^ renamer state, statements for each unit, metadata
compact settings dflags rs input =
  renameInternals settings dflags rs input


text:
April 16, 2021/StarLight Realty
A GROWN-UP RETREAT IN A HISTORIC TOWN HOUSE
WRITTEN BY JEANINE MATLOW / PHOTOGRAPHY BY KATYA DE GRUNWALD
In theory, the objective to create a magnificent master suite on a light-filled level of a Georgian town house on a classic garden square in a hip London neighborhood seemed plausible. The caveat would be that the updates had to respect and preserve the exquisite original features without diminishing the contemporary and fashion-forward feel of the renovation. Enter interior designer extraordinaire Anna Burles—cofounder of London-based Run For The Hills with her husband, Chris Trotman, a graphic designer and artist—to balance the history of the building with modern-day living.
Mixed metals, warm wood tones, and playful personal artwork work together to create a welcoming, serene space that spans an entire floor of a historic London town house.
While the circa-1800s structure boasted an amazing location in Islington, a stone's throw from all the bars, shops, and restaurants in the area, it did need some love poured into it, says Burles. When approaching extensive projects like these, sustainability remains a key part of the process. "We use responsible methods and materials where possible," she adds. "We also encourage clients not to throw things out without good cause. A reupholstered sofa lives to fight another decade and a well-designed kitchen might only need new doors and finishes, rather than ripping everything up and starting again."
One sustainable move for this design was determining a suite location with staying power. Back in the day, the ground level would have been a more formal social space, while the second floor served as a family-oriented space or a master bedroom. Though the previous owners had it configured as a living room, her clients imagined their master suite.
"Using an entire floor of the building for the master bedroom and en suite created a hugely practical and glamorous space for the owners," says Burles. The busy working couple, who had a toddler at the time and now have two children, envisioned a clutter-free adult haven in a spacious suite that could also house their extensive wardrobe. An en suite bathroom with enough space for the two of them to get ready without bumping into each other was another priority.
In response to their request for plenty of storage, Burles discreetly incorporated a bespoke paneled feature with hidden cupboards and cabinets galore into the bedroom. As a bonus, the installation also serves as a backdrop for the bed and provides nightstand space. Because existing architectural features could not be altered, the freestanding piece mimics a traditional built-in.
A calming yet rich color palette of urban grays and other neutrals adds warmth and organic touches via the wood floors, live-edge bed-side tables, and the midcentury bench at the end of the bed. "The Georgians loved bold color, so our standout teal headboard plays into their passion for drama," says Burles.
Other distinctive details include layers of tactile fabrics and patterns that lend texture and visual interest to the super king-size bed. A capiz shell light fixture makes a lovely statement overhead, while brass pendants hung low on either side enhance the ceiling height and save surface space.
Burles infused whimsy into the traditional, grown-up space with unique vintage pieces like the polar bear from an antiques store. "His pop of fresh white color also draws the eye into the niche, which is a great spot for charging phones during the night without cluttering up the small bedside table," she says.
As for the dramatic master bathroom, Burles says they tried a number of layouts, but kept coming back to a his-and-hers vanity (which is very space hungry) that led them away from the walls. "A bit more work in terms of plumbing, but worth it," she adds. A vintage rosewood sideboard was repurposed to create the freestanding piece featuring Carrara marble sinks and floating mirrors.
Bespoke tiles and attractive brass accents make the en suite shine. The focal point, a custom steel-framed shower enclosure, was intentionally positioned in a bright area. Floor-to-ceiling windows at the front and rear of the town house introduce ample natural light, framing spectacular garden views and illuminating the homeowners' personal art.
Reimagined residences like this blend an unpredictable mix of vintage and antique classics with a next-generation aesthetic. "I am also lucky to have a super talented artist-designer husband!" says Burles. "So I get to commission him to create special pieces for our design projects."
For Burles, who previously worked as an event stylist and a celebrity reporter, interior design came later in life and stayed. "I've had lots of creative jobs, but I finally found my calling!" she says. "Designing people's homes is such an intimate thing and one of your overriding missions is to make it their dream space . . . a space they won't just be happy in, but productive too, which unlocks things for their passions, their work, their hobbies, their families and the way they live their lives."
A successful merger of old and new elements turns a master suite into a restful retreat filled with thoughtful design for style, storage, and comfort.
Posted in Downright Dreamy, Home Design Tips
← Naptime
Sowing Solace →


Innovative platforms, such as airbnb, Travelmob and OneFineStay and the need for more traditional groups to develop a response to these new competitors.
These deal trends and the inherent disruption and consolidation impacting the H&L sector present opportunities for owners, operators and other market participants.
We highlight in this article some of the key issues that prospective participants should bear in mind when negotiating and executing cross-border M&A deals in the H&L sector.


Graphite Dry Lube spray forms a quick-drying film that provides long-wearing lubrication and protection from extreme pressures and temperatures (-100° F to 850° F). The high performance formula bonds to rubber, metal, wood and plastic. It lubricates and protects surfaces from extreme pressures and friction, and it reduces metal wear to extend equipment life.
Graphite Dry Lube is recommended as a general maintenance lubricant on gaskets, transfer belts & conveyor belts and as a general lubricant for high temperatures, low load, or high rpm slides, rollers, wheels, gears, chains and hoists.
Graphite Dry Lube can be used anywhere a dry lubricant is essential - at home in drawers, hinges, chains, sliding doors & windows, locks, outdoor power equipment, or automotive engines.
Industrial uses include plant machinery and handling equipment, winches, sprockets, die casting machines, and pre-assembly lubrication of moving parts.


Well equipped and geared up for work, the 2019 crew of Construction Chicks is hotter than ever. The twelve able-bodied knockouts in this best-selling calendar know how to use their tools and are ready to work up a sweat. Photographed by Glenn Grainger, images are featured in an oversized 12″ x 24″ poster-sized format. All in a good day's work!
Copyright © 2019 ZebraPublishing. All rights reserved.


text:
The Future of Transco Zone 5 Demand
Josh Garcia , Analyst
Eric Fell , Senior Natural Gas Analyst
Colette Breshears , Product Manager, Natural Gas
Rick Margolin , Senior Analyst, Natural Gas
Transco Zone 5 (Z5) provided a home for swelling Northeast production growth and associated natural gas infrastructure projects to move that growth in the past. With Transco's Atlantic Sunrise project adding 1.7 Bcf/d of capacity into Z5 and EQT's Mountain Valley Pipeline adding an additional 2 Bcf/d of capacity within the next year, will demand growth in Z5 be able to absorb all this extra supply?
Genscape believes Z5 has existing but limited potential to absorb Northeast production growth. New natural gas forward supply from the constrained Leidy area will remain competitive into Z5 and should result in decreased spreads between Leidy and Z5/Z4. This will not only result in lower prices in Z5, but will ripple even further south to Z4.
The Demand Picture
Comprised of Virginia and the Carolinas, Z5 is a massive demand area susceptible to price spikes due to its supply isolation and competition with an adjacent, similarly large demand area, Transco Z6. Increasing supply found a home in Z5 as structural demand rose steadily over the last ~10 years. Even with incomplete data for 2018, gas demand per degree increased year-over-year (YOY). For example, in summer 2007, Z5 consumed an average of 1.13 Bcf/d at a normal temperature range; yet, last summer, Z5 consumed 3.62 Bcf/d at the same temperature range. This structural growth is primarily a result of increased gas-fired generation within the zone because of overall increases in power generation and fuel switching.
Total power generation in the Z5 area increased, but not necessarily due to demand for power increasing. The Energy Information Administration's (EIA) state level generation data showed total generation increased for all three Zone 5 states, from 32.1 average gigawatt hours (AGWHs) in 2001 to 36.3 AGWHs of generation in 2017. However, retail sales data suggests power demand (as opposed to generation) grew from 33.1 AGWHs in 2001 to a peak of 38.0 AGWHs in 2010, before decreasing to 36.4 AGWHs in 2017. The tightening differential between generation and retail sales is a result of Z5 curtailing imports from states within the Southeast Electric Reliability Council (SERC).
Gas burns historically benefit from increased intra-zonal generation and fuel switching. Nuclear generation remains the largest part of the stack at 14.5 AGWHs (~40.0% of total generation), and remained relatively flat since 2001. Gas-fired generation increased from 0.8 AGWHs in 2007 to 11.7 AGWHs in 2017. This increase in gas fired generation comes from the displacement of coal; coal contributed 7.2 AGWHs in 2017, down from 17.9 AGWHs in 2007. Other forms of generation include hydro, solar and wind, biomass, and petroleum-based fuels. Their share of the stack rose rapidly since the early 2000's, driven by solar generation (especially in North Carolina), biomass, and wood fuels.
When EIA released their annual data, South Carolina's gas generation trailed behind coal generation on the state-level, but finally surpassed coal in March 2018 as of the most recent EIA monthly data. In North Carolina, nukes, coal, and gas are roughly equal parts of the generation stack, collectively contributing between 26 percent to 32 percent of total generation; though gas' share developed rapidly since 2009, again, at the expense of coal. Utility-scale solar grew rapidly since 2012, but still only comprises 0.6 AGWHs of the total stack.
Virginia experienced the fastest load growth for natural gas as well as its total stack, which gas is now the largest part of, comprising 49.5% of total generation. Coal's share fell drastically from 4.0 AGWHs in 2007 to 1.2 AGWHs in 2017, just above the 1.1 AGWH aggregate of all other fuels.
Increased gas burns in this region are visible down to the meter level. Just this year, Transco added meters for the 475 MW Kings Mountain Energy Center in North Carolina, and the 1588 MW Greensville County Power Station in Virginia. The Greensville Plant has a reported operational capacity of 358 MMcf/d, but it only saw preliminary nominations and isn't expected to be fully operational until December 2018—well after Atlantic Sunrise Phase 2 comes online.
Elsewhere in SERC, we see declining power imports into Z5 in the form of declining coal generation in Tennessee and Kentucky. Coal comprises much of the stack, meaning that there is massive opportunity for fuel switching in these states.
There may be additional opportunities in Zone 5 created by the introduction of lower cost gas supply from new projects such as Atlantic Sunrise. Opportunities for gas-fired generation based on the displacement of coal are still significant but finite. Based on 2017 utilization rates, replacing the remaining coal in the region with new gas plants would create an additional 1.1 Bcf/d of demand.
In the very long term, there may be opportunities for gas to displace nuclear generation. The biggest hurdles to nuclear generation are massive startup costs and amortization. In 2017, deveopers abandoned plans for adding two more reactors to the VC Summer nuclear plant in South Carolina because they excessively surpassed their budget. However, once nuclear plants are online, they are difficult to displace save for retirements. Fuel is a smaller part of a nuclear plant's operating costs compared to fossil fuel plants, and there is the need to recoup a return on investment over a longer time.
Maintenance for nuclear plants can be very expensive since much of the nuclear fleet is over 30 years old, and the lack of carbon credits in some states make them more uneconomical to run. For some plants, operational costs can be higher than the 24hr price of power. Virginia discussed joining the Regional Greenhouse Gas Initiative, the carbon market covering much of the Northeast, but neither of the Carolinas are in regional markets. If this should happen, nuclear plants in Virginia could be more economical to run and harder to displace than nuclear plants in the Carolinas, especially if RGGI makes its carbon regulations stricter.
There are currently no planned nuclear retirements in Zone 5, but going forward there are nine nuclear plants in the area with 15.9 GWs of nameplate capacity, which are all over 30 years old. Any retirements would present a monumental opportunity for gas demand in the region. Theoretically, if those nuclear plants were to be replaced by new gas fired generation, it would create 2.2 Bcf/d of additional demand.
In summary, gas demand experienced a structural increase in Z5 over the past several years due to coal switching and more in-market generation, but future opportunities to sustain that growth are increasingly limited. New Capacity into Z5 (Atlantic Sunrise and Mountain Valley) will greatly exceed Z5 demand growth which means increasing flows into Z4 from Z5.
Genscape's Forward S&D Forecast combines a best in class demand forecast with the market's top natural gas production forecast to deliver a highly accurate, detailed and unique supply and demand outlook based on forward price curves set by the market. To learn more, or request a trial of Genscape's Forward S&D Forecast Report, please click here.
Genscape's Natural Gas Analyst platform delivers the most comprehensive natural gas market data through user customized queries, allowing you full transparency not only in to Transco Zone 5, but a wide array of market data across North America. Click here to learn more about our Natural Gas Analyst platform.
Genscape's Natural Gas Infrastructure Intelligence tracks over 250 current and upcoming mainstream natural gas projects in the U.S. and Canada, including Transco's Atlantic Sunrise and EQT's Mountain Valley Pipeline, helping you understand and quantify the influence of planned projects on the forward curve. Request a trial to learn more about the report, click here.
Genscape News & Analysis
Tropical Storm Barry Rattles Hydrocarbon Production on Day Three
July 12, 2019 Laura Munder, Rob Bickhart, Allison Hurley
Free Report: Natural Gas Summer Outlook Update
Corpus Christi LNG Train 2 Begins Liquefaction Operations
June 19, 2019 Allison Hurley, Amir Rejvani, Charlie Cone


text:
THE MONEY STORE
CA Camarillo
Camarillo is a city in Ventura County in the U.S. state of California. The population was 65,201 at the 2010 census, up from 57,084 at the 2000 census. The Ventura Freeway is the city's primary thoroughfare. Camarillo is named for Adolfo and Juan Camarillo, two of the few Californios to preserve the city's heritage after the arrival of Anglo settlers. The railroad coast route came through in 1898 and built a station here. Adolfo Camarillo eventually employed 700 workers growing mainly lima beans. Walnuts and citrus were also grown on the ranch. Adolfo bred Camarillo White Horses in the 1920s through the 1960s and was well known for riding them, dressed in colorful Spanish attire, in parades such as the Fiesta of Santa Barbara.The city grew slowly prior to World War II but the war effort saw the construction of the Oxnard Army Air Field to the west of town.
Paul Ward
25 Photos hot
7333 Worth Way, Camarillo, CA 93012
Listing Provided By Paul Ward (License ID: 01354001) of RE/MAX Gold Coast REALTORS
2291 Farnworth Street, Camarillo, CA 93010
Please let me know how can I help you.
The information being provided by CARETS is for the visitor's personal, noncommercial use and may not be used for any purpose other than to identify prospective properties visitor may be interested in purchasing. The data contained herein is copyrighted by CARETS, CLAW, CRISNet MLS, i-Tech MLS, PSRMLS and/or VCRDS and is protected by all applicable copyright laws. Any dissemination of this information is in violation of copyright laws and is strictly prohibited. Any property information referenced on this web site comes from the Internet Data Exchange (IDX) program of CARETS. This web site may reference real estate listing(s) held by a brokerage firm other than the broker and/ or agent who owns this web site. The accuracy of all information, regardless of source, is deemed reliable but not guaranteed and should be personally verified through personal inspection by and/or with the appropriate professionals.
REMAX Gold Coast
601 Daily Drive, Camarillo CA 93010
Paul Ward 8054795004 [email protected]
//static.chimeroi.com/site/built/js/libo/pages/neighborhood-560adac560623618.js


Named after and inspired by the Mama Kin melody, Air Between Us - 'There is a future in the air between us, I look at you and I believe it, daytime moon, shooting star'.This design translates well across all methods and paper stocks.
Air Between Us Note on Gifts is printed with Standard Ink. Choose from our eight signature colours. We will confirm your colour choice during your consultation email.


text:
Inquiry & Investigation
Bringing Next-Generation Sequencing into the Classroom through a Comparison of Molecular Biology Techniques
Bethany Bowling, Erin Zimmer, Robert E. Pyatt
The American Biology Teacher, Vol. 76 No. 6, August 2014; (pp. 396-401) DOI: 10.1525/abt.2014.76.6.7
BETHANY BOWLING is an Associate Professor in the Department of Biological Sciences, Northern Kentucky University, Highland Heights, KY 41099.
ERIN ZIMMER is an Associate Professor in the Department of Biology, Lewis University, Romeoville, IL 60446.
ROBERT E. PYATT is Assistant Director, Cytogenetics/Molecular Genetics, at Nationwide Children's Hospital, 700 Children's Drive, Columbus, OH 43205; e-mail: robert.pyatt@nationwidechildrens.org.
For correspondence: robert.pyatt@nationwidechildrens.org
Although the development of next-generation (NextGen) sequencing technologies has revolutionized genomic research and medicine, the incorporation of these topics into the classroom is challenging, given an implied high degree of technical complexity. We developed an easy-to-implement, interactive classroom activity investigating the similarities and differences between current sequencing methodology and three NextGen technologies. The activity uses existing materials created by each of the biotechnology companies that outline their instrumentation and chemistries. Following this activity, students will understand the molecular biology behind these NextGen applications and the similarities to existing Sanger sequencing methods.
molecular biology, Sanger sequencing
© 2014 by National Association of Biology Teachers. All rights reserved. Request permission to photocopy or reproduce article content at the University of California Press's Rights and Permissions Web site at http://www.ucpressjournals.com/reprintinfo.asp.
Vol. 76 No. 6, August 2014
You are going to email the following Bringing Next-Generation Sequencing into the Classroom through a Comparison of Molecular Biology Techniques
Results & Discussion
My Fish Is Smarter Than Your Fish: Inquiry-Approach Methods to Examine Learning in Zebrafish Exposed to Environmental Chemicals
Does Fast Food Last Forever? Exploring the Mold Myth
Predation on Plasticine Model Caterpillars: Engaging High School Students Using Field-Based Experiential Learning & the Scientific Process
Show more Inquiry & Investigation


text:
MSI Gaming
Mobile Iron
Dropsuite
Letsignit
Our Portals
as an information technology distributor
To be the preferred Value Added Distributor in Africa
Enabling our resellers to provide world-class IT solutions to their customers
Elytis is a top-class distributor for more than 15 leading global brands in IT equipment and software.
Based in Mauritius with worldwide connectivity, proven skills, industry-approved certification, market acumen and bilingual (French and English) abilities, we serve territories in Central and Sub-Saharan Africa, the Indian Ocean and the French Pacific region.
Our 40+ members of staff bring to our resellers and to their clients a unique blend of technical knowhow, business knowledge and training abilities.
Elytis has a clear edge spanning over all the territories we serve, creating greater value and catalysing rewards for our partners and for their customers.
Over 20 years of experience in the IT distribution and we are proud of our achievements.
WECA : Distributor of the Year
Award 2005, 2010, 2011, 2016, 2017
IWECA : Distributor of the Year
Award 2010 & 2011
Volume Distributor of the Year
Award 2017/2018 Africa & Levant
A wide array of expertise.
One dedicated team.
SYMANTEC & VERITAS
Elytis is a prime Microsoft distributor with a unique capability in the African region for licensing and for market knowhow – and bringing to its partners such expertise in French-speaking and English-speaking territories.
The experience of our team in dealing with a diversity of cultures across regions and the African continent provides a clear advantage in understanding and responding to the needs of our reseller's markets and of their clients.
This dedicated team and its seven experts provide unequalled advice and assistance, as well as quick "on time" quotes, to serve a large network of Microsoft product and service providers in Mauritius, other Indian Ocean islands, French Pacific territories, and over 40 countries in mainland Africa.
We are here to help resellers across all those countries to develop their market's knowhow of Microsoft products and solutions and to boost their sales. Specialised sales executives manage our partners' needs in defined groups of countries and assist in bringing more value to their offerings of the Microsoft range of products and services.
In this regard, our thorough knowledge of Licensing for Microsoft solutions is a key asset of Elytis, which brings a clear edge to our resellers. We also consider resellers as true partners we help them to devise the best, tailor-made quotes, in responding to complex requests for proposals for any territory.
Our senior manager's tops the experience of our sales and support team. With 14 years of sales and product management practice at Elytis, he is a Microsoft expert by profession and by dedication.
IT security as well as data protection and management are essential for all organisations to thrive in a data-laden environment that comprises multiple risks for all key activities – operational, commercial and financial. The Symantec and Veritas products bring the right solutions to curtail risks and to efficiently manage data.
Elytis has the right expertise to foster and support resellers' efforts in building the most relevant and cost efficient solutions using the Symantec and Veritas cybersecurity and data management products.
We have a definite edge in having a bilingual (French-speaking and English-speaking) team that is fully dedicated to the range of Symantec and Veritas solutions, with the right mix of technological expertise.
Our specialists work only with and for those two leading brands, bringing all their attention and knowhow to advising and supporting our resellers and their clients. We provide quick and clear information in building the most adequate quotes and all five members of the team are certified in the Symantec and Veritas range of products.
In addition to serving the Mauritian market, we constantly assist our partners in other islands of the Indian Ocean region and in 11 countries of the SADC region (excluding South Africa).
The capabilities of Elytis regarding the Symantec and the Veritas offering greatly benefit from our BD Manager's competencies and track record. With over 20 years of experience in the IT field, he has worked as a programmer, systems administrator, network engineer, product manager and technical manager, for a conglomerate, a leading IT reseller and now for Elytis.
Hence, he has extensive insights into the needs and expectations of resellers and of customers, enabling relationships based on a thorough understanding of our partners' challenges.
The pre-sales team of Elytis brings valuable input to our partners and clients in the Indian Ocean/Africa region. The team's objective is to gauge the markets, identify business opportunities, analyse technical and operational requirements and, thereafter, propose the best technology solution.
The pre-sales specialists are hence the first contact persons from Elytis to structure the partners' and clients' requirements, to align their needs with the accurate technology.
Our sales experts are specialised in Microsoft, Mobile Iron, Symantec, Veritas and the leading hardware brands we represent. They support in generating the finest commercial proposals. Transfer of information and follow-up is seamless from the pre-sales service to the specialised software and hardware teams.
This department is fully operational since January 2018. The pre-sales team has a rich experience from different industry verticals and the personnel's combined expertise brings significant technology and market insights to the channel. The team has three members for now and this number will grow to four within the next months.
Partners are key to us. The team endeavours to empower our partners and clients through training to keep them up to date with the latest technology solutions for the brands we represent in order to deliver value.
The Elytis range of hardware brands spans across computer, printing, storage and visual display equipment, for private and public organisations as well as for individuals.
Thanks to the technical expertise and commercial knowhow of our three dedicated product managers, we create unique relationships and business opportunities with our resellers.
Our team of five sales specialists manages and advises about distribution and sale of Acer and MSI laptops and PCs, Epson imaging solutions, Jabra headsets, Transcend data storage and mobile cameras, Viewsonic monitors, projectors and digital signage, as well as Lexmark solutions – with exclusivity in the Indian Ocean region for the latter.
We bring high expertise in our advice to resellers and to their final customers about the best hardware and solution – and the adequate pricing – to suit the needs of the market and of the end user.
Moreover, Elytis is an Authorised Service Centre for most of the brands we distribute – with in-country service expertise and spares stocks for quick and efficient service.
Our after-sales team comprises of four competent and fully trained personnel, who get regular updates from the technical crews of our leading brands.
Elytis brings the value added of leading hardware products and systems to Mauritius and the Indian Ocean region. We have the technical and market knowhow to develop further in the African region, with the right partners.
Our International Footprint
2023 - © Elytis | Developed by Underdogs Studio
This site uses cookies: By browsing you accept to the use of the cookies.Find out more.