text:
Angola (English) (Português)
Mozambique (English) (Português)
Senegal (English) (Français)
This selection will switch the site from presenting information primarily about Tanzania to information primarily about . If you would like to switch back, you may use location selection options at the top of the page.
Please make my default location (this will set a cookie)
Location: Tanzania
Infrastructure, Construction and Transport
Litigation, Arbitration and Regulatory
Browse our latest publications, alerts, insights and press releases.
Investing in Africa: The Big Five of tax structuring
Africa Connected: Issue 1
In Africa, the Big Five are the lion, leopard, rhinoceros, elephant and Cape buffalo. For investors in Africa, fast-paced and fundamental international tax changes, both in African countries and at the Organisation for Economic Co-operation and Development (OECD) and UN level, require careful assessment of the Big Five of tax structuring: capital gains tax, withholding tax, permanent establishment, corporate income tax, and investment protection planning through the use of bilateral investment treaties.
In practice, foreign investors will want to explore legal structures and set-ups that provide them with a favorable post-tax return on investment. Therefore, in addition to a favorable bilateral investment treaty network, potential holding jurisdictions should have an extensive double tax treaty network that could aid in the prevention of any unnecessary tax leakage. For investing into Africa, certain holding jurisdictions including Mauritius, the Netherlands, the UAE and the UK will continue to be favored by those foreign investors.
For such holding jurisdictions to be effective, in light of the OECD's new principal purpose test (PPT) rule and in order to successfully claim tax treaty benefits (if any), companies should avail themselves of adequate local substance (e.g. office space, qualified personnel, and key decision-making). In our view, this development is likely to encourage centralization of activities, people and functions in one place or a few places globally by international businesses, resulting in the formation of global or regional investment platforms. From an Africa inbound investment perspective, the four holding jurisdictions mentioned above are well equipped to do just that, even though the tax structuring of each individual investment should be carefully analyzed.
Characteristics of the Big Five
Compared to other regions, African countries generally have relatively high levels of domestic taxation, which can erode profitability.
In most countries, CGT is levied on the capital gains (profits) realized on the sale of an asset that increased in value under certain circumstances, such as the shareholding in a local subsidiary. Tax treaties can allocate taxing rights to the investor country, as opposed to the source country.
Several African countries have issued legislation that allows for CGT in case of an indirect transfer of assets (such as indirect share transfers). These include Cameroon, Kenya, Mozambique, Tanzania and Uganda.
WHT can be levied on a wide array of payments, including dividends, interest and royalties. Some African countries also levy WHT on payments for services, such as management services. In Liberia, WHT is imposed on proceeds (as opposed to capital gains arising). In certain situations, tax treaties can reduce such WHT (e.g. to 0 or 5 percent) or eliminate it altogether.
Permanent establishment (PE)
Activities carried out by a business in another country resulting in revenue being generated or value created can be deemed taxable by local tax authorities. This concept, generally referred to as a PE (or a fixed establishment), may require the revenue-generating foreign company to formally register under some corporate identity, such as a branch, representative office or subsidiary.
Many tax treaties define permanent establishment. Generally speaking, tax treaties are based on either the OECD Model Tax Convention on Income and on Capital (OECD Model Tax Convention), or the United Nations Model Double Taxation Convention between Developed and Developing Countries (UN Model Tax Convention). In the OECD Model Tax Convention, essentially three types of PE can be construed:
A fixed place of business PE
A construction or project PE, which is a special subset of the fixed place of business permanent establishment, with different requirements such as a set period of a project's duration in-country
An agency PE, through the actions of a dependent agent
The UN Model Tax Convention, which gives greater consideration to developing countries, adds what is known as a service PE, where merely the provision of services to customers in a source country (i.e. without any further tangible presence) can create a PE taxable therein. In addition to the definition of the PE concept itself, tax treaties provide guidance on the allocation of profits between the PE and the foreign company.
In addition to tax treaties, some African countries may have local guidance on what does and does not constitute a PE. For example, South Africa released a binding private ruling in May 2010, stating that the presence of a database replica and a web server will constitute a PE of a foreign company (which in some other countries has been subject to debates for years).
Corporate income tax (CIT)
Each African country will have its own CIT regime, the details of which require careful consideration prior to making an investment. Investors should pay attention among others to transfer pricing (TP) requirements and interest deductibility restrictions, such as thin capitalization rules. For example, Nigeria has very recently revised and strengthened its TP regulations.
Bilateral investment treaties (BITs)
Although the fifth category of the Big Five of tax structuring – BITs – is not a tax matter, it is nevertheless an extremely important consideration for international investors, as it can significantly reduce local country risk exposure. Historically, BITs are developed by capital-exporting countries to promote investment and protect their nationals' interests in capital-importing countries.
BITs impose a number of obligations for the host country with respect to the foreign investments. In broad terms, the nationalization or expropriation of investments is typically prohibited under the BITs, unless such measures are taken in the public interest and the host state pays prompt, adequate and effective compensation to the investor. Other obligations typically found in BITs require the host state to be fair and equitable in how they treat foreign investments, and to treat foreign investments at least as favorably as investments made by nationals of the host state.
BITs generally offer international arbitration as the means of resolving investor-state disputes. This provides the investor with the possibility of bringing a claim directly against the host state in a neutral forum, if the investor believes that the state has violated any of the substantive protections available under the BIT. In many instances, such disputes are brought under the auspices of the International Centre for Settlement of Investment Disputes (ICSID), although other options are sometimes available, including ad hoc arbitration under the UNCITRAL Arbitration Rules. The investor should seek advice on the relative merits of the potential avenues available before asserting a claim.
The right base camp
There are several factors to consider when setting up a base camp for (intermediate) holding and finance companies. The primary function is to position investors optimally regarding the Big Five of tax structuring, while securing legal rights with respect to the investments. We will focus on four jurisdictions currently popular among Africa-focused investors: Mauritius, the Netherlands, the UK and the UAE.
First of all, the right country provides tax benefits to foreign investors at the following levels:
Reduced WHT and CGT protection at source country level (with the use of tax treaties)
Efficient tax treatment at intermediate level (such as participation exemption for dividends and capital gains)
Reduced or no WHT on repatriation of income by the intermediate holding to investors
A BIT network for protection against nationalization/expatriation
Over the last years, this island in the Indian Ocean has become a gateway for the African mainland. This success is in large part due to a relatively large double tax treaty network, and 0 percent WHT on dividends, interest and royalties. The standard corporate income tax regime is also competitive.
In addition, Mauritius has many non-tax advantages, including its position as one of Africa's most interconnected countries and over 25 BITs with African countries that mitigate the risk of nationalization.
In late 2016, Mauritius joined the OECD Inclusive Framework on Base Erosion and Profit Shifting (BEPS) by adding a rider stipulating that it would review all its tax treaties to bring them up to G20 minimum standards by the end of 2018. Regardless, assuming investors can demonstrate adequate substance at the intermediate holding level, Mauritius is still a viable option in light of its extensive double tax treaty network.
The Dutch have always been known for their affection with international commerce and trade. At present, the Netherlands has one of the largest double tax treaty and BIT networks worldwide. Further, pursuant to the so-called participation exemptions, benefits derived from foreign participations (e.g. dividends and capital gains) are generally exempt from Dutch CIT.
At present, the Netherlands does not impose WHT on interest and royalties. On September 18, 2018, the Dutch government published tax proposals outlining the government's intention to further enhance the investment climate for groups with operations in the Netherlands, by lowering the corporate tax rate to 22.25 percent in 2021 and abolishing the current dividend withholding tax (of 15 percent) by 2020. The government also seeks to introduce new measures, including a conditional WHT on royalties, interest, and dividends, and an increase in the substance requirements for Dutch holding/license/financing companies to stay aligned with the latest international (OECD/EU) tax developments.
Similar to the Netherlands, the UK has an extensive double tax treaty and BIT network, and levies no CGT on the sale by an investor of its interest in a UK company. It also provides a tax exemption on the sale by a UK holding company of its interest in (trading) subsidiaries. Further, no UK WHT is levied on outbound dividends. Apart from tax advantages, the UK historically has close ties with many countries on the African continent.
In light of the impending withdrawal of the UK from the EU, the UK may lower its CIT rate and provide additional incentives to keep and attract businesses. At the time of writing, the precise impact of Brexit is not yet clear.
Strategically situated between Europe, Asia and Africa, the UAE is actively promoting its African trade and investment links, and has been very successful in doing so. Further, the UAE does not levy CIT, CGT or WHT. Over the last decade, the UAE has been massively expanding its double tax treaty and BIT network, including with many African countries. In order to promote foreign investments, the UAE has set up numerous free-trade zones that are governed pursuant to a special framework of rules and regulations and generally provide additional tax concessions and customs duty benefits. These zones are extensively used by foreign investors and multinationals as regional hubs for their investments and operations in the Middle East, North Africa and Sub-Saharan Africa.
The UAE is favored among international companies and expats alike for its ease of doing business, well developed infrastructure and interconnectivity. In addition to its large harbors, the UAE provides one of the best "air lifts" in the world, where the local airlines (Emirates and Etihad) service almost every top destination on the African continent.
The matrix below provides an overview of the number of tax treaties and BITs concluded between the aforementioned countries and African countries.
Country Tax treaties* BITs*
Mauritius 15+ 25+
Netherlands 10+ 25+
UAE 10+ 15+
UK 20+ 20+
* Entered into with African countries.
Anti-"poaching" initiatives
There has been growing concern in various African countries that multinationals have not been paying their fair share of source tax on the continent. As a result, many countries have been trying to strengthen their tax regimes, as well as enhance their domestic tax authorities.
In June 2018, the OECD and the African Tax Administration Forum (ATAF) signed a renewal of their Memorandum of Understanding (MoU) until June 2023, agreeing to continue to work together to further improve tax systems in Africa. The MoU sets their cooperation towards the achievement of the common objective of promoting fair and efficient tax systems and administrations in Africa. Simultaneously, the UN Committee of Experts on International Cooperation in Tax Matters is reviewing and updating the UN Model Tax Convention.
OECD BEPS
Effectively starting with the development by the OECD of its BEPS project in 2012, the international tax landscape has changed drastically in recent years. With its BEPS Action Plan published in 2015, the OECD aims to provide governments with clear international solutions for fighting corporate tax planning strategies that exploit gaps and loopholes of the current system to artificially shift profits to locations where they are subject to more favorable tax treatment.
The most recent instrument devised by the OECD to counter tax avoidance, including treaty shopping, is its Multilateral Instrument (MLI). The MLI came into force in July 2018, and provides unilaterally alters existing tax treaties by including, among others, the PPT test and a mutual agreement procedure (MAP) for countries that choose to apply the MLI for specific bilateral tax treaties concluded by them
The PPT rule denies double tax treaty benefits to a taxpayer where one of the principal purposes for entering into a transaction or arrangement was to obtain that benefit. For the rule to apply, the obtaining of a tax benefit need not be the sole or main or dominant purpose of the arrangement or transaction in question. As a result, centralization and the related concentration of actual substance, for example at the holding company level, will be instrumental for demonstrating commercial reasons and economic substance to counter another country's tax authorities' challenge under the PPT rule. Some examples of substance include having: a physical office, qualified personnel on the payroll (and on the board) for proper decision making, execution and registration of the transactions entered into by the company/group, and locally kept primary bank accounts and administration (bookkeeping).
The MAP provision will facilitate resolution of cases of double taxation as well as a proper and correct interpretation and application of the provisions of a bilateral double tax treaty by allowing taxpayers to approach the competent authorities of both states for that purpose.
Currently, the MLI has been signed by over 83 countries, covering more than 1,400 bilateral tax treaties.
UN Model Tax Convention
Tax treaties provide a balance of source country (i.e. host country) and residence country (i.e. investor country) taxation and are originally aimed to avoid double taxation. More recently, a secondary objective has been introduced: the avoidance of double non-taxation. As mentioned above, tax treaties are either based on the OECD Model Tax Convention or the UN Model Tax Convention. Both conventions come with their own set of rules and commentary and assistance to countries in negotiation processes.
There are numerous differences between the OECD Model Tax Convention and the UN Model Tax Convention. As the full name implies, the UN Model Tax Convention aims to promote greater inflows of foreign investment to developing countries. Generally speaking, the UN Model Tax Convention favors retention of greater so-called source country taxing rights. One of the significant features of the UN Model Tax Convention is a limited "force of attraction" rule, allowing the source country to tax certain profits not actually attributable under normal rules to the PE, but which relate to sales of similar goods or merchandise in the source country, as well as other business activities of the same or similar kind carried on by the enterprise in the source country.
Another significant difference between the OECD Model Tax Convention and the UN Model Tax Convention is that the latter does not contain maximum WHT rates whereas the former does (from 5 to 15 percent, depending on several conditions such as a specific minimum ownership in the paying company). As a result, tax treaties based on the UN Model Tax Convention generally have higher maximum rates than those based on the OECD Model Tax Convention.
Taking notice of the OECD's BEPS Action Plan, the United Nations Conference on Trade and Development (UNCTD) released an updated UN Model Tax Convention in May 2017 (the previous UN Model Tax Convention originated from 2011). The new UN Model Tax Convention adds a PPT as well as a limitation on benefits test (LOB) to counter double tax treaty shopping (both the PPT and LOB are also included in the OECD Model Tax Convention).
Through LOB rules, the UN Model Tax Convention seeks to target structures that are seen as typically resulting in the indirect granting of treaty benefits to persons that are not directly entitled to them. In other words, the LOB is a mechanism that addresses particular conduit arrangements.
In order to protect their tax base as efficiently as possible, it seems logical that most African countries prefer the UN Model Tax Convention over the OECD Model Tax Convention, although many of the treaties concluded with Mauritius, the UK, the Netherlands and the UAE still follow the OECD approach.
BIT renegotiations on the horizon
As is currently happening with tax treaties, there are talks in the international community about renegotiation of BITs in order to create more balance between the rights and duties of the host countries and the investors. For example, in May 2018, the Dutch Ministry of Foreign Affairs launched an internet consultation in relation to a new draft model BIT that may be the basis for the renegotiation of Dutch BITs. One of the most notable implications of this model is the introduction of substance requirements in order to benefit from BIT benefits (i.e. excluding "mailbox companies"). It can be expected that other EU Member States may follow and introduce similar criteria/restrictions. Where substance has become an increasingly important topic for tax over recent years, the same might be happening for BITs in the near future.
By Ton van Doremalen and Wouter Kolkman
This article forms part of Africa Connected: Doing Business in Africa:
Africa Connected Issue 1 (PDF)
DLA Piper Africa is a Swiss Verein whose members are comprised of independent law firms in Africa working with DLA Piper, and which are not themselves part of DLA Piper. Further information on DLA Piper Africa can be found here.
© 2021 IMMMA Advocates. IMMMA Advocates is a member of DLA Piper Africa, a Swiss Verein whose members are comprised of independent law firms in Africa working with DLA Piper, and which are not themselves part of DLA Piper. Further information about IMMMA Advocates, DLA Piper and DLA Piper Africa can be found in the Legal Notices page of this website. All rights reserved.


Contoured by vineyard-clad hills and castles from yesteryear, the legendary Rhine captivates. Experience the allure of France's Alsace region in its welcoming capital, Strasbourg, and its priceless gem, Riquewihr. Then there is Breisach, rising above the vineyards of the Rhine, and Freiburg, one of Germany's sunniest cities and gateway to Black Forest.
The AmaSerena offers staterooms to maximize scenic views with amenities that include unlimited Wi-Fi, movies, music and more. When it's time to step out, guests can choose a quiet respite in the inviting library or head to the Main Lounge for cocktails and conversation. For a bit of whimsy, the Sun Deck boasts a giant chess set, or you can take a dip in the refreshing pool. As a member of La Chaîne des Rôtisseurs, the exclusive international culinary society, AmaSerena also offers exquisite, regionally inspired cuisine in the Main Restaurant or at The Chef's Table.
Included in the fares of our river cruises are shore excursions in every port of call; all dining on board, fine wine, beer and soft drinks with lunch and dinner; and bicycles that you can use on your own if that is your shore desire.
Sat., Jun 01– Arrive Hamburg: Our members arrive in Hamburg. No Howard Tours' events or services are scheduled.
Thurs., - Jun 06-09 - Enjoy free time in Hamburg before you fly or train to Amsterdam. Or, join our 3 night Pre-Cruise Optional Tour detailed below.
Sun., Jun 09 - Amsterdam/Board the Ama Serena: Free morning before an afternoon arrival to your ship.
Mon., Jun 10– AmsterdamThere are 165 canals in Amsterdam, and you'll get enjoy some of them on a canal cruise. Later in the day, set sail out of Amsterdam..
Tue., Jun 11–Cologne: Morning city tour of Amsterdam before your enjoy cruising to Cologne, home to one of Germany's most revered Gothic masterpieces, the Cologne Cathedral. Join a guided tour through the Old City to Germany's oldest Town hall. or join a guided bike ride along the Rhine and through the Stadtgarten.
Wed., Jun 12– Rhine Gorge/Rudesheim: Cruise through the captivating UNESCO designated Rhine Gorge, the most stunningly beautiful stretch of the river before reaching the wine making town of Rudesheim. Soar above the vineyards with a gondola ride ending with a wine tasting, hike through the vineyards or bike to Schloss Johannisberg.
Thu., Jun 13-Ludwigshafen: Ludwishafen is your gateway to a choice of excursions. Visit Heidelberg the perfectly preserved medieval city or visit Speyer, one of Germany oldest cities, known for the largest Romanesque cathedral in Europe and the medieval Altportel or take a bike tour of the Rheingau.
Fri., Jun 14– Strasbourg: Strasbourg, the capital city of Alsace, offers flavors of both France and Germany. Enjoy a panoramic tour past the European Parliament and a walking tour of the "La Petite France district. Alternatively, take a bike ride through the city and Parc de l'Orangerie..
Sat., June 15 -Breisach:  Breisach is your gateway to several excursions. Enchanting walking tour of Riquewihr, a trip to Freiburg, home to the Gothic cathedral or for those wishing more activity bike or hike the countryside or the Black Forest area.
Thu., Jun 06–Hamburg/Amsterdam: Transfer from Hamburg to Amsterdam. Lunch included as a tour service enroute. Radisson Blu Hotel accommodations, including daily breakfasts.
Fri., Jun 07– Amsterdam: Drive through the rich history and culture of Amsterdam. Pass the many canals for which Amsterdam is known and see the dancing houses, and the Central Station. Visit the historic brewery where Heineken's beer was brewed for a hundred years. Enjoy a tour to the Royal Coastal Diamonds and explore the mystical world of diamonds. Watch the craftsmen cut and polish rough stones into the beautiful diamonds that are created in all shapes and sizes.
Sat., Jun 08– Amsterdam: A visit to the Netherlands would not be complete without seeing the Dutch countryside. Today see Zaanse Schans, a picturesque windmill village as well as the famous and lively fishing village of Volendam. See how cheese is made and visit a traditional clog maker.
Sun., June 16- Basel/Lucerne: Disembark the ship and, before transferring to Lucerne, go on a highlights tour of Basel. Once in Lucerne, discover its unrivaled beauty and charm on a walking tour. Afterwards, check into your hotel and enjoy a leisurely evening.
Mon., June 17 - Lucerne: The iconic Lion Monument, which you'll visit, was sculpted in memory of the Swiss Guards massacred during the French Revolution in 1792. You'll also visit the spectacular medieval walls and towers, dating back to the 13th century. There are a total of nine towers, including one featuring the oldest clock in the city.
Tue., June 18 - Lucerne/Zurich: Check out of your hotel and board a boat for a scenic cruise across Lake Lucerne to Vitznau. Once in Vitznau, you'll transfer via motorcoach to Zurich, traveling past scenic landscapes and Alpine lakes. Once in Zurich, you'll check into your hotel.


Have some free time to find how to create a garden design? Need many references for that design? Garden bar ideas from wisma to inspire you on how to decorate your garden 5 can help you find the solution as soon as possible. We provide many inspiring ideas with the high quality images you need. This post#22870 will inspire you with 8 awesome ideas for your garden with a various color and styles.
This post#22870 is being packed with 8 cool design ideas. So, we hope this garden bar ideas will give you an extra ideas to make your own garden design! Here are some collections that you can apply to your room design.


text:
Parents, Talk To Your Kids About Sex Before Schools Do
You may think you have time because your children haven't asked about sex yet. But you're wrong. Your kids are asking questions—they're just not asking you.
By Jessica Burke
A new bill backed by Planned Parenthood of New York would create a taskforce to study and consider improvements to sex education programs, according to a New York Times article this week. The article details how sex education is often pushed aside from children's education in NYC public schools, despite a 2011 mandate to provide sex education for a semester in both middle and high school.
But there's an argument to be made for less sex ed in schools. Because as the article explains, schools' sex education isn't just about the biology of sex:
Students at the Urban Assembly Institute get sex education every year, starting in the sixth grade with lessons on puberty and anatomy, as well as things like crushes and the emotional changes of adolescence, and continuing in later years with information on sexually transmitted infections and contraception. At all levels, the students learn about having healthy relationships, not just with romantic partners, but with parents and friends, and about different gender identities and sexual orientations. 'L.G.B.T. identity is woven in and normalized throughout the entire school year,' Ms. Zondon" [a sex educator in NYC] said.
Let's be clear: sex education is not neutral. Programs foster certain values surrounding sexuality, families, and gender. If that's the kind of "education" children are getting, then let's hope that NYC continues to push their sex ed programs aside for other, less propagandized subjects.
But unfortunately, even if sex ed is getting squeezed out in NYC schools, sex education programs are a ubiquitous part of public education. All 50 states have some form of sex education in public schools, but only four states require parental consent to participate in the sex ed program. And parents are not always told what is taught.
Schools aren't the only places our kids learn about sex. In "The Briefing" podcast episode on May 2, Al Mohler said "someone is always trying to tell our children stories, and that includes the story of sex. Hollywood and the cultural elites are trying to tell our children their version of the story of sex; so are so-called progressive sex educators pushing their agenda of what they call comprehensive sex education in the schools and in the larger culture."
The internet also has a vast influence on our children's understanding of sex. Mobile devices allow a vast majority of teens to be exposed to pornography before they turn 18, with an average age of 11 for a child's first exposure to pornography. And tweens and teenagers aren't the only ones porn—children under the age of 10 account for almost a quarter of online porn use by people 18 and younger. And this doesn't even consider the teens and young adults sending and receiving sexually explicit images.
Why Aren't Parents Talking to Their Kids About Sex?
The world our children are growing up in is drastically different place from the one I lived in as a child. When I was 10, my biggest concern was whether I'd be allowed to stay up to watch the entire lineup of TGIF.
That's why I'm flabbergasted when I hear parents say they aren't talking to their kids about sex. Last week at the soccer field, parents were discussing the texts their 11-year-old boys were getting from girls. One dad sighed and said he figured it was about time to have the talk.
"I'm not ready for that!" another dad replied. "I'll wait another few years."
I'm not sure what world these parents live in. But if they are just now thinking about introducing their children to sexuality, they've most likely missed their chance. But they aren't alone—in a 2013 study, 29 percent of the teens polled did not have conversations with their parents about sex.
Do we really want schools, the internet, or other children to be the ones teaching our children about sex? We have to get over our fear of talking about sex with our children. We should be exponentially more uncomfortable with strangers—whether schoolteachers or pornographers online—teaching our children about this beautiful aspect of our humanity.
'Knowledge Doesn't Mean A Loss Of Innocence'
Mary Flo Ridley has been teaching parents how to talk to their children about sex since 1986.
The first step she gives parents is to think about the cornerstone message they want to give their children about sex. She encourages them to weave that message into every conversation about sexuality. She compares children's minds to sponges: if parents saturate their children with their family's values, then when a child comes across the world's messages about sex, he or she will be less likely to internalize an opposing idea or value. Children who do not learn about sex from their parents are left vulnerable to whatever the world wants to tell them.
I asked Ridley what stops parents from talking to their children about sex.
"Many people don't talk to their children about sex because they think they will preserve their children's innocence," Ridley said. "Knowledge about sex, however, doesn't mean a loss of innocence. Additionally, sometimes parents are scared that their kids will make the same mistakes they did. Parents have to remember their past is not necessarily their kids' future. It is to a family's advantage to shape children's foundational understanding about sex."
Start When Kids Are Young
Parents cannot postpone a talk with their children about sexuality. Children are assaulted with sexual images and ideas everywhere: even at the grocery store, or while watching commercial breaks. We must begin these conversations when our children are young and continue them throughout their childhood. When parents serve as the first source for their children, their kids will learn to regard them as experts. Any information they receive elsewhere will be compared to what their parents taught them.
But if a child isn't taught by mom and dad, he or she will likely think his parents are ignorant about the subject. By having these conversations when our children are little, we reduce our awkwardness when they are older. They'll also be more likely to seek us out when they have questions.
Parents, let's do our job of teaching our children about sex so that the schools won't get to. You may think you have time to prepare because your child hasn't asked questions about sex yet. But your thinking is likely erred. Your kid is asking questions; he's just not asking you.
Jessica Burke lives in North Carolina with her husband and their four children. A former public school teacher, Jessica has spent the last decade with a vocation of homemaker and classical home educator. The Burkes lived overseas for three years and have been to almost 20 countries together, surviving some adventures they will never speak of to the grandparents.
Photo Pixabay
high school parenting Planned Parenthood pornography public schools schoolteachers sex sex ed sex education sexuality The Talk young adults

redpajama_set_name: RedPajamaCommonCrawl


Duncan wasn't at all what I would have thought as a match for Ghost but he ended up being perfect. He was so calm. He took Ghost's issues seriously and he respected his boundaries which really needed to happen in a story which such a serious plotline.
Cover Art has the typical two male torsos with a nice depiction of the beach below. Not exactly startling.
This entry was posted in 5 star Rating, Book Reviews, Contemporary fiction, eBooks, LGBTQ Book Reviews, M/M Book Reviews, M/M Contemporary Fiction, M/M Fiction, M/M Romance, Uncategorized and tagged An Ali Highly Recommended story and series, An Ali Review: Rough Trade (The Woodbury Boys #3) by Sidney Bell, author Sydney Bell, Carina Press, end of the trilogy, Rough Trade (Woodbury Boys #3) by Sidney Bell, series finale.
This entry was posted in Book Giveaways, Book Reviews, Book Tours and Contests, Books, Contemporary fiction, eBooks, LGBTQ Book Reviews, M/M Book Reviews, M/M Contemporary Fiction, M/M Fiction, M/M Romance, Uncategorized and tagged #newreleasebook #RoughTrade #giveaway, @sidneybellbooks, angst, author Sidney Bell, childhood sexual abuse, contemporary romance, Romantic Suspense, Rough Trade (Woodbury Boys #3) by Sidney Bell.


Welcome to the school profile for Carmen Benitez! Looking for local school information?
Carmen Benitez is located at Calle Jose C Barbosa 97, Las Piedras, PR 00771. The contact phone number is (787) 733-2660. It has a student/teacher ratio of 10.71.


text:
TINYS
THE tiny BERLINER
Painter. Toronto.
When Kris Knight was in high school, his evenings and weekends were spent working in his family's bakery. He recalls spending hours tirelessly whipping icing sugar into hues of pinks, blues and greens to make bowls of pale, white-washed frosting. Now as an artist well into his adulthood and his career as a painter, it's easy to see how this early experience informed Kris' method of working. His paintings almost always look as though they were captured directly from a pastel-tinted lucid dream. His images are arresting and peaceful. A quiet vignette that you don't want to disturb. For the past 9 years Kris has been working out of his light-filled downtown studio without an easel...or even a desk, for that matter. I feel that this is important to note only in that it speaks to the level of intimacy Kris has with his work. In most cases he paints directly from his lap, as though in a relaxed conversation with his subject. Perhaps it's this intimacy and closeness which has lead to collaborations such as the one most recently with Gucci, wherein Kris designed florals for their 2015 cruise collection. I took a peek inside Kris's studio as he was preparing for his show at Alain Gutharc in Paris which just opened last week...
Find Kris on his website here.
Follow Kris on Instagram @krisknight
Find Kris on Twitter and Facebook too.


L.T. Vargus is from Michigan and is a rare constant co-author – an author who writes novels with a writing partner in Tim McBain.
The L stands for Lex and L.T. along with Tim have written multiple book series including The Violet Darger series, The Scattered and the Dead series and the Awake in the Dark series.
L.T. Vargus Synopsis: The second book in the Violet Darger FBI Thriller book series is Killing Season and my personal favourite. In the space of 2 days, 14 people are murdered thanks to a sniper who kills 8 on the I-20 one day, then takes out 6 random grocery shoppers the next day. Special Agent Violet Darger comes on the season to find an eerie empty city as everyone is hiding indoors from the sniper. Darger must find the murderer because the longer she takes to find him, the higher the death toll is going to be.


text:
Jieyou zahuodian
Based on Keigo Higashino's international bestseller The Miracles of the Namiya General Store comes director Han Jie's take on the fantastical novel. TFBoys' Karry Wang stars as Xiao Bo, one of three orphans on the run who take refuge in a derelict corner store. Once there, they find a mysterious letter seeking advice, leading to an emotional adventure through time and unexpected connections with their own past.
Genre: Drama, Fantasy
Director: Han Jie, Jie Han
Actors: Binlong Pan, Darren Grosvenor, Dilraba Dilmurat, Duling Chen, Hao Qin, Hong-Chi Lee, Jackie Chan, Karry Wang, Lei Hao, Zijian Dong
Keywords:Gaaijau zaapfodim Jieyou zahuodian Jieyou zahuodian: Huayuban Namiya Волшебный магазин
A pair of aging boxing rivals are coaxed out of retirement to fight one final bout — 30 years after their last match.
Genre: Comedy, Drama, Sport
Director Alfred Hitchcock is revered as one of the greatest creative minds in the history of cinema. Known for his psychological thrillers, Hitchcock's leading ladies were cool, beautiful and preferably…
Genre: Drama, TV Movie
Twenty year old Antoine has made enemies of a gang of young thugs, to whom he owes money. Fed up with his scams and petty crimes, his mother and older…
In a small town, a young, tight-knit group of friends fall in and out of love over the course of one intoxicating, music-filled summer night.
A set of six nested stories spanning time between the 19th century and a distant post-apocalyptic future. Cloud Atlas explores how the actions and consequences of individual lives impact one…
Genre: Action, Drama, Mystery, Sci-Fi, Science Fiction
Faith Under Fire
On August 20, 2013, shortly after arriving to work at the Ronald E. McNair Discovery Learning Academy in Decatur, Georgia, Antoinette the school's bookkeeper, was in the front office when…
Bruna Surfistinha
Rachel is a girl, adopted by an upper middle class family, who rebelled at 17 and left her family and studies at a traditional college in Sao Paulo to become…
Furthest Witness
Kyle Braddock has spent the last decade moving witnesses over the border to Mexico and has always avoided confrontation or suspicion until now. Not only has he been framed for…
The life of a blind photographer who is looked after by a housekeeper is disrupted by the arrival of an agreeable restaurant worker.
Two aging fighters in LA, friends, get a call from a Vegas promoter because his undercard fighters for a Mike Tyson bout that night are suddenly unavailable. He wants them…
The Sweet Hereafter
A small mountain community in Canada is devastated when a school bus accident leaves more than a dozen of its children dead. A big-city lawyer arrives to help the survivors'…
In 1933 New York, an overly ambitious movie producer coerces his cast and hired ship crew to travel to mysterious Skull Island, where they encounter Kong, a giant ape who…
Genre: Action, Adventure, Drama, Romance
Trailer: Jieyou zahuodian


Watch this work at UbuWeb or share it via KaraGarga.
David Claerbout works in the space between film, photography and painting, with the aid of digital image manipulation, in order to examine notions of veracity, representational 'objectivity' and time. If the media systematically bombard us with loud, hectic and often garish images, the artist instead proposes the opposite: quiet, subtle, lingering, poetic images which resonate and remain imprinted in the mind. Much of his work is indeed about the deceleration of perception and about the necessity of close observation. Using images from his own memory and experiences, the artist re-sensitises the viewer to the significance of individual gestures and their intimate poetry. To counteract the speed with which we consume media images Claerbout proposes stillness, meditation and silence. His videos seem frozen, suspended in time and space. Cat and Bird in Peace, is a single monitor video with no sound. A cat and bird, traditional adversaries, sit aside each other. Though it is evident they are not the best of friends, they mind their own business and manage to co-exist coolly. The poignant simplicity of this work is what is striking; it is a potent metaphor for learning to live with the 'other', a humorous comment on 'civilised' behaviour, and on the importance of peaceful co-existence despite difference.
Artists to come in second part are: David Claerbout, Pierre Huyghe, Joan Jonas, Paul McCarthy and Anri Sala.
Images of the deconstruction of abandoned buildings and industrial structures are closely associated with "anarchitect" Gordon Matta-Clark. Here, however, are the film works through which Matta-Clark furthered his lifelong excavation of urban dwellings. In this book, San Francisco Cinematheque presents a retrospective of the moving-image works through which Matta-Clark explored his aesthetic assumptions and philosophical inquiry. Featuring rarely published images and a quartet of imaginative essays, City Slivers and Fresh Kills establishes Matta-Clark's films as perhaps his most surprising, and certainly most viscerally arresting body of work, characterized by the same creative provocation, rough aesthetic beauty, and intellectual insight that idefined his signature architectural cuttings and slicings.
Video shot in 303 Gallery, New York City, 2000: an installation by Jane and Louise Wilson that combines two of their moving image works, Star City and Proton, Unity, Energy, Blizzard. Star City is 8 minutes long. I don't know the length of the second work, but they are both integrated pretty much seamlessly into one ongoing loop. The installation's footage was originally shot on 16mm and transferred to DVD for exhibition. This record of the installation was shot on a DV camera.
Like Leni Riefenstahl, the British twins Jane and Louise Wilson create works that estheticize power, but to obviously different ends. Unlike Hitler's favorite filmmaker, their film installations are more funereal than triumphant.
For their newest odes to eroded power and faded glory, a pair of videos called Star City and Proton, Unity, Energy, Blizzard, the Wilsons were granted access to high-security sites of the financially stricken and scaled-back Russian space program. The videos were shot, respectively, at Star City, the main training center for Russian cosmonauts just outside Moscow, and the Baikonur cosmodrome, the massive base of the space program located in modern-day Kazakhstan (though the program is still operated by Russia). These sites, once beacons of Soviet power, are now in such a state of decline that it is sometimes difficult to tell which facilities are still in use and which are abandoned. This sense of desolation is heightened by the near-total absence of people in their footage.
The looped videos were projected on two facing sets of double screens in the gallery's corners. The Wilsons used a number of subtle filming and editing techniques which are noticeable, yet not disruptive or distracting. Scenes shift from near to far, motion to still, but without a jumpy quality. Corresponding to the visual rhythm are the ambient sounds that gave the installation a musical quality-the clunking and whirring of machinery punctuated with silence. The editing juxtaposes things old and new, insignificant and iconic, and spaces vast and intimate: a launchpad's metal bay doors touched with rust swing open to reveal a vast desert horizon with a brilliant blue sky, an empty chair spins around in an enclosed testing chamber. As the camera pans across a room, the images sometimes seem to slide across one screen and onto the next.
The same scenes are often shot from different angles, with closely related but disjunctive images presented side by side or on opposing screens. For example, a large centrifugal training pod (used to simulate gforce) spins around like a carnival ride in a room with an elaborately tiled floor. For one view, a stable camera is trained on the whirling apparatus; in another, the camera is mounted on the machine itself as it follows its dizzying orbit. A particulaly eerie sequence involves an underwater lab-a replica of the Mir space station-used for antigravity training. Filmed from above and below the water's surface, the behemoth station sits immersed like a sunken ship, shrouded in water and silence.
The work was first installed in conjunction with shows at Index gallery in Stockholm and Milch in London, (2001). It has since then been presented at exhibitions at Marian Goodman Gallery in Paris (2005), Venice Biennale (2003); Pontevedra Biennale (2002) and Centre pour l'image contemporain Geneva (2003) among others.
The projection has the camera descending, elevator-style, past floor after floor, visiting a seemingly endless succession of passageways, each different yet all decorated with the same faintly patterned floral wallpaper. Light--maybe daylight, maybe artificial, it s impossible to tell--seeps from under closed doors, but there's no reason to think anyone's home--or rather, in their rooms, since these liminal spaces most closely resemble hotel corridors.
Appearances, of course, prove deceptive. Dahlberg's sets are architectural models, built to a circular plan, and filmed with a centrally positioned rotating camera--hence the seamless continuity of the installation's footage. What seem to be tracking shots are really ten-minute, 360-degree pans, describing loci that inevitably read as nodes in a labyrinth--a subtly scary one, since its vertical and horizontal extension implies the impossibility of finding an external vantage point. Taking the panopticon as its starring point, Dahlberg's investigation suggests a psychoanalytic appropriation of the panoptic model, revealing the surveying self as itself both self-surveying and vulnerable to surveillance. Might there be hiders in the house, unseen presences behind those half-closed doors and darkened entrances? The camera's full-circle pan becomes readable as a paranoid attempt to watch one's own back. This is territory Dahlberg has charted before, in Safe Zones I: to fetch a sweater, 1996, Spying out the apartm ents overlooking his, the artist found that a gun collector occupied one. Dahlberg calculated the "safe zones" in his own home, paths from room to room that were outside his neighbor's potential line of fire. Following these, he shot photographic evidence of his neighbor's hobby, but also videoed his own convoluted progress through the zones, a fugitive in his own house.
With the reflexive moment of philosophical thought, Cornelius Castoriadis writes, "Things are no longer simply juxtaposed: the nearest is the furthest, and the forks in the road...have become simultaneous, mutually intersecting. The entrance to the labyrinth is at one of its centers--or rather, we no longer know whether there is a center, what a center is." And Umberto Eco observes that multicursal labyrinths (like Dahlberg's) need no Minotaur, because in them one can make mistakes--the visitor's own errors play the monster's devouring role. Dahlberg's labyrinthine experiment, manipulating categories of interior and exterior, serves as an ambiguous model of the philosophizing psyche, its mood delicately poised between lyrical reverie and creeping paranoia.


Comic Book is the end result! The EP features the vocal talent of Lady Saw,Turbulence and Ward 21. Remix duty is handled by the Bass mafia international: Stereotyp, Kalbata, Robot Koch, Reverse Engineering, Son Of Kick, Filewile, I-Wolf and King Aron.
The package covers the chew-your-bass-cabinets-off type of Future Dancehall, explores detail filled Post Step and of course touches on some sounds that are just impossible to categorize!


There are many types of violence and abuse. Some of these signs are signs of physical abuse or domestic violence. Some are signs of emotional and verbal abuse or sexual abuse.
If you think someone is abusing you, get help. Abuse can have serious physical and emotional effects.
Sometimes a romantic relationship may not be abusive but may have serious problems that make it unhealthy. If you think you might be in an unhealthy relationship, try talking with your partner about your concerns. If that seems difficult, you might also talk to a trusted friend, family member, counselor, or religious leader.


text:
Heusweiler – miejscowość i gmina w zachodnich Niemczech, w kraju związkowym Saara, w związku regionalnym Saarbrücken.

Współpraca
Miejscowości partnerskie:
 Markneukirchen, Saksonia
 Orvault, Francja

Bibliografia
 Statistisches Amt Saarland, Saarbrücken

Przypisy

Związek regionalny Saarbrücken
Gminy w Saarze
Miejscowości w Saarze

redpajama_set_name: RedPajamaWikipedia


text:
Reviewed: Philip Hinchcliffe Presents – The Genesis Chamber
Hinchcliffe rides again!
The Fourth Doctor and Leela land on a human colony where the population is divided into the technologically advanced city-dwellers and the savages in the jungle outside. A mysterious and heroic visitor has also arrived and quickly wins over both sides. The city's technology is failing and flying insects are terrorising the savages outside. But anarchy is the least of anyone's problems…
As you are almost certainly aware Philip Hinchcliffe was the producer of televised Doctor Who from 1975-1977. He ushered in an era of Gothic horror and increasing ratings as Tom Baker hit his stride. Hinchcliffe has teamed up with Big Finish to bring stories that didn't get made on telly back in the '70s to audio now. We are all very jammy dodgers…
Written by Marc Platt, The Genesis Chamber is a big story. We've got at least 10 key characters other than the regulars cast, spanning at least three species. There are three main settings, four well-maintained mysteries, and a Big Bang at the end.
Most impressive is that the drama never really seems to leave you behind. This number of new characters to engage with usually puts me off but I found Chamber remarkably easy to follow. The mid-70s atmosphere is well captured and there are some of the more hammy performances that are familiar from Classic Who of that era but this never interferes with the drama.
At times, your suspension of disbelief will have heavy demands placed on it where characters fall for seemingly obvious deception but I think this is hard to avoid given the nature of the story. This is part political intrigue, part farce, and part action thriller. And the task of re-creating a retro family-viewing fantasy programme on audio in the post-Buffy world for a largely adult audience (I think?) is a tall order. Allowing Tom Baker and Louise Jameson to deliver the core of their original characters and staying true to the feel of their era requires a particular stylistic approach. Hinchcliffe and the Big Finish team are once again successful.
The only thing I found grated was the use of West Country accents to identify the savage, lower-class people outside the city, and RP for the more advanced city-dwellers. This seemed a little too obvious but in fairness is probably what the show would have done back then (and perhaps still would). Ultimately it does work well in identifying who comes from where – and I don't have a preferred solution!
After what feels like a slightly forced start, Baker and Jameson quickly settle into the story and continued to deliver wonderful audio incarnations of the Fourth Doctor and Leela. The supporting cast do a fine job – in particular, Gyuri Sarossy delivers a consistent and compelling performance as Volor, the mysterious interloper. This is especially important given his pivotal role and complex background to the character.
Listeners might question the apparent plot similarity with 1977's The Face of Evil where Leela's origins were the savage Sevateem, pitted against the more advanced Tesh. Indeed, their names had evolved from the jocks and nerds of the original colony ship via the Survey Team and Technicians. The Genesis Chamber even features a super-intelligent computer, Inscape, with strong parallels to Xoanon from Leela's origin story. Despite these familiar tropes, Chamber easily stands on its own as a worthwhile story and concept: the similarity didn't feel like a re-hash but more an homage if anything.
The music is as ever so impressive it creates the desired atmosphere without you really noticing it's there. Along with the writing and performances, it contributes a great deal to re-creating the feel of mid-1970s Doctor Who while engaging 21st Century listeners. Andy Hardwick is responsible for both the composition and the overall sound design and his attention to detail within a very specific brief is clear throughout the adventure.
The Long and the Short of it: Overall I found Chamber didn't grip me quite as much as Hincliffe's earlier offerings which may be due to my own preference for Gothic creepiness over futuristic melodrama, but I very much enjoyed the story nonetheless. There are sufficient twists, reveals, and developments to keep the narrative moving despite the length.
It didn't blow me away but it's good – a sound and enjoyable addition to the Hinchcliffe corpus.
You'll enjoy this if you liked: Androids of Tara, The Curse of Peladon/ Monster of Peladon, or The Face of Evil. There are hints of Romeo & Juliet, Brave New World, and perhaps even some Iain M. Banks.
Philip Hinchcliffe Presents: The Genesis Chamber is out now from Big Finish.
Published by James Lomond
A keen day-dreamer and wannabe writer when his day job allows, James enjoys anything out of the ordinary providing there's coffee. He can be found wandering around museums for "inspiration" or arguing for the sake of it. He became a fan in the late '80s watching the last 2 years of Classic Who live and spent the '90s catching up on the rest. Supple eyebrows. Mostly harmless.	View all posts by James Lomond
Posted in Big FinishTagged Andy Hardwick, Big Finish, Doctor Who: The Genesis Chamber, Fourth Doctor, Leela, Louise Jameson, Marc Platt, Philip Hinchcliffe, The Face of Evil, Tom BakerLeave a comment
← Horror in Who: Self
Out Now: Class – Joyride, The Stone House, and What She Does Next Will Astound You →
Reviewed: Philip Hinchcliffe P…
by James Lomond time to read: 3 min
Big Finish	Reviewed: Doctor Who – A Life of Crime
Big Finish	Retrospective: Big Finish's Return to Telos…


There's no doubt that we, at Bay Area Circuits, get to work with some very talented individuals working on some pretty incredible projects. Star Simpson is one of those individuals and Circuit Classics is one of those projects! Star is bringing to life classic circuit drawings from Forrest Mims' "Getting Started in Electronics" and recently made the designs available via Crowd Supply. The support for the campaign has been tremendous and now it's time to get to work on manufacturing.
Interested in supporting this fantastic project? Learn more about the Circuit Classics project on Crowd Supply.
Have a project of your own and need assistance with PCB design, manufacturing or assembly? Tell us about it!


Essays on risk adjustment in health insurance [printed text] / Carine Van de Voorde, Author . - Leuven (Belgium) : Katholieke Universiteit Leuven (KUL), 2010 . - 155 p. : ill. ; 24 cm. - (Faculteit economie en bedrijfswetenschappen) .
Ethics and the pharmaceutical industry [printed text] / Michael A. Santoro, Author ; Thomas M. Gorrie, Author . - Cambridge (U.K.) : Cambridge University Press, 2007 . - 492 p. : ill. ; 24 cm.
Despite the pharmaceutical industry's notable contributions to human progress, including the development of miracle drugs for treating cancer, AIDS, and heart disease, there is a growing tension between the industry and the public. Debates are raging over how the industry can and should be expected to act. In this volume leading figures in industry, government, NGOs, the medical community, and academia discuss and propose solutions to the ethical dilemmas of drug industry behavior. They examine such aspects as the role of intellectual property rights and patent protection, the moral and economic requisites of research and clinical trials, drug pricing, marketing and advertising. . Michael Santoro is Associate Professor with tenure in the Business Environment Department at Rutgers Business School, where he teaches courses on business ethics, public policy, labor and human rights, law, ethical issues in the pharmaceutical industry and China business strategy. As a Research Associate at Harvard Business School, he wrote or co-authored nearly thirty case studies and teaching notes on ethical and legal topics such as global protection of intellectual property, insider trading, the Federal Sentencing Guidelines and Fair Credit Reporting Act. Thomas Gorrie is Corporate Vice President, Government Affairs & Policy, at Johnson & Johnson, with responsiblity for all federal, state and international government affairs and policy. He completed post-doctoral studies at the Swiss Federal Institute of Technology in Zurich, following the receipt of his doctorate at Princeton University. Gorrie has over 30 years of worldwide health care experience and has worked with various Johnson & Johnson companies in research and development, marketing and sales, business development, strategic planning, general management, international, venture capital, and health policy.
Decision Modelling for Health Economic Evaluation Briggs, Andrew H.
Etude relative aux coûts potentiels liés à une éventuelle modification des règles du droit de la responsabilité médicale (phase III) : affinement des estimations [printed text] / Xavier Maréchal, Author ; Imgard Vinck , Author ; Jean-Pierre Closon, Author ; Michel Denuit, Author . - Brussels (Doorbuilding (10th), Bld Jardin Botanique, 55, 1000, Belgium) : KCE = Federaal Kenniscentrum voor de Gezondheidszorg = Centre Fédéral d'Expertise des Soins de Santé = Belgian Health Care Knowledge Centre, 2006 . - ix, 73 p., 7p., 4p. : ill. ; 30 cm.. - (KCE Reports B. Health Services Research (HSR); 35B) .
Evacuatie - Oefeningen [printed text] . - Louvain-l-Neuve (PArc scientifique fleming, 1348) : ANPI, 2011 . - 24 p. : ill. ; A4. - (Dossier ANPI; 150) .
Microsoft SQL Server 2008 Stanek, William R.
Microsoft Excel data analysis and business modeling Winston, Wayne L.
Evaluation : a systematic approach [printed text] / Peter Henri Rossi, Author ; Mark W. Lipsey, Author ; Howard Edgar Freeman, Author . - 7th ed. . - London, Thousand Oaks, Calif., New Delhi : Sage Publications, 2004 . - X-470 p. : ill. ; 24 cm.
Evalueren. Het ontwerpen, begeleiden en evalueren van interventies Swanborn, P.G.
Institutional change and healthcare organizations Scott, Richard W.


text:
require "spec_helper"

RSpec.describe "nav", :js => true, :type => :feature do
  include Capybara::Angular::DSL

  it "contains links to top-level pages" do
    visit "/"

    page_names = get_page_names
    page_names[page_names.index("home")] = ""

    expect(page).to have_selector ".navbar"
    page_names.each do |page_name|
      expect(page).to have_selector ".navbar a[href='/#/#{page_name}']"
    end
  end

  it "highlights link of current page" do
    page_names = get_page_names - ["home"]

    page_links = page_names.map do |page_name|
      "/#/#{page_name}"
    end

    page_links.each do |link|
      visit link

      active_link = ".navbar li.active a[href='#{link}']"
      expect(page).to have_selector active_link
    end
  end
end

redpajama_set_name: RedPajamaGithub


text:
CASE STUDY - FOR IMMEDIATE RELEASE
Tribune Builds the 4K Future with Facilis
Hudson, MA - The Chicago Tribune Media Group is one of the USA's longest-established publishers of newspapers and magazines. While retaining the strengths of its established brands – like the Chicago Tribune– it has now developed into an innovator in digital and online content.
As part of this transformation, Tribune's Creative Services department provides an in-house resource for content. Mason Pierce is its senior video producer. "We directly support video for Marketing, Targeted Media, Editorial and anything in between," he said. "Short and long-form; web; social media – whatever our titles and brands need, we are an internal agency there to create it."
Now Mason and his team are adding 4k Ultra HD production capabilities to the mix. Content is already being produced in 4k, and material is added to the archive for future re-purposing.
The Creative Services department has a team of editors, graphic designers and animators who produce a huge amount of output each year. Managing all the content, and providing visibility of projects to the producers and commissioners in Tribune's business units, calls for a sophisticated means of handling video.
The solution lies in the TerraBlock 24D from Facilis. At the beginning of 2015, Tribune upgraded its facilities with two new 96TB units. The story began seven years earlier, though.
"Back then, we needed to jump from analog SD to digital HD," recalled Mason. "We knew we needed a completely fresh approach to the way we worked, because we could see we would build up a huge amount of HD content."
So Mason and his team realized they would have to find a solution that was simple enough for them to manage on their own, while also providing the storage bandwidth required. "We needed to set it and forget it, without a dedicated IT professional constantly baby-sitting the appliance."
Having surveyed the market, Facilis provided the solution. It gave them the flexibility to manage the work through volumes and projects, and most important, it could all be done by their in-house staff, not through an IT specialist. "With Facilis we were able to increase our workflow significantly," said Mason. "We were able to share projects more efficiently and access content directly, not wait for files to be pulled down."
One particular aspect of TerraBlock was central to the way Tribune works today. It supports both Fibre and copper – gigabit Ethernet – connectivity. The operation uses this to streamline its productions.
"We have power users – editors, animators, graphic designers – who are connected by Fibre and have fast access to all the content," Mason explained. "But we have a number of other users, who might be the producers, or the brand managers in the business units, or the copywriters, who do not need multiple streams of full resolution content. We give them controlled access, and we connect them over copper so they can be anywhere in the Tribune network."
Tribune uses the volume functionality of TerraBlock to manage content. Not only does this restrict users to the projects they are entitled to see – so producers from one business unit cannot look into what others are doing – it also makes the system easy to use, minimizing the need for technical support.
Today the power users are creating content using Adobe Premiere, SpeedGrade, After Effects and Maya, and occasionally Cinema 4D, all connected directly to the TerraBlock. Traditionally acquisition has been on Sony XDCam and DSLRs. However, the ambitions of the department have stretched to 4k acquisition and finishing.
The success of the in-house department, supported by the Facilis TerraBlock, meant that over the years since the original installation, its output had grown three-fold. With the increased work, and the desire to future-proof content through 4k acquisition and finishing, it was time to expand the department's technical infrastructure.
Even though they loved the power and ease of use of the TerraBlock, Mason and his team looked around at what was available in the market, recognizing that technology had moved on. Despite intensive research, nothing came close to doing what Facilis could deliver as standard. With the help of leading reseller and systems integrator, KeyCode Media in Chicago, Tribune's Creative Services department recently upgraded its existing Facilis storage system with two new 96TB TerraBlock 24D shared storage systems.
"We have invested in Sony FS700 cameras with Convergent Designs recorders, capturing in 4k ProRes," according to Mason. The Sony FS700s also create and record an HD proxy on the fly, so as soon as the crew gets back to base the content is dropped into the TerraBlock and is available.
In general, the practice is to edit with the proxy, then do a final conform and grade in 4k. But even this may not be necessary, according to Mason: "We have discovered that the Facilis system does not even blink when editing 4k. So we know if we have a quick turnaround project we can do it all online, with the 4k in our normal 'work in progress' volume."
With the ever-growing rate of acquisition and production, archiving content was also becoming an issue. Another advantage of the Facilis solution is its close integration with Storage DNA and its LTO data tape archives. For Tribune, this provided a seamless route to long-term protection of the content with easy and accurate retrieval for high-res conform workflows.
"We looked around, but no-one else could offer even the basic requirement of connecting to copper as well as Fibre without a workaround," he said. "As they say: if it ain't broke, don't fix it, so we got two 96TB Facilis engines, and filled them with everything we need.
We're happy we have the right platform to carry on delivering great content, quickly and efficiently."
Doug Hansel or Véronique Froment
Doug@highrezpr.com
veronique@highrezpr.com
EMEA & APAC
Bob Charlton
bob@scribe-pr.com
Home » Tribune Builds the 4K Future with Facilis


I think the idea of "reciprocal accountability" is a breath of fresh air.
Children are well-rested and well-fed.
Children have opportunities for quiet-time to reflect about their learning and/or do homework.
Children have safe and numerous opportunities to play/participate in recreation outside of the school environment.
Children have access to fully-funded libraries with fully-supported technology.
Children have access to school facilities and programs, via public funding, that reflect those in wealthy independent schools.
Teacher:student ratios reflect those of highly successful independent schools (after all, if it's good enough for wealthy kids, it should be good enough for poor kids).
Children have access to full healthcare.
Children's families have access to home ownership and job counseling.
Susan Moore Johnson, John Papay, Randi Weingarten and W. James Popham all refer to the acute impact of SES on effective teaching. Give urban or very rural teachers these pre-conditions and we will reciprocate!
I don't think you can assess teacher effectiveness through students' test scores. Standardized state tests assess student effectiveness --- at taking tests.
If you could design the criteria for your own "teacher effectiveness," what would it look like?
"If a school continues to fail its students year after year after year, if it doesn't show signs of improvement, then there's got to be a sense of accountability," he said. "And that's what happened in Rhode Island last week at a chronically troubled school, when just 7 percent of 11th-graders passed state math tests -- 7 percent."
Within schools, reciprocal accountability can mean many things. Most importantly, teachers need to have the time to co-plan and influence school-wide policies. I wonder if Central Falls had any reciprocal accountability in place?
Professional development (PD): Are teachers involved in creating and facilitating their own PD? Teachers are in a perfect position to align district priorities with the interests and needs of their students. Why not create working groups in which teachers run PD alongside school and district administrators?
School Climate: Are teachers examining the research on school climate and then developing policy that matches their school's needs?
Assessment: Arguably sub-set of PD, teachers could be looking at a variety of assessments that help them know how students are growing academically - - - and socially. Everything from state-level standardized tests, district-mandated tests, formal and informal assessment, portfolios, rubrics and project-based learning should be up for discussion. Each of these has a profound impact on how teachers organize their curricula and how students experience their learning.
By providing time for teachers to reflect and co-plan, schools and districts will be providing one aspect of reciprocal accountability. What does reciprocal accountability look like to you?
* Up next: considering society's reciprocal accountability to teachers.


text:
package org.elasticsearch.common.xcontent.support;

import org.elasticsearch.common.Strings;
import org.elasticsearch.common.collect.Tuple;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.test.ESTestCase;
import org.hamcrest.Matchers;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonMap;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.IsEqual.equalTo;

public class XContentMapValuesTests extends ESTestCase {
    public void testFilter() throws Exception {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .field("test1", "value1")
                .field("test2", "value2")
                .field("something_else", "value3")
                .endObject();

        Map<String, Object> source;
        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            source = parser.map();
        }
        Map<String, Object> filter = XContentMapValues.filter(source, new String[]{"test1"}, Strings.EMPTY_ARRAY);
        assertThat(filter.size(), equalTo(1));
        assertThat(filter.get("test1").toString(), equalTo("value1"));

        filter = XContentMapValues.filter(source, new String[]{"test*"}, Strings.EMPTY_ARRAY);
        assertThat(filter.size(), equalTo(2));
        assertThat(filter.get("test1").toString(), equalTo("value1"));
        assertThat(filter.get("test2").toString(), equalTo("value2"));

        filter = XContentMapValues.filter(source, Strings.EMPTY_ARRAY, new String[]{"test1"});
        assertThat(filter.size(), equalTo(2));
        assertThat(filter.get("test2").toString(), equalTo("value2"));
        assertThat(filter.get("something_else").toString(), equalTo("value3"));

        // more complex object...
        builder = XContentFactory.jsonBuilder().startObject()
                .startObject("path1")
                .startArray("path2")
                .startObject().field("test", "value1").endObject()
                .startObject().field("test", "value2").endObject()
                .endArray()
                .endObject()
                .field("test1", "value1")
                .endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            source = parser.map();
        }
        filter = XContentMapValues.filter(source, new String[]{"path1"}, Strings.EMPTY_ARRAY);
        assertThat(filter.size(), equalTo(1));

        filter = XContentMapValues.filter(source, new String[]{"path1*"}, Strings.EMPTY_ARRAY);
        assertThat(filter.get("path1"), equalTo(source.get("path1")));
        assertThat(filter.containsKey("test1"), equalTo(false));

        filter = XContentMapValues.filter(source, new String[]{"test1*"}, Strings.EMPTY_ARRAY);
        assertThat(filter.get("test1"), equalTo(source.get("test1")));
        assertThat(filter.containsKey("path1"), equalTo(false));

        filter = XContentMapValues.filter(source, new String[]{"path1.path2.*"}, Strings.EMPTY_ARRAY);
        assertThat(filter.get("path1"), equalTo(source.get("path1")));
        assertThat(filter.containsKey("test1"), equalTo(false));
    }

    @SuppressWarnings({"unchecked"})
    public void testExtractValue() throws Exception {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .field("test", "value")
                .endObject();

        Map<String, Object> map;
        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            map = parser.map();
        }
        assertThat(XContentMapValues.extractValue("test", map).toString(), equalTo("value"));
        assertThat(XContentMapValues.extractValue("test.me", map), nullValue());
        assertThat(XContentMapValues.extractValue("something.else.2", map), nullValue());

        builder = XContentFactory.jsonBuilder().startObject()
                .startObject("path1").startObject("path2").field("test", "value").endObject().endObject()
                .endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            map = parser.map();
        }
        assertThat(XContentMapValues.extractValue("path1.path2.test", map).toString(), equalTo("value"));
        assertThat(XContentMapValues.extractValue("path1.path2.test_me", map), nullValue());
        assertThat(XContentMapValues.extractValue("path1.non_path2.test", map), nullValue());

        Object extValue = XContentMapValues.extractValue("path1.path2", map);
        assertThat(extValue, instanceOf(Map.class));
        Map<String, Object> extMapValue = (Map<String, Object>) extValue;
        assertThat(extMapValue, hasEntry("test", (Object) "value"));

        extValue = XContentMapValues.extractValue("path1", map);
        assertThat(extValue, instanceOf(Map.class));
        extMapValue = (Map<String, Object>) extValue;
        assertThat(extMapValue.containsKey("path2"), equalTo(true));

        // lists
        builder = XContentFactory.jsonBuilder().startObject()
                .startObject("path1").array("test", "value1", "value2").endObject()
                .endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            map = parser.map();
        }

        extValue = XContentMapValues.extractValue("path1.test", map);
        assertThat(extValue, instanceOf(List.class));

        List extListValue = (List) extValue;
        assertThat(extListValue.size(), equalTo(2));

        builder = XContentFactory.jsonBuilder().startObject()
                .startObject("path1")
                .startArray("path2")
                .startObject().field("test", "value1").endObject()
                .startObject().field("test", "value2").endObject()
                .endArray()
                .endObject()
                .endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            map = parser.map();
        }

        extValue = XContentMapValues.extractValue("path1.path2.test", map);
        assertThat(extValue, instanceOf(List.class));

        extListValue = (List) extValue;
        assertThat(extListValue.size(), equalTo(2));
        assertThat(extListValue.get(0).toString(), equalTo("value1"));
        assertThat(extListValue.get(1).toString(), equalTo("value2"));

        // fields with . in them
        builder = XContentFactory.jsonBuilder().startObject()
                .field("xxx.yyy", "value")
                .endObject();
        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            map = parser.map();
        }
        assertThat(XContentMapValues.extractValue("xxx.yyy", map).toString(), equalTo("value"));

        builder = XContentFactory.jsonBuilder().startObject()
                .startObject("path1.xxx").startObject("path2.yyy").field("test", "value").endObject().endObject()
                .endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            map = parser.map();
        }
        assertThat(XContentMapValues.extractValue("path1.xxx.path2.yyy.test", map).toString(), equalTo("value"));
    }

    public void testExtractRawValue() throws Exception {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .field("test", "value")
                .endObject();

        Map<String, Object> map;
        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            map = parser.map();
        }
        assertThat(XContentMapValues.extractRawValues("test", map).get(0).toString(), equalTo("value"));

        builder = XContentFactory.jsonBuilder().startObject()
                .field("test.me", "value")
                .endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            map = parser.map();
        }
        assertThat(XContentMapValues.extractRawValues("test.me", map).get(0).toString(), equalTo("value"));

        builder = XContentFactory.jsonBuilder().startObject()
                .startObject("path1").startObject("path2").field("test", "value").endObject().endObject()
                .endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            map = parser.map();
        }
        assertThat(XContentMapValues.extractRawValues("path1.path2.test", map).get(0).toString(), equalTo("value"));

        builder = XContentFactory.jsonBuilder().startObject()
                .startObject("path1.xxx").startObject("path2.yyy").field("test", "value").endObject().endObject()
                .endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            map = parser.map();
        }
        assertThat(XContentMapValues.extractRawValues("path1.xxx.path2.yyy.test", map).get(0).toString(), equalTo("value"));
    }

    public void testPrefixedNamesFilteringTest() {
        Map<String, Object> map = new HashMap<>();
        map.put("obj", "value");
        map.put("obj_name", "value_name");
        Map<String, Object> filterdMap = XContentMapValues.filter(map, new String[]{"obj_name"}, Strings.EMPTY_ARRAY);
        assertThat(filterdMap.size(), equalTo(1));
        assertThat((String) filterdMap.get("obj_name"), equalTo("value_name"));
    }

    @SuppressWarnings("unchecked")
    public void testNestedFiltering() {
        Map<String, Object> map = new HashMap<>();
        map.put("field", "value");
        map.put("array",
                Arrays.asList(
                        1,
                        new HashMap<String, Object>() {{
                            put("nested", 2);
                            put("nested_2", 3);
                        }}));
        Map<String, Object> falteredMap = XContentMapValues.filter(map, new String[]{"array.nested"}, Strings.EMPTY_ARRAY);
        assertThat(falteredMap.size(), equalTo(1));

        // Selecting members of objects within arrays (ex. [ 1, { nested: "value"} ])  always returns all values in the array (1 in the ex)
        // this is expected behavior as this types of objects are not supported in ES
        assertThat((Integer) ((List) falteredMap.get("array")).get(0), equalTo(1));
        assertThat(((Map<String, Object>) ((List) falteredMap.get("array")).get(1)).size(), equalTo(1));
        assertThat((Integer) ((Map<String, Object>) ((List) falteredMap.get("array")).get(1)).get("nested"), equalTo(2));

        falteredMap = XContentMapValues.filter(map, new String[]{"array.*"}, Strings.EMPTY_ARRAY);
        assertThat(falteredMap.size(), equalTo(1));
        assertThat((Integer) ((List) falteredMap.get("array")).get(0), equalTo(1));
        assertThat(((Map<String, Object>) ((List) falteredMap.get("array")).get(1)).size(), equalTo(2));

        map.clear();
        map.put("field", "value");
        map.put("obj",
                new HashMap<String, Object>() {{
                    put("field", "value");
                    put("field2", "value2");
                }});
        falteredMap = XContentMapValues.filter(map, new String[]{"obj.field"}, Strings.EMPTY_ARRAY);
        assertThat(falteredMap.size(), equalTo(1));
        assertThat(((Map<String, Object>) falteredMap.get("obj")).size(), equalTo(1));
        assertThat((String) ((Map<String, Object>) falteredMap.get("obj")).get("field"), equalTo("value"));

        falteredMap = XContentMapValues.filter(map, new String[]{"obj.*"}, Strings.EMPTY_ARRAY);
        assertThat(falteredMap.size(), equalTo(1));
        assertThat(((Map<String, Object>) falteredMap.get("obj")).size(), equalTo(2));
        assertThat((String) ((Map<String, Object>) falteredMap.get("obj")).get("field"), equalTo("value"));
        assertThat((String) ((Map<String, Object>) falteredMap.get("obj")).get("field2"), equalTo("value2"));

    }

    @SuppressWarnings("unchecked")
    public void testCompleteObjectFiltering() {
        Map<String, Object> map = new HashMap<>();
        map.put("field", "value");
        map.put("obj",
                new HashMap<String, Object>() {{
                    put("field", "value");
                    put("field2", "value2");
                }});
        map.put("array",
                Arrays.asList(
                        1,
                        new HashMap<String, Object>() {{
                            put("field", "value");
                            put("field2", "value2");
                        }}));

        Map<String, Object> filteredMap = XContentMapValues.filter(map, new String[]{"obj"}, Strings.EMPTY_ARRAY);
        assertThat(filteredMap.size(), equalTo(1));
        assertThat(((Map<String, Object>) filteredMap.get("obj")).size(), equalTo(2));
        assertThat(((Map<String, Object>) filteredMap.get("obj")).get("field").toString(), equalTo("value"));
        assertThat(((Map<String, Object>) filteredMap.get("obj")).get("field2").toString(), equalTo("value2"));

        filteredMap = XContentMapValues.filter(map, new String[]{"obj"}, new String[]{"*.field2"});
        assertThat(filteredMap.size(), equalTo(1));
        assertThat(((Map<String, Object>) filteredMap.get("obj")).size(), equalTo(1));
        assertThat(((Map<String, Object>) filteredMap.get("obj")).get("field").toString(), equalTo("value"));

        filteredMap = XContentMapValues.filter(map, new String[]{"array"}, new String[]{});
        assertThat(filteredMap.size(), equalTo(1));
        assertThat(((List) filteredMap.get("array")).size(), equalTo(2));
        assertThat((Integer) ((List) filteredMap.get("array")).get(0), equalTo(1));
        assertThat(((Map<String, Object>) ((List) filteredMap.get("array")).get(1)).size(), equalTo(2));

        filteredMap = XContentMapValues.filter(map, new String[]{"array"}, new String[]{"*.field2"});
        assertThat(filteredMap.size(), equalTo(1));
        assertThat(((List) filteredMap.get("array")).size(), equalTo(2));
        assertThat((Integer) ((List) filteredMap.get("array")).get(0), equalTo(1));
        assertThat(((Map<String, Object>) ((List) filteredMap.get("array")).get(1)).size(), equalTo(1));
        assertThat(((Map<String, Object>) ((List) filteredMap.get("array")).get(1)).get("field").toString(), equalTo("value"));
    }

    @SuppressWarnings("unchecked")
    public void testFilterIncludesUsingStarPrefix() {
        Map<String, Object> map = new HashMap<>();
        map.put("field", "value");
        map.put("obj",
                new HashMap<String, Object>() {{
                    put("field", "value");
                    put("field2", "value2");
                }});
        map.put("n_obj",
                new HashMap<String, Object>() {{
                    put("n_field", "value");
                    put("n_field2", "value2");
                }});

        Map<String, Object> filteredMap = XContentMapValues.filter(map, new String[]{"*.field2"}, Strings.EMPTY_ARRAY);
        assertThat(filteredMap.size(), equalTo(1));
        assertThat(filteredMap, hasKey("obj"));
        assertThat(((Map<String, Object>) filteredMap.get("obj")).size(), equalTo(1));
        assertThat(((Map<String, Object>) filteredMap.get("obj")), hasKey("field2"));

        // only objects
        filteredMap = XContentMapValues.filter(map, new String[]{"*.*"}, Strings.EMPTY_ARRAY);
        assertThat(filteredMap.size(), equalTo(2));
        assertThat(filteredMap, hasKey("obj"));
        assertThat(((Map<String, Object>) filteredMap.get("obj")).size(), equalTo(2));
        assertThat(filteredMap, hasKey("n_obj"));
        assertThat(((Map<String, Object>) filteredMap.get("n_obj")).size(), equalTo(2));

        filteredMap = XContentMapValues.filter(map, new String[]{"*"}, new String[]{"*.*2"});
        assertThat(filteredMap.size(), equalTo(3));
        assertThat(filteredMap, hasKey("field"));
        assertThat(filteredMap, hasKey("obj"));
        assertThat(((Map) filteredMap.get("obj")).size(), equalTo(1));
        assertThat(((Map<String, Object>) filteredMap.get("obj")), hasKey("field"));
        assertThat(filteredMap, hasKey("n_obj"));
        assertThat(((Map<String, Object>) filteredMap.get("n_obj")).size(), equalTo(1));
        assertThat(((Map<String, Object>) filteredMap.get("n_obj")), hasKey("n_field"));

    }

    public void testFilterWithEmptyIncludesExcludes() {
        Map<String, Object> map = new HashMap<>();
        map.put("field", "value");
        Map<String, Object> filteredMap = XContentMapValues.filter(map, Strings.EMPTY_ARRAY, Strings.EMPTY_ARRAY);
        assertThat(filteredMap.size(), equalTo(1));
        assertThat(filteredMap.get("field").toString(), equalTo("value"));

    }

    public void testThatFilterIncludesEmptyObjectWhenUsingIncludes() throws Exception {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .startObject("obj")
                .endObject()
                .endObject();

        Tuple<XContentType, Map<String, Object>> mapTuple = XContentHelper.convertToMap(builder.bytes(), true);
        Map<String, Object> filteredSource = XContentMapValues.filter(mapTuple.v2(), new String[]{"obj"}, Strings.EMPTY_ARRAY);

        assertThat(mapTuple.v2(), equalTo(filteredSource));
    }

    public void testThatFilterIncludesEmptyObjectWhenUsingExcludes() throws Exception {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .startObject("obj")
                .endObject()
                .endObject();

        Tuple<XContentType, Map<String, Object>> mapTuple = XContentHelper.convertToMap(builder.bytes(), true);
        Map<String, Object> filteredSource = XContentMapValues.filter(mapTuple.v2(), Strings.EMPTY_ARRAY, new String[]{"nonExistingField"});

        assertThat(mapTuple.v2(), equalTo(filteredSource));
    }

    public void testNotOmittingObjectsWithExcludedProperties() throws Exception {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .startObject("obj")
                .field("f1", "v1")
                .endObject()
                .endObject();

        Tuple<XContentType, Map<String, Object>> mapTuple = XContentHelper.convertToMap(builder.bytes(), true);
        Map<String, Object> filteredSource = XContentMapValues.filter(mapTuple.v2(), Strings.EMPTY_ARRAY, new String[]{"obj.f1"});

        assertThat(filteredSource.size(), equalTo(1));
        assertThat(filteredSource, hasKey("obj"));
        assertThat(((Map) filteredSource.get("obj")).size(), equalTo(0));
    }

    @SuppressWarnings({"unchecked"})
    public void testNotOmittingObjectWithNestedExcludedObject() throws Exception {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .startObject("obj1")
                .startObject("obj2")
                .startObject("obj3")
                .endObject()
                .endObject()
                .endObject()
                .endObject();

        // implicit include
        Tuple<XContentType, Map<String, Object>> mapTuple = XContentHelper.convertToMap(builder.bytes(), true);
        Map<String, Object> filteredSource = XContentMapValues.filter(mapTuple.v2(), Strings.EMPTY_ARRAY, new String[]{"*.obj2"});

        assertThat(filteredSource.size(), equalTo(1));
        assertThat(filteredSource, hasKey("obj1"));
        assertThat(((Map) filteredSource.get("obj1")).size(), Matchers.equalTo(0));

        // explicit include
        filteredSource = XContentMapValues.filter(mapTuple.v2(), new String[]{"obj1"}, new String[]{"*.obj2"});
        assertThat(filteredSource.size(), equalTo(1));
        assertThat(filteredSource, hasKey("obj1"));
        assertThat(((Map) filteredSource.get("obj1")).size(), Matchers.equalTo(0));

        // wild card include
        filteredSource = XContentMapValues.filter(mapTuple.v2(), new String[]{"*.obj2"}, new String[]{"*.obj3"});
        assertThat(filteredSource.size(), equalTo(1));
        assertThat(filteredSource, hasKey("obj1"));
        assertThat(((Map<String, Object>) filteredSource.get("obj1")), hasKey("obj2"));
        assertThat(((Map) ((Map) filteredSource.get("obj1")).get("obj2")).size(), Matchers.equalTo(0));
    }

    @SuppressWarnings({"unchecked"})
    public void testIncludingObjectWithNestedIncludedObject() throws Exception {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .startObject("obj1")
                .startObject("obj2")
                .endObject()
                .endObject()
                .endObject();

        Tuple<XContentType, Map<String, Object>> mapTuple = XContentHelper.convertToMap(builder.bytes(), true);
        Map<String, Object> filteredSource = XContentMapValues.filter(mapTuple.v2(), new String[]{"*.obj2"}, Strings.EMPTY_ARRAY);

        assertThat(filteredSource.size(), equalTo(1));
        assertThat(filteredSource, hasKey("obj1"));
        assertThat(((Map) filteredSource.get("obj1")).size(), equalTo(1));
        assertThat(((Map<String, Object>) filteredSource.get("obj1")), hasKey("obj2"));
        assertThat(((Map) ((Map) filteredSource.get("obj1")).get("obj2")).size(), equalTo(0));
    }

    public void testEmptyList() throws IOException {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .startArray("some_array")
                .endArray().endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken());
            assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken());
            assertEquals("some_array", parser.currentName());
            if (random().nextBoolean()) {
                // sometimes read the start array token, sometimes not
                assertEquals(XContentParser.Token.START_ARRAY, parser.nextToken());
            }
            assertEquals(Collections.emptyList(), parser.list());
        }
    }

    public void testSimpleList() throws IOException {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .startArray("some_array")
                    .value(1)
                    .value(3)
                    .value(0)
                .endArray().endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken());
            assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken());
            assertEquals("some_array", parser.currentName());
            if (random().nextBoolean()) {
                // sometimes read the start array token, sometimes not
                assertEquals(XContentParser.Token.START_ARRAY, parser.nextToken());
            }
            assertEquals(Arrays.asList(1, 3, 0), parser.list());
        }
    }

    public void testNestedList() throws IOException {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .startArray("some_array")
                    .startArray().endArray()
                    .startArray().value(1).value(3).endArray()
                    .startArray().value(2).endArray()
                .endArray().endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken());
            assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken());
            assertEquals("some_array", parser.currentName());
            if (random().nextBoolean()) {
                // sometimes read the start array token, sometimes not
                assertEquals(XContentParser.Token.START_ARRAY, parser.nextToken());
            }
            assertEquals(
                    Arrays.asList(Collections.<Integer>emptyList(), Arrays.asList(1, 3), Arrays.asList(2)),
                    parser.list());
        }
    }

    public void testNestedMapInList() throws IOException {
        XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
                .startArray("some_array")
                    .startObject().field("foo", "bar").endObject()
                    .startObject().endObject()
                .endArray().endObject();

        try (XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(builder.string())) {
            assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken());
            assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken());
            assertEquals("some_array", parser.currentName());
            if (random().nextBoolean()) {
                // sometimes read the start array token, sometimes not
                assertEquals(XContentParser.Token.START_ARRAY, parser.nextToken());
            }
            assertEquals(
                    Arrays.asList(singletonMap("foo", "bar"), emptyMap()),
                    parser.list());
        }
    }

    public void testDotsInFieldNames() {
        Map<String, Object> map = new HashMap<>();
        map.put("foo.bar", 2);
        Map<String, Object> sub = new HashMap<>();
        sub.put("baz", 3);
        map.put("foo", sub);
        map.put("quux", 5);

        // dots in field names in includes
        Map<String, Object> filtered = XContentMapValues.filter(map, new String[] {"foo"}, new String[0]);
        Map<String, Object> expected = new HashMap<>(map);
        expected.remove("quux");
        assertEquals(expected, filtered);

        // dots in field names in excludes
        filtered = XContentMapValues.filter(map, new String[0], new String[] {"foo"});
        expected = new HashMap<>(map);
        expected.keySet().retainAll(Collections.singleton("quux"));
        assertEquals(expected, filtered);
    }

    public void testSupplementaryCharactersInPaths() {
        Map<String, Object> map = new HashMap<>();
        map.put("搜索", 2);
        map.put("指数", 3);

        assertEquals(Collections.singletonMap("搜索", 2), XContentMapValues.filter(map, new String[] {"搜索"}, new String[0]));
        assertEquals(Collections.singletonMap("指数", 3), XContentMapValues.filter(map, new String[0], new String[] {"搜索"}));
    }

    public void testSharedPrefixes() {
        Map<String, Object> map = new HashMap<>();
        map.put("foobar", 2);
        map.put("foobaz", 3);

        assertEquals(Collections.singletonMap("foobar", 2), XContentMapValues.filter(map, new String[] {"foobar"}, new String[0]));
        assertEquals(Collections.singletonMap("foobaz", 3), XContentMapValues.filter(map, new String[0], new String[] {"foobar"}));
    }
}


text:
module Kontena::Cli::Vault
  class ReadCommand < Kontena::Command
    include Kontena::Cli::Common
    include Kontena::Cli::GridOptions

    parameter "NAME", "Secret name"

    option '--value', :flag, 'Just output the value'
    option '--return', :flag, 'Return the value', hidden: true

    def execute
      require_api_url
      require_current_grid

      token = require_token
      result = client(token).get("secrets/#{current_grid}/#{name}")
      return result['value'] if self.return?
      if self.value?
        puts result['value']
      else
        puts "#{result['name']}:"
        puts "  created_at: #{result['created_at']}"
        puts "  value: #{result['value']}"
      end
    end
  end
end