text:
Secondhand Desire: On Sanjena Sathian's "Gold Diggers"
May 28, 2021 • By Anita Felicelli
Sanjena Sathian
WILLIAM MAKEPEACE THACKERAY'S misanthropic, highly pleasurable doorstop novel Vanity Fair (1848) centers on Becky Sharp, a genius scam artist and manipulator who, when she has fatigued one mark, concocts another scheme, and then another. The society she lives in is not an admirable one, either. It's full of awful people — even Amelia, to whom the reader might ordinarily be sympathetic, can induce a cringe response. If you have a certain disposition, however, this ugly atmosphere can make Thackeray's novel more of a lacerating delight than the works of his warmer-hearted, but also more didactic, contemporary and rival, Charles Dickens. Indian American director Mira Nair's 2004 film adaptation of Vanity Fair takes away some of Becky Sharp's sting — Nair's instincts are perhaps too gracious to pull off the kind of cold, thorny, unsympathetic observations at which Thackeray excels.
Sanjena Sathian's debut novel, Gold Diggers, features several Indian American characters who are a little like Becky Sharp, but mostly they are not especially talented. Their scheming and striving seem secondhand, born not of their own native wit or survival instincts, but from privileges and ambitions handed to them by their parents. The old-fashioned narrative sensibility behind Gold Diggers, at least at first, reminded me of Thackeray's. The novel opens on a large community of Indian American teenagers in a high school in Hammond Creek, Georgia. Our hapless teen narrator, Neil Narayan, wishes he could be as capable as the model minority strivers who surround him. Unfortunately, he lacks any drive of his own, and is mostly content to follow the crowd. "Yes, I consisted largely of my parents' ambitions," he says, "but some part of me was also made of the ogling, boggling eyeballs of the rest of our community." (Here, too, there might be a subtle reference to Vanity Fair and its fictional Boggley Wollah.)
Neil sets the stage at a high school dance in the opening section: "Indians and Asians were the likeliest ones to be bopping around, because though none of us could really move, the dancing offered a prescribed activity for the evening, a script. I depended on scripts in those days, before anyone asked me to invent my own life." Sathian's satire is pitch perfect when it emphasizes the role of gossip in the affluent Indian American community:
Gossip is to my mother […] the virtuosic amalgamation of years of a community's becoming. For as long as I can remember she has been a connoisseur of gossip, of the sounds it makes, the musicality, the overall gestalt[.] […] One might call her ears — which are extremely large and loose lobed, with openings to the ear canal the size of a thumbnail — the place where the Indian immigrant public sphere gathers. In between wax and bristly dark hairs, the diaspora unscatters and lodges itself.
The passage moves from a precise characterization of Neil's mother to a broader survey of gossip's appeal as something musical, perhaps even a little sophisticated and beautiful ("the overall gestalt"), before widening even further into an astute and baroque bodily metaphor. It concludes on a note of almost Swiftian grotesquerie, with the ear as a site not only of earwax and bristly hairs, but also the diaspora itself. It's savagely funny.
The comedic grotesque register gives way, at times, to an authentic and heartrending melancholia. Neil feels he's less talented than the community around him and wishes everyone would give up on him, reasoning that
it wasn't our job just to grow up, but to grow up in such a way that made sense of our parents' choice to leave behind all they knew, to cross the oceans. I couldn't bear to be the only one among them — Prachi, Manu, Anita — who failed to achieve anything, who ultimately became nobody at all.
We're familiar with this species of sadness from Jhumpa Lahiri's 2003 novel The Namesake, but Sathian makes it her own. She captures not only the melancholia of the immigrant's social estrangement, but also the painful expectation that this melancholia should be worth it somehow, that one should achieve and then achieve some more. In Gold Diggers, the counterpoint of this melancholia is Neil's near-repellent helplessness. He and his circle pose a striking contrast to the image of Indian American achievement touted by both the community and the mainstream media in real life.
As the novel continues, Neil becomes the epitome of a talentless hack riding on the coattails of his parents' ambition — and his mother's gossip. His misogyny is unremarkable in his high school circle, but he doesn't fully grow out of his adolescent crassness. Later in the novel, for example, he remarks that a woman who might rate a four in Los Angeles would be an eight or nine in San Francisco. Sathian sketches Neil's character sharply, but you can recognize, in his fundamental ineptitude, the cute, entirely unthreatening lineage of Kelly Kapoor of The Office or Mindy Lahiri of The Mindy Project, both of whom felt, at the time, purpose-built to counter the lingering stereotype of the Indian American nerd. It's small wonder that Mindy Kaling is executive-producing Gold Diggers for television; Neil is very much a character in the mold of her own.
Initially, the novel's satire reminded me of Gossip Girl or You, where it's not entirely clear whether we're being presented a real critique or simply a cheerful, glossy exaltation of young sociopaths. There are characterizations that veer toward true unpleasantness — for instance, when Neil fantasizes about his neighbor Anita Dayal, dreaming in "shards" and she removes her dress to reveal a "white body, ivory skin, and dime-sized, pert nipples" and, later, when henna tattoos, also known as mehindi on the Indian subcontinent, are described as "fecal" based on what the paste looks like as it dries.
Neil has long had a crush on Anita. Their families mingled until her father left to work in California; nobody in the community wants to use the word separation, but his absence from the family becomes fodder for malicious gossip. When Neil catches Anita drinking gold, the novel picks up and takes a wonderful turn toward the slightly enchanted and allegorical.
The fantastic conceit is as follows. Anita's mother makes her drink a traditional lemonade laced with gold that her own mother had made for her brothers. It's a potion that allows the drinker to feed on the ambitions of the person to whom the gold belonged. Only gold jewelry made by the best artisans and possessed by those with energy and ambition will do for this type of magic. As Anita puts it: "[W]ho else is really, truly ambitious? This is immigrant shit."
Gold takes on multiple resonances in the novel. It's a metal that's auspicious in many, perhaps all, Indian cultures. It's the material, for instance, in a mangalsutra, a necklace that signifies the bond between a married couple. In a section of the book that travels back in time to Bombay, Anita's uncle tells her mother: "Gold […] is a wise metal. It contains people's dreams and plans." And the gold lemonade literally and metaphorically allows for the transfer of dreams and ambition, strengthening the novel's theme of secondhand desire. Only gold owned by high achievers with specific ambitions for the future is useful for drinking. In holding Anita's own hoop earrings, Neil lusts after not just her but what she represents to him: "I wondered what they — she — would taste like. If I could smelt down her powers and mysteries and take them as my own."
Gold also plays a role in a subplot involving Neil's work as an academic. Early on, Neil has an interest in history that is cultivated by his friendship with an old man, Ramesh Uncle, whom he meets at the library. Ramesh Uncle introduces him to "The Tale of the Bombayan Gold Digger," the only Hindu man of his race in the California goldfields in the summer of 1850. Neil has never recognized himself in America before, but hearing of the gold digger, he thinks,
I had never much cared about ancestry the way my parents spoke of it when we went back to India. There, ancestry meant unpronounceable names and impenetrable orthodoxies. But this gold digger felt viscerally like my forebear. What if this was my land, after all?
Ramesh Uncle tells him, too, of a gold rush in Georgia, one that takes place before the one in California. Years later, after Neil suffers consequences for stealing other people's gold, the story comes up again. And then we get to an actual gold heist in the final quarter of the book.
The heist is magnificent — canny and moving and just plain fun. Where the first half mimed the Indian American community's behavior a bit too closely, blunting the traditional tools of satire such as exaggeration or incongruity, Sathian's movement toward fantasy in the story's second half is a wise, satisfying turn. Her prose lifts off: there's a delight she takes in writing humorously about magic that shows off the scope of her immense talent.
While the novel implicitly critiques the myth of the model Asian American minority, it's not interested in how this myth is used to harm other communities in the United States. Rather, it focuses on how nonsensically this myth is deployed when society speaks of youthful Indian American achievement. This achievement is not anything inherent, the novel suggests, but rather the result of an immigrant inheritance, the gossipy stew of others' ambitions and punishing expectations. As a whole, the novel is a disturbingly accurate look at the social foibles of a particular subset of upper-middle-class Indian American — principally Hindu American — strivers. Although the first half of the book is set in Hammond Creek, it could just as easily be set in Fremont, California, or any other city with a sizable population of Hindu Americans.
The book breaks open at the midpoint, after the gang has all moved from Hammond Creek to the San Francisco Bay Area, transfiguring the earlier sitcom into something far richer. Anita gets a chance to speak as a former Miss Teen India. Her speech is full of acidic observations about how the community throws out anyone they've deemed unworthy or not good enough, something Anita has experienced firsthand because of the way Neil's mother and others had gossiped about her parents' separation. Something real and true emerges from a tone that, up to this point, has vacillated between disdain and melancholy.
I hoped Anita's speech might have ripple repercussions for what happens next in the plot, but instead it helps us to perceive Neil's distortions, his unreliability as a narrator. There's an ache not only in the speech but also in the way this moment unveils the book's firm critique of secondhand striving and cutthroat ambition. This isn't simply a fun, quippy sketch about coming of age as a "model minority."
Observing Anita, Neil recognizes himself, and if you've lived a second-generation experience, never seeing even rough answers on how to live, you might recognize yourself, too:
We were both conceptual orphans. Perhaps that is the condition of any second generation. […] We had not grown up imbibing stories that implicitly conveyed answers to the basic questions of being: What did it feel like to fall in love in America, to take oneself for granted in America? Starved as we were for clues about how to live, we would grip like mad on to anything that lent a possible way of being.
While I wouldn't have guessed it from the first half of Gold Diggers, in the end, Sanjena Sathian is a warmer writer than Thackeray. The novel resolves beautifully. Perhaps the tools of gossip and ostracism wielded by the community won't change, perhaps nothing in the world will change, but at least all is not lost for the novel's two leads, and that might be enough.
Anita Felicelli is the author of Chimerica: A Novel and Love Songs for a Lost Continent.
Anita Felicelli
Anita Felicelli is the author of Chimerica: A Novel and the short story collection Love Songs for a Lost Continent, which won the 2016 Mary Roberts Rinehart Award. Her short stories have most recently appeared in Air/Light, Alta, Midnight Breakfast, and The Massachusetts Review. Her nonfiction has appeared in the Los Angeles Review of Books, San Francisco Chronicle, The New York Times's Modern Love, Slate, Salon, and Catapult. She lives in the San Francisco Bay Area with her family.
Bomb Under the Table: On Kazuo Ishiguro's "Klara and the Sun"
Anita Felicelli reviews the new novel from Kazuo Ishiguro, "Klara and the Sun."...
College Admissions Fiction and the Asian American Teen Imaginary
Two new YA novels explore the power of meritocratic myths in Asian American life....
"This Constructed Self of Mine": On the Narrative Possibilities of Racial Melancholia
Kim Hew-Low on the ways BIPOC writers assemble their stories....
"Never Have I Ever"...Seen Myself on TV
Linde Murugan considers Mindy Kaling's funny and frustrating take on religion, nationality, race, caste, and diasporic identity....
Jhumpa Lahiri's Real America: On "The Lowland"
Urmila Seshagiri review's Jhumpa Lahiri's The Lowland (Knopf, 2013)....


From Transitional Kindergarten to Fifth Grade, Wornick offers a supportive and engaging environment to learn, and a welcoming community for all. Questions and curiosity are valued, as students develop their skills in critical thinking, creativity, communication and collaboration. Public speaking and project-based activities abound, with joyful learning happening throughout the school.
Small class sizes and small group work allow Wornick teachers to differentiate learning for students. With a focus on real world learning that is aligned with Common Core Standards, Next Generation Science Standards, and Jewish ethics and values, Wornick students emerge prepared, confident, and empathetic leaders.
Hebrew language is a core part of the curriculum. Social emotional learning, as well as opportunities in music, art, performing, and our Peleh Lab (Maker's space) round out the curriculum.
Field trips are an integral piece of the TK-5 curriculum and range from the Kindergarten trip to the SPCA to deliver Tzedakah funds they have raised to help the animals to the Third Grade trip to learn about forces and motion at Levi Stadium. Overnight study trips begin with Fourth Graders traveling back to 1855 at Camp Tawonga to immerse themselves in the Gold Rush experience - they even dress like it's 1855! The Fifth Graders embark on an overnight adventure to the Marin Headlands for five days of outdoor education.
First grader reading the story she created and illustrated.


Every summer, cycle travelers from all walks of life come through Salida. Lots of them... each with their own style and story, each with their own reasons for loading up and setting out to see the world in a peaceful perhaps dangerous, challenging but rewarding fashion. Most folk find riding a bicycle over great distances dreadful, ridiculous, impossible or plain crazy. Some people look down on them, some envy them, others live vicariously through their ride. In the peak of the season, we at Subculture Cyclery belong to the latter category; while we're up to our eyebrows with shop work, cycling travelers come and go, share a tale, a joke, show off battle scars... We geek out about their bike setups and pick their brains about equipment choice and such, yearning to soon take their place atop a big ol' bicycle saddle for days on end.
Bike travelers know how gas station coffee, half-stale potato chips, moldy cheese or a rock-hard cookie they all taste just amazing and rewarding when you've earned them through hard work and determination, perhaps obsession and stubbornness. Most people may have never experienced this but there is magic in it, magic that cannot be explained or even understood unless you partake in such endeavors yourself.
Some do it to turn the switch on, maybe to turn it off, perhaps just to push the reset button. Some do it to bond and grow, to reach, to connect. It's the ultimate way to experience the kindness of strangers.
No mirrors are made for our spirits, for our souls, but one thing is true; out there where the horizon, the road and the sky meet, as they reel you into that blanket of daydreams and wander, sometimes you can see yourself.
This is a salute to them, the self-propelled travelers.


text:
Q: Duplicated Data in 1 of my 2 gridviews when using AppendDataBoundItems I have 2 gridview called DDLTOC and DDLCase. I have inserted default values into the DDL using appenddatabounditems. My default value is ("Select Member Report ID")
<asp:DropDownList ID="DDLTOC" runat="server" style="margin-top: 0px;" OnSelectedIndexChanged="DDLTOC_SelectedIndexChanged" DataTextField="typeofcrime" DataValueField="typeofcrime" AutoPostBack="True" AppendDataBoundItems="true" >
<asp:ListItem Value="-1">Select Member Report ID</asp:ListItem>
</asp:DropDownList>

DDLCase
<asp:DropDownList ID="DDLCase" runat="server" AutoPostBack="True" DataTextField="memberreportid" DataValueField="memberreportid" Height="16px" OnSelectedIndexChanged="DDLCase_SelectedIndexChanged" AppendDataBoundItems="true" >
<asp:ListItem Value="">Select Case</asp:ListItem>
</asp:DropDownList>

I have inserted data bind into my DDLTOC at the page load which will display selected value from the database once the webapp is run.
protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack == false)
        {
            SqlConnection conn = new SqlConnection("Data Source=localhost;" +
                "Initial Catalog=project; Integrated Security = SSPI");

            SqlDataAdapter da = new SqlDataAdapter("SELECT distinct typeofcrime FROM MemberReport where handle='handled' AND caseprogress='settled'", conn);
            conn.Open();

            DataSet ds = new DataSet();
            da.Fill(ds);

            DDLTOC.DataSource = ds;
            DDLTOC.DataTextField = "typeofcrime";
            DDLTOC.DataValueField = "typeofcrime";
            DDLTOC.DataBind();

            conn.Close();

        }

    }

I also added another bind on the DDLTOC
protected void DDLTOC_SelectedIndexChanged(object sender, EventArgs e)
    {
        using (var connAdd = new SqlConnection("Data Source = localhost; Initial Catalog = project; Integrated Security= SSPI"))
        {
            connAdd.Open();

            var sql = "SELECT memberreportid FROM MemberReport Where typeofcrime ='" + DDLTOC.SelectedValue + "' AND caseprogress='settled'";
            using (var cmdAdd = new SqlDataAdapter(sql, connAdd))
            {
                DataSet ds2 = new DataSet();
                cmdAdd.Fill(ds2);

                DDLCase.DataSource = ds2;
                DDLCase.DataTextField = "memberreportid";
                DDLCase.DataValueField = "memberreportid";
                DDLCase.DataBind();

            }

            sql = "Select username, memberreportid, location, crdatetime, citizenreport, image1, image2, image3, image4, image5 from MemberReport where typeofcrime ='" + DDLTOC.SelectedItem.Text + "' and handle='handled'";
            using (var cmdAdd = new SqlDataAdapter(sql, connAdd))
            {
                DataSet dsSel = new DataSet();
                cmdAdd.Fill(dsSel);
                GVCR.DataSource = dsSel;
                GVCR.DataBind();
            }

            connAdd.Close();
        }

    }

The first binding in DDLTOC_SelectedIndex basically allows the value of DDLCase to  be displayed on the dropdownlist according to the value selected in the DDLTOC. The 2nd one binding will display out the necessary values from the database into a gridview. I have 2 database value that will be displayed out in the DDLTOC, Gang & Robbery. So if i were to randomly select gang, then select back to my default value then select gang and back to selecting default value, it will display out the Gang's DDLCase value twice on my DDLCase.
Why does repetitive data occurs?

A: Before databinding DDLCase, just clear its item collection. Modify your DDLCase databinding code portion as:
DDLCase.Items.Clear();
DDLCase.DataSource = ds2;
DDLCase.DataTextField = "memberreportid";
DDLCase.DataValueField = "memberreportid";
DDLCase.DataBind();
DDLCase.Items.Insert(0, new ListItem("Select Case", ""));
DDLCase.SelectedIndex = 0;

Alternatively you can set EnableViewState="False" in your DDLCase markup; but in that case if any other postback occurs on the page (other than DDLToc, say from a button which does not populate DDLCase again), the data of DDLCase will be lost. It is the ViewState of DDLCase which is keeping the previous state of it so that in cross requests the dropdown items are not lost. And you are just adding into its item collection unless its ViewState is disabled.

redpajama_set_name: RedPajamaStackExchange


Geospatial Holdings has announced the successful completion of several pipeline mapping projects on behalf of Sunoco Logistics Partners, which carries out numerous relocations, reroutes and rehabilitation projects to maintain its extensive network of crude oil and refined products pipelines.
(SARVER, Pa.) -- Geospatial Holdings, Inc. (OTC BB: GSPH - News), a developer and producer of technologies and services for managing underground pipeline assets, has announced the successful completion of several pipeline mapping projects on behalf of Sunoco Logistics Partners, which carries out numerous relocations, reroutes and rehabilitation projects to maintain its extensive network of crude oil and refined products pipelines.
On one recent project Geospatial employed its cutting-edge Smart Probe technology, a 3D mapping system, during a 1,200-foot-long, horizontal directional drilling (HDD) bore performed by Sunoco for a 12.75-inch-wide crude oil pipeline in Tyler, Texas. This project was part of a required utility relocation on behalf of the Texas Department of Transportation's Toll 49 Highway project. Geospatial's probe succeeded in creating an accurate direct measurement of the pipeline's centerline. The project was completed during October 2009.
Geospatial's Smart Probe technology is used in a number of underground utility industries, including oil and gas, municipal, electrical and power, telecom and industrial facilities. The probe moves through a pipeline, recording all changes in inclination, heading and velocity, and stores the information internally on the probe. The technology involves two components: an array of instruments for data collection, including accelerometers, gyroscopes and odometers; and a software package that subsequently transfers the data into a GIS database. Users accessing the database can obtain a file documenting horizontal coordinates and elevation (x, y, z) at regular intervals along the pipeline.
At the Texas worksite, the Smart Probe was attached to a nylon-braided tape and pulled through the pipe once in each direction to ensure the most accurate readings. "Sunoco validated its use of the 3D mapping process for trenchless installation and rehabilitation of its crude oil and refined products pipelines, and Geospatial's Smart Probe produced as-built plans and profiles for the project," said William Chaparro, project manager for western area pipeline relocations at Sunoco Logistics.Mark A. Smith, CEO of Geospatial Holdings added, "We view this project as a major inflection point for Geospatial. This project has established Geospatial as a trusted vendor for Sunoco, and helped pave the way for a long-term alliance between the two companies. Moreover, the project's success gives us a foothold among top-tier oil and gas companies, which we intend to leverage to attract new customers looking for help in managing their pipeline assets and infrastructure data.
For a detailed description of the entire project, please visitwww.napipelines.com/featured/2009/2009-11-feature-2.html. This article, titled "Mapping Future Pipelines: Sunoco Teams with Geospatial to Create 3D GIS Pipeline Database," appeared in the November/December 2009 edition of North American Pipelines and was written by Chaparro and Todd Porter, Vice President of Global Energy Services at Geospatial.
Geospatial Holdings (Geospatial), a Pittsburgh, Pennsylvania based company, through its wholly-owned subsidiaries is a solutions provider for the underground infrastructure industry. Using proven mapping systems technology, we successfully and accurately map XYZ centerline coordinates and create three-dimensional maps and Geographic Information System (GIS) databases. Geospatial is the exclusive provider of innovative, proprietary technologies and services throughout North America, South America and Australia.
As the number of underground systems increases and the need for replacing aging subsurface infrastructure continues, it is critical to identify the specific location of the utilities and conduits to assist in modifications, upgrades, retrofits, and replacements. Our precision technology gives our clients in the oil and gas, electric, municipal services (water and sewer), telecommunications, electrical transmission, GIS and Horizontal Directional Drilling (HDD) markets fast, cost-effective solutions, which minimize disruptions while enhancing customer satisfaction. We also offer solutions and technology to industry service providers including engineers, consultants and constructors regarding critical infrastructure issues.
For more information on Geospatial Holdings, go to www.geospatialcorporation.com.


Undoubtedly, the development of any industry will encounter the bottle neck of technical problems, especially high-tech industries such as LED display. Only when producers face up to the problem can they promote the development of the entire industry. The following Meiyad from technically aspect to analyzes the main problems of LED screens.
1. Insufficient brightness. The main advantage of LED display is the super adaptability to the complex outdoor environment. The characteristics of the outdoor environment require that the LED display should be sufficient brightness to transmit information in sunny, cloudy, rainy and snowy weather, long distance and multiple viewing angles. Brightness is used to transmit information. So brightness is the important, due to insufficient LED brightness, LEDs can only act as supporting roles in the lighting industry, mainly for decoration. This is a huge challenge for the comprehensive application of tens of thousands of LEDs.
2. LED color difference problem. There is basically no chromatic aberration problem in the application of a single LED, but if a large number of LEDs are used in combination, the chromatic aberration problem will be highlighted. Although there are techniques to improve this problem, due to the limitations of domestic technology and production level, there are still differences in the same batch of LEDs in the same color zone, and this difference is difficult to escape the eye-catching, so it is difficult to ensure the color reductive and realistic of the LED display.
3. LED display chip. True color high-resolution LED electronic display as a new display medium, with its clear image and high-performance playback capabilities, has been increasingly valued by people. For the LED display unit board, the three-primary LED dies are the core components, so high quality dies with small differences of wavelength and good intensity of luminous should be used, and this technology is mainly in the hands of world-renowned companies.
4. Heat dissipation. Because the outdoor environment temperature changes greatly, coupled with the LED display itself, it must generate a certain amount of heat. If the ambient temperature is too high and the heat is not good, it will probably cause the integrated circuit to work abnormally or even be burned, thus making the display system impossible to work normally.


text:
// Copyright 2019 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package mydump_test

import (
	"context"
	"os"
	"path/filepath"
	"testing"

	"github.com/pingcap/tidb/br/pkg/lightning/config"
	"github.com/pingcap/tidb/br/pkg/lightning/log"
	md "github.com/pingcap/tidb/br/pkg/lightning/mydump"
	"github.com/pingcap/tidb/br/pkg/storage"
	filter "github.com/pingcap/tidb/util/table-filter"
	router "github.com/pingcap/tidb/util/table-router"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

type testMydumpLoaderSuite struct {
	cfg       *config.Config
	sourceDir string
}

func newConfigWithSourceDir(sourceDir string) *config.Config {
	path, _ := filepath.Abs(sourceDir)
	return &config.Config{
		Mydumper: config.MydumperRuntime{
			SourceDir:        "file://" + filepath.ToSlash(path),
			Filter:           []string{"*.*"},
			DefaultFileRules: true,
		},
	}
}

func newTestMydumpLoaderSuite(t *testing.T) *testMydumpLoaderSuite {
	var s testMydumpLoaderSuite
	var err error
	s.sourceDir = t.TempDir()
	require.Nil(t, err)
	s.cfg = newConfigWithSourceDir(s.sourceDir)
	return &s
}

func (s *testMydumpLoaderSuite) touch(t *testing.T, filename ...string) {
	components := make([]string, len(filename)+1)
	components = append(components, s.sourceDir)
	components = append(components, filename...)
	path := filepath.Join(components...)
	err := os.WriteFile(path, nil, 0o644)
	require.Nil(t, err)
}

func (s *testMydumpLoaderSuite) mkdir(t *testing.T, dirname string) {
	path := filepath.Join(s.sourceDir, dirname)
	err := os.Mkdir(path, 0o755)
	require.Nil(t, err)
}

func TestLoader(t *testing.T) {
	ctx := context.Background()
	cfg := newConfigWithSourceDir("./not-exists")
	_, err := md.NewMyDumpLoader(ctx, cfg)
	// will check schema in tidb and data file later in DataCheck.
	require.NoError(t, err)

	cfg = newConfigWithSourceDir("./examples")
	mdl, err := md.NewMyDumpLoader(ctx, cfg)
	require.NoError(t, err)

	dbMetas := mdl.GetDatabases()
	require.Len(t, dbMetas, 1)
	dbMeta := dbMetas[0]
	require.Equal(t, "mocker_test", dbMeta.Name)
	require.Len(t, dbMeta.Tables, 4)

	expected := []struct {
		name      string
		dataFiles int
	}{
		{name: "i", dataFiles: 1},
		{name: "report_case_high_risk", dataFiles: 1},
		{name: "tbl_multi_index", dataFiles: 1},
		{name: "tbl_autoid", dataFiles: 1},
	}

	for i, table := range expected {
		assert.Equal(t, table.name, dbMeta.Tables[i].Name)
		assert.Equal(t, table.dataFiles, len(dbMeta.Tables[i].DataFiles))
	}
}

func TestEmptyDB(t *testing.T) {
	s := newTestMydumpLoaderSuite(t)
	_, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	// will check schema in tidb and data file later in DataCheck.
	require.NoError(t, err)
}

func TestDuplicatedDB(t *testing.T) {
	/*
		Path/
			a/
				db-schema-create.sql
			b/
				db-schema-create.sql
	*/
	s := newTestMydumpLoaderSuite(t)
	s.mkdir(t, "a")
	s.touch(t, "a", "db-schema-create.sql")
	s.mkdir(t, "b")
	s.touch(t, "b", "db-schema-create.sql")

	_, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	require.Regexp(t, `invalid database schema file, duplicated item - .*[/\\]db-schema-create\.sql`, err)
}

func TestTableNoHostDB(t *testing.T) {
	/*
		Path/
			notdb-schema-create.sql
			db.tbl-schema.sql
	*/
	s := newTestMydumpLoaderSuite(t)

	dir := s.sourceDir
	err := os.WriteFile(filepath.Join(dir, "notdb-schema-create.sql"), nil, 0o644)
	require.NoError(t, err)
	err = os.WriteFile(filepath.Join(dir, "db.tbl-schema.sql"), nil, 0o644)
	require.NoError(t, err)

	_, err = md.NewMyDumpLoader(context.Background(), s.cfg)
	require.NoError(t, err)
}

func TestDuplicatedTable(t *testing.T) {
	/*
		Path/
			db-schema-create.sql
			a/
				db.tbl-schema.sql
			b/
				db.tbl-schema.sql
	*/
	s := newTestMydumpLoaderSuite(t)

	s.touch(t, "db-schema-create.sql")
	s.mkdir(t, "a")
	s.touch(t, "a", "db.tbl-schema.sql")
	s.mkdir(t, "b")
	s.touch(t, "b", "db.tbl-schema.sql")

	_, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	require.Regexp(t, `invalid table schema file, duplicated item - .*db\.tbl-schema\.sql`, err)
}

func TestTableInfoNotFound(t *testing.T) {
	s := newTestMydumpLoaderSuite(t)

	s.cfg.Mydumper.CharacterSet = "auto"

	s.touch(t, "db-schema-create.sql")
	s.touch(t, "db.tbl-schema.sql")

	ctx := context.Background()
	store, err := storage.NewLocalStorage(s.sourceDir)
	require.NoError(t, err)

	loader, err := md.NewMyDumpLoader(ctx, s.cfg)
	require.NoError(t, err)
	for _, dbMeta := range loader.GetDatabases() {
		logger, buffer := log.MakeTestLogger()
		logCtx := log.NewContext(ctx, logger)
		dbSQL := dbMeta.GetSchema(logCtx, store)
		require.Equal(t, "CREATE DATABASE IF NOT EXISTS `db`", dbSQL)
		for _, tblMeta := range dbMeta.Tables {
			sql, err := tblMeta.GetSchema(logCtx, store)
			require.Equal(t, "", sql)
			require.NoError(t, err)
		}
		require.NotContains(t, buffer.Stripped(), "failed to extract table schema")
	}
}

func TestTableUnexpectedError(t *testing.T) {
	s := newTestMydumpLoaderSuite(t)
	s.touch(t, "db-schema-create.sql")
	s.touch(t, "db.tbl-schema.sql")

	ctx := context.Background()
	store, err := storage.NewLocalStorage(s.sourceDir)
	require.NoError(t, err)

	loader, err := md.NewMyDumpLoader(ctx, s.cfg)
	require.NoError(t, err)
	for _, dbMeta := range loader.GetDatabases() {
		for _, tblMeta := range dbMeta.Tables {
			sql, err := tblMeta.GetSchema(ctx, store)
			require.Equal(t, "", sql)
			require.Contains(t, err.Error(), "failed to decode db.tbl-schema.sql as : Unsupported encoding ")
		}
	}
}

func TestDataNoHostDB(t *testing.T) {
	/*
		Path/
			notdb-schema-create.sql
			db.tbl.sql
	*/
	s := newTestMydumpLoaderSuite(t)

	s.touch(t, "notdb-schema-create.sql")
	s.touch(t, "db.tbl.sql")

	_, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	// will check schema in tidb and data file later in DataCheck.
	require.NoError(t, err)
}

func TestDataNoHostTable(t *testing.T) {
	/*
		Path/
			db-schema-create.sql
			db.tbl.sql
	*/
	s := newTestMydumpLoaderSuite(t)

	s.touch(t, "db-schema-create.sql")
	s.touch(t, "db.tbl.sql")

	_, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	// will check schema in tidb and data file later in DataCheck.
	require.NoError(t, err)
}

func TestViewNoHostDB(t *testing.T) {
	/*
		Path/
			notdb-schema-create.sql
			db.tbl-schema-view.sql
	*/
	s := newTestMydumpLoaderSuite(t)

	s.touch(t, "notdb-schema-create.sql")
	s.touch(t, "db.tbl-schema-view.sql")

	_, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	require.Contains(t, err.Error(), `invalid view schema file, miss host table schema for view 'tbl'`)
}

func TestViewNoHostTable(t *testing.T) {
	/*
		Path/
			db-schema-create.sql
			db.tbl-schema-view.sql
	*/
	s := newTestMydumpLoaderSuite(t)

	s.touch(t, "db-schema-create.sql")
	s.touch(t, "db.tbl-schema-view.sql")

	_, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	require.Contains(t, err.Error(), `invalid view schema file, miss host table schema for view 'tbl'`)
}

func TestDataWithoutSchema(t *testing.T) {
	s := newTestMydumpLoaderSuite(t)

	dir := s.sourceDir
	p := filepath.Join(dir, "db.tbl.sql")
	err := os.WriteFile(p, nil, 0o644)
	require.NoError(t, err)

	mdl, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	require.NoError(t, err)
	require.Equal(t, []*md.MDDatabaseMeta{{
		Name: "db",
		SchemaFile: md.FileInfo{
			TableName: filter.Table{
				Schema: "db",
				Name:   "",
			},
			FileMeta: md.SourceFileMeta{Type: md.SourceTypeSchemaSchema},
		},
		Tables: []*md.MDTableMeta{{
			DB:           "db",
			Name:         "tbl",
			SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "db", Name: "tbl"}},
			DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "db", Name: "tbl"}, FileMeta: md.SourceFileMeta{Path: "db.tbl.sql", Type: md.SourceTypeSQL}}},
			IsRowOrdered: true,
			IndexRatio:   0.0,
		}},
	}}, mdl.GetDatabases())
}

func TestTablesWithDots(t *testing.T) {
	s := newTestMydumpLoaderSuite(t)

	s.touch(t, "db-schema-create.sql")
	s.touch(t, "db.tbl.with.dots-schema.sql")
	s.touch(t, "db.tbl.with.dots.0001.sql")
	s.touch(t, "db.0002-schema.sql")
	s.touch(t, "db.0002.sql")

	// insert some tables with file name structures which we're going to ignore.
	s.touch(t, "db.v-schema-trigger.sql")
	s.touch(t, "db.v-schema-post.sql")
	s.touch(t, "db.sql")
	s.touch(t, "db-schema.sql")

	mdl, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	require.NoError(t, err)
	require.Equal(t, []*md.MDDatabaseMeta{{
		Name:       "db",
		SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "db", Name: ""}, FileMeta: md.SourceFileMeta{Path: "db-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
		Tables: []*md.MDTableMeta{
			{
				DB:           "db",
				Name:         "0002",
				SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "db", Name: "0002"}, FileMeta: md.SourceFileMeta{Path: "db.0002-schema.sql", Type: md.SourceTypeTableSchema}},
				DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "db", Name: "0002"}, FileMeta: md.SourceFileMeta{Path: "db.0002.sql", Type: md.SourceTypeSQL}}},
				IsRowOrdered: true,
				IndexRatio:   0.0,
			},
			{
				DB:           "db",
				Name:         "tbl.with.dots",
				SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "db", Name: "tbl.with.dots"}, FileMeta: md.SourceFileMeta{Path: "db.tbl.with.dots-schema.sql", Type: md.SourceTypeTableSchema}},
				DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "db", Name: "tbl.with.dots"}, FileMeta: md.SourceFileMeta{Path: "db.tbl.with.dots.0001.sql", Type: md.SourceTypeSQL, SortKey: "0001"}}},
				IsRowOrdered: true,
				IndexRatio:   0.0,
			},
		},
	}}, mdl.GetDatabases())
}

func TestRouter(t *testing.T) {
	// route db and table but with some table not hit rules
	{
		s := newTestMydumpLoaderSuite(t)
		s.cfg.Routes = []*router.TableRule{
			{
				SchemaPattern: "a*",
				TablePattern:  "t*",
				TargetSchema:  "b",
				TargetTable:   "u",
			},
		}

		s.touch(t, "a0-schema-create.sql")
		s.touch(t, "a0.t0-schema.sql")
		s.touch(t, "a0.t0.1.sql")
		s.touch(t, "a0.t1-schema.sql")
		s.touch(t, "a0.t1.1.sql")

		s.touch(t, "a1-schema-create.sql")
		s.touch(t, "a1.s1-schema.sql")
		s.touch(t, "a1.s1.1.sql")
		s.touch(t, "a1.t2-schema.sql")
		s.touch(t, "a1.t2.1.sql")

		s.touch(t, "a1.v1-schema.sql")
		s.touch(t, "a1.v1-schema-view.sql")

		mdl, err := md.NewMyDumpLoader(context.Background(), s.cfg)
		require.NoError(t, err)
		dbs := mdl.GetDatabases()
		// hit rules: a0.t0 -> b.u, a0.t1 -> b.0, a1.t2 -> b.u
		// not hit: a1.s1, a1.v1
		expectedDBS := []*md.MDDatabaseMeta{
			{
				Name:       "a0",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "a0", Name: ""}, FileMeta: md.SourceFileMeta{Path: "a0-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
			},
			{
				Name:       "a1",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "a1", Name: ""}, FileMeta: md.SourceFileMeta{Path: "a1-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
				Tables: []*md.MDTableMeta{
					{
						DB:           "a1",
						Name:         "s1",
						SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "a1", Name: "s1"}, FileMeta: md.SourceFileMeta{Path: "a1.s1-schema.sql", Type: md.SourceTypeTableSchema}},
						DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "a1", Name: "s1"}, FileMeta: md.SourceFileMeta{Path: "a1.s1.1.sql", Type: md.SourceTypeSQL, SortKey: "1"}}},
						IndexRatio:   0.0,
						IsRowOrdered: true,
					},
					{
						DB:           "a1",
						Name:         "v1",
						SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "a1", Name: "v1"}, FileMeta: md.SourceFileMeta{Path: "a1.v1-schema.sql", Type: md.SourceTypeTableSchema}},
						DataFiles:    []md.FileInfo{},
						IndexRatio:   0.0,
						IsRowOrdered: true,
					},
				},
				Views: []*md.MDTableMeta{
					{
						DB:           "a1",
						Name:         "v1",
						SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "a1", Name: "v1"}, FileMeta: md.SourceFileMeta{Path: "a1.v1-schema-view.sql", Type: md.SourceTypeViewSchema}},
						IndexRatio:   0.0,
						IsRowOrdered: true,
					},
				},
			},
			{
				Name:       "b",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "b", Name: ""}, FileMeta: md.SourceFileMeta{Path: "a0-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
				Tables: []*md.MDTableMeta{
					{
						DB:         "b",
						Name:       "u",
						SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "b", Name: "u"}, FileMeta: md.SourceFileMeta{Path: "a0.t0-schema.sql", Type: md.SourceTypeTableSchema}},
						DataFiles: []md.FileInfo{
							{TableName: filter.Table{Schema: "b", Name: "u"}, FileMeta: md.SourceFileMeta{Path: "a0.t0.1.sql", Type: md.SourceTypeSQL, SortKey: "1"}},
							{TableName: filter.Table{Schema: "b", Name: "u"}, FileMeta: md.SourceFileMeta{Path: "a0.t1.1.sql", Type: md.SourceTypeSQL, SortKey: "1"}},
							{TableName: filter.Table{Schema: "b", Name: "u"}, FileMeta: md.SourceFileMeta{Path: "a1.t2.1.sql", Type: md.SourceTypeSQL, SortKey: "1"}},
						},
						IndexRatio:   0.0,
						IsRowOrdered: true,
					},
				},
			},
		}
		require.Equal(t, expectedDBS, dbs)
	}

	// only route schema but with some db not hit rules
	{
		s := newTestMydumpLoaderSuite(t)
		s.cfg.Routes = []*router.TableRule{
			{
				SchemaPattern: "c*",
				TargetSchema:  "c",
			},
		}
		s.touch(t, "c0-schema-create.sql")
		s.touch(t, "c0.t3-schema.sql")
		s.touch(t, "c0.t3.1.sql")

		s.touch(t, "d0-schema-create.sql")
		mdl, err := md.NewMyDumpLoader(context.Background(), s.cfg)
		require.NoError(t, err)
		dbs := mdl.GetDatabases()
		// hit rules: c0.t3 -> c.t3
		// not hit: d0
		expectedDBS := []*md.MDDatabaseMeta{
			{
				Name:       "d0",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "d0", Name: ""}, FileMeta: md.SourceFileMeta{Path: "d0-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
			},
			{
				Name:       "c",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "c", Name: ""}, FileMeta: md.SourceFileMeta{Path: "c0-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
				Tables: []*md.MDTableMeta{
					{
						DB:           "c",
						Name:         "t3",
						SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "c", Name: "t3"}, FileMeta: md.SourceFileMeta{Path: "c0.t3-schema.sql", Type: md.SourceTypeTableSchema}},
						DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "c", Name: "t3"}, FileMeta: md.SourceFileMeta{Path: "c0.t3.1.sql", Type: md.SourceTypeSQL, SortKey: "1"}}},
						IndexRatio:   0.0,
						IsRowOrdered: true,
					},
				},
			},
		}
		require.Equal(t, expectedDBS, dbs)
	}

	// route schema and table but not have table data
	{
		s := newTestMydumpLoaderSuite(t)
		s.cfg.Routes = []*router.TableRule{
			{
				SchemaPattern: "e*",
				TablePattern:  "f*",
				TargetSchema:  "v",
				TargetTable:   "vv",
			},
		}
		s.touch(t, "e0-schema-create.sql")
		s.touch(t, "e0.f0-schema.sql")
		s.touch(t, "e0.f0-schema-view.sql")

		mdl, err := md.NewMyDumpLoader(context.Background(), s.cfg)
		require.NoError(t, err)
		dbs := mdl.GetDatabases()
		// hit rules: e0.f0 -> v.vv
		expectedDBS := []*md.MDDatabaseMeta{
			{
				Name:       "e0",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "e0", Name: ""}, FileMeta: md.SourceFileMeta{Path: "e0-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
			},
			{
				Name:       "v",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "v", Name: ""}, FileMeta: md.SourceFileMeta{Path: "e0-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
				Tables: []*md.MDTableMeta{
					{
						DB:           "v",
						Name:         "vv",
						SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "v", Name: "vv"}, FileMeta: md.SourceFileMeta{Path: "e0.f0-schema.sql", Type: md.SourceTypeTableSchema}},
						DataFiles:    []md.FileInfo{},
						IndexRatio:   0.0,
						IsRowOrdered: true,
					},
				},
				Views: []*md.MDTableMeta{
					{
						DB:           "v",
						Name:         "vv",
						SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "v", Name: "vv"}, FileMeta: md.SourceFileMeta{Path: "e0.f0-schema-view.sql", Type: md.SourceTypeViewSchema}},
						IndexRatio:   0.0,
						IsRowOrdered: true,
					},
				},
			},
		}
		require.Equal(t, expectedDBS, dbs)
	}

	// route by regex
	{
		s := newTestMydumpLoaderSuite(t)
		s.cfg.Routes = []*router.TableRule{
			{
				SchemaPattern: "~.*regexpr[1-9]+",
				TablePattern:  "~.*regexprtable",
				TargetSchema:  "downstream_db",
				TargetTable:   "downstream_table",
			},
			{
				SchemaPattern: "~.bdb.*",
				TargetSchema:  "db",
			},
		}

		s.touch(t, "test_regexpr1-schema-create.sql")
		s.touch(t, "test_regexpr1.test_regexprtable-schema.sql")
		s.touch(t, "test_regexpr1.test_regexprtable.1.sql")

		s.touch(t, "zbdb-schema-create.sql")
		s.touch(t, "zbdb.table-schema.sql")
		s.touch(t, "zbdb.table.1.sql")

		mdl, err := md.NewMyDumpLoader(context.Background(), s.cfg)
		require.NoError(t, err)
		dbs := mdl.GetDatabases()
		// hit rules: test_regexpr1.test_regexprtable -> downstream_db.downstream_table, zbdb.table -> db.table
		expectedDBS := []*md.MDDatabaseMeta{
			{
				Name:       "test_regexpr1",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "test_regexpr1", Name: ""}, FileMeta: md.SourceFileMeta{Path: "test_regexpr1-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
			},
			{
				Name:       "db",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "db", Name: ""}, FileMeta: md.SourceFileMeta{Path: "zbdb-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
				Tables: []*md.MDTableMeta{
					{
						DB:           "db",
						Name:         "table",
						SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "db", Name: "table"}, FileMeta: md.SourceFileMeta{Path: "zbdb.table-schema.sql", Type: md.SourceTypeTableSchema}},
						DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "db", Name: "table"}, FileMeta: md.SourceFileMeta{Path: "zbdb.table.1.sql", Type: md.SourceTypeSQL, SortKey: "1"}}},
						IndexRatio:   0.0,
						IsRowOrdered: true,
					},
				},
			},
			{
				Name:       "downstream_db",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "downstream_db", Name: ""}, FileMeta: md.SourceFileMeta{Path: "test_regexpr1-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
				Tables: []*md.MDTableMeta{
					{
						DB:           "downstream_db",
						Name:         "downstream_table",
						SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "downstream_db", Name: "downstream_table"}, FileMeta: md.SourceFileMeta{Path: "test_regexpr1.test_regexprtable-schema.sql", Type: md.SourceTypeTableSchema}},
						DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "downstream_db", Name: "downstream_table"}, FileMeta: md.SourceFileMeta{Path: "test_regexpr1.test_regexprtable.1.sql", Type: md.SourceTypeSQL, SortKey: "1"}}},
						IndexRatio:   0.0,
						IsRowOrdered: true,
					},
				},
			},
		}
		require.Equal(t, expectedDBS, dbs)
	}

	// only route db and only route some tables
	{
		s := newTestMydumpLoaderSuite(t)
		s.cfg.Routes = []*router.TableRule{
			// only route schema
			{
				SchemaPattern: "web",
				TargetSchema:  "web_test",
			},
			// only route one table
			{
				SchemaPattern: "x",
				TablePattern:  "t1*",
				TargetSchema:  "x2",
				TargetTable:   "t",
			},
		}

		s.touch(t, "web-schema-create.sql")
		s.touch(t, "x-schema-create.sql")
		s.touch(t, "x.t10-schema.sql") // hit rules, new name is x2.t
		s.touch(t, "x.t20-schema.sql") // not hit rules, name is x.t20

		mdl, err := md.NewMyDumpLoader(context.Background(), s.cfg)
		require.NoError(t, err)
		dbs := mdl.GetDatabases()
		// hit rules: web -> web_test, x.t10 -> x2.t
		// not hit: x.t20
		expectedDBS := []*md.MDDatabaseMeta{
			{
				Name:       "x",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "x", Name: ""}, FileMeta: md.SourceFileMeta{Path: "x-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
				Tables: []*md.MDTableMeta{
					{
						DB:           "x",
						Name:         "t20",
						SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "x", Name: "t20"}, FileMeta: md.SourceFileMeta{Path: "x.t20-schema.sql", Type: md.SourceTypeTableSchema}},
						IndexRatio:   0.0,
						IsRowOrdered: true,
						DataFiles:    []md.FileInfo{},
					},
				},
			},
			{
				Name:       "web_test",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "web_test", Name: ""}, FileMeta: md.SourceFileMeta{Path: "web-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
			},
			{
				Name:       "x2",
				SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "x2", Name: ""}, FileMeta: md.SourceFileMeta{Path: "x-schema-create.sql", Type: md.SourceTypeSchemaSchema}},
				Tables: []*md.MDTableMeta{
					{
						DB:           "x2",
						Name:         "t",
						SchemaFile:   md.FileInfo{TableName: filter.Table{Schema: "x2", Name: "t"}, FileMeta: md.SourceFileMeta{Path: "x.t10-schema.sql", Type: md.SourceTypeTableSchema}},
						IndexRatio:   0.0,
						IsRowOrdered: true,
						DataFiles:    []md.FileInfo{},
					},
				},
			},
		}
		require.Equal(t, expectedDBS, dbs)
	}
}

func TestBadRouterRule(t *testing.T) {
	s := newTestMydumpLoaderSuite(t)

	s.cfg.Routes = []*router.TableRule{{
		SchemaPattern: "a*b",
		TargetSchema:  "ab",
	}}

	s.touch(t, "a1b-schema-create.sql")

	_, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	require.Regexp(t, `.*pattern a\*b not valid`, err.Error())
}

func TestFileRouting(t *testing.T) {
	s := newTestMydumpLoaderSuite(t)

	s.cfg.Mydumper.DefaultFileRules = false
	s.cfg.Mydumper.FileRouters = []*config.FileRouteRule{
		{
			Pattern: `(?i)^(?:[^./]*/)*([a-z0-9_]+)/schema\.sql$`,
			Schema:  "$1",
			Type:    "schema-schema",
		},
		{
			Pattern: `(?i)^(?:[^./]*/)*([a-z0-9]+)/([a-z0-9_]+)-table\.sql$`,
			Schema:  "$1",
			Table:   "$2",
			Type:    "table-schema",
		},
		{
			Pattern: `(?i)^(?:[^./]*/)*([a-z0-9]+)/([a-z0-9_]+)-view\.sql$`,
			Schema:  "$1",
			Table:   "$2",
			Type:    "view-schema",
		},
		{
			Pattern: `(?i)^(?:[^./]*/)*([a-z][a-z0-9_]*)/([a-z]+)[0-9]*(?:\.([0-9]+))?\.(sql|csv)$`,
			Schema:  "$1",
			Table:   "$2",
			Type:    "$4",
		},
		{
			Pattern: `^(?:[^./]*/)*([a-z]+)(?:\.([0-9]+))?\.(sql|csv)$`,
			Schema:  "d2",
			Table:   "$1",
			Type:    "$3",
		},
	}

	s.mkdir(t, "d1")
	s.mkdir(t, "d2")
	s.touch(t, "d1/schema.sql")
	s.touch(t, "d1/test-table.sql")
	s.touch(t, "d1/test0.sql")
	s.touch(t, "d1/test1.sql")
	s.touch(t, "d1/test2.001.sql")
	s.touch(t, "d1/v1-table.sql")
	s.touch(t, "d1/v1-view.sql")
	s.touch(t, "d1/t1-schema-create.sql")
	s.touch(t, "d2/schema.sql")
	s.touch(t, "d2/abc-table.sql")
	s.touch(t, "abc.1.sql")

	mdl, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	require.NoError(t, err)
	require.Equal(t, []*md.MDDatabaseMeta{
		{
			Name:       "d1",
			SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "d1", Name: ""}, FileMeta: md.SourceFileMeta{Path: filepath.FromSlash("d1/schema.sql"), Type: md.SourceTypeSchemaSchema}},
			Tables: []*md.MDTableMeta{
				{
					DB:   "d1",
					Name: "test",
					SchemaFile: md.FileInfo{
						TableName: filter.Table{Schema: "d1", Name: "test"},
						FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("d1/test-table.sql"), Type: md.SourceTypeTableSchema},
					},
					DataFiles: []md.FileInfo{
						{
							TableName: filter.Table{Schema: "d1", Name: "test"},
							FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("d1/test0.sql"), Type: md.SourceTypeSQL},
						},
						{
							TableName: filter.Table{Schema: "d1", Name: "test"},
							FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("d1/test1.sql"), Type: md.SourceTypeSQL},
						},
						{
							TableName: filter.Table{Schema: "d1", Name: "test"},
							FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("d1/test2.001.sql"), Type: md.SourceTypeSQL},
						},
					},
					IndexRatio:   0.0,
					IsRowOrdered: true,
				},
				{
					DB:   "d1",
					Name: "v1",
					SchemaFile: md.FileInfo{
						TableName: filter.Table{Schema: "d1", Name: "v1"},
						FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("d1/v1-table.sql"), Type: md.SourceTypeTableSchema},
					},
					DataFiles:    []md.FileInfo{},
					IndexRatio:   0.0,
					IsRowOrdered: true,
				},
			},
			Views: []*md.MDTableMeta{
				{
					DB:   "d1",
					Name: "v1",
					SchemaFile: md.FileInfo{
						TableName: filter.Table{Schema: "d1", Name: "v1"},
						FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("d1/v1-view.sql"), Type: md.SourceTypeViewSchema},
					},
					IndexRatio:   0.0,
					IsRowOrdered: true,
				},
			},
		},
		{
			Name:       "d2",
			SchemaFile: md.FileInfo{TableName: filter.Table{Schema: "d2", Name: ""}, FileMeta: md.SourceFileMeta{Path: filepath.FromSlash("d2/schema.sql"), Type: md.SourceTypeSchemaSchema}},
			Tables: []*md.MDTableMeta{
				{
					DB:   "d2",
					Name: "abc",
					SchemaFile: md.FileInfo{
						TableName: filter.Table{Schema: "d2", Name: "abc"},
						FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("d2/abc-table.sql"), Type: md.SourceTypeTableSchema},
					},
					DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "d2", Name: "abc"}, FileMeta: md.SourceFileMeta{Path: "abc.1.sql", Type: md.SourceTypeSQL}}},
					IndexRatio:   0.0,
					IsRowOrdered: true,
				},
			},
		},
	}, mdl.GetDatabases())
}

func TestInputWithSpecialChars(t *testing.T) {
	/*
		Path/
			test-schema-create.sql
			test.t%22-schema.sql
			test.t%22.0.sql
			test.t%2522-schema.sql
			test.t%2522.0.csv
			test.t%gg-schema.sql
			test.t%gg.csv
			test.t+gg-schema.sql
			test.t+gg.csv

			db%22.t%2522-schema.sql
			db%22.t%2522.0.csv
	*/
	s := newTestMydumpLoaderSuite(t)

	s.touch(t, "test-schema-create.sql")
	s.touch(t, "test.t%22-schema.sql")
	s.touch(t, "test.t%22.sql")
	s.touch(t, "test.t%2522-schema.sql")
	s.touch(t, "test.t%2522.csv")
	s.touch(t, "test.t%gg-schema.sql")
	s.touch(t, "test.t%gg.csv")
	s.touch(t, "test.t+gg-schema.sql")
	s.touch(t, "test.t+gg.csv")

	s.touch(t, "db%22-schema-create.sql")
	s.touch(t, "db%22.t%2522-schema.sql")
	s.touch(t, "db%22.t%2522.0.csv")

	mdl, err := md.NewMyDumpLoader(context.Background(), s.cfg)
	require.NoError(t, err)
	require.Equal(t, []*md.MDDatabaseMeta{
		{
			Name:       `db"`,
			SchemaFile: md.FileInfo{TableName: filter.Table{Schema: `db"`, Name: ""}, FileMeta: md.SourceFileMeta{Path: filepath.FromSlash("db%22-schema-create.sql"), Type: md.SourceTypeSchemaSchema}},
			Tables: []*md.MDTableMeta{
				{
					DB:   `db"`,
					Name: "t%22",
					SchemaFile: md.FileInfo{
						TableName: filter.Table{Schema: `db"`, Name: "t%22"},
						FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("db%22.t%2522-schema.sql"), Type: md.SourceTypeTableSchema},
					},
					DataFiles: []md.FileInfo{
						{
							TableName: filter.Table{Schema: `db"`, Name: "t%22"},
							FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("db%22.t%2522.0.csv"), Type: md.SourceTypeCSV, SortKey: "0"},
						},
					},
					IndexRatio:   0,
					IsRowOrdered: true,
				},
			},
		},
		{
			Name:       "test",
			SchemaFile: md.FileInfo{TableName: filter.Table{Schema: `test`, Name: ""}, FileMeta: md.SourceFileMeta{Path: filepath.FromSlash("test-schema-create.sql"), Type: md.SourceTypeSchemaSchema}},
			Tables: []*md.MDTableMeta{
				{
					DB:   "test",
					Name: `t"`,
					SchemaFile: md.FileInfo{
						TableName: filter.Table{Schema: "test", Name: `t"`},
						FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("test.t%22-schema.sql"), Type: md.SourceTypeTableSchema},
					},
					DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "test", Name: `t"`}, FileMeta: md.SourceFileMeta{Path: "test.t%22.sql", Type: md.SourceTypeSQL}}},
					IndexRatio:   0,
					IsRowOrdered: true,
				},
				{
					DB:   "test",
					Name: "t%22",
					SchemaFile: md.FileInfo{
						TableName: filter.Table{Schema: "test", Name: "t%22"},
						FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("test.t%2522-schema.sql"), Type: md.SourceTypeTableSchema},
					},
					DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "test", Name: "t%22"}, FileMeta: md.SourceFileMeta{Path: "test.t%2522.csv", Type: md.SourceTypeCSV}}},
					IndexRatio:   0,
					IsRowOrdered: true,
				},
				{
					DB:   "test",
					Name: "t%gg",
					SchemaFile: md.FileInfo{
						TableName: filter.Table{Schema: "test", Name: "t%gg"},
						FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("test.t%gg-schema.sql"), Type: md.SourceTypeTableSchema},
					},
					DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "test", Name: "t%gg"}, FileMeta: md.SourceFileMeta{Path: "test.t%gg.csv", Type: md.SourceTypeCSV}}},
					IndexRatio:   0,
					IsRowOrdered: true,
				},
				{
					DB:   "test",
					Name: "t+gg",
					SchemaFile: md.FileInfo{
						TableName: filter.Table{Schema: "test", Name: "t+gg"},
						FileMeta:  md.SourceFileMeta{Path: filepath.FromSlash("test.t+gg-schema.sql"), Type: md.SourceTypeTableSchema},
					},
					DataFiles:    []md.FileInfo{{TableName: filter.Table{Schema: "test", Name: "t+gg"}, FileMeta: md.SourceFileMeta{Path: "test.t+gg.csv", Type: md.SourceTypeCSV}}},
					IndexRatio:   0,
					IsRowOrdered: true,
				},
			},
		},
	}, mdl.GetDatabases())
}

redpajama_set_name: RedPajamaGithub


text:
Sept / Oct 2018 \ What are Orphaned Wells and Where Can We Find Them?
What are Orphaned Wells and Where Can We Find Them?
By Tim Brown, County Information Senior Analyst
What happens when an oil or gas well stops producing, when it reaches the end of its economic life? Studies have shown that unattended wells can leak methane and other contaminants into groundwater and create other environmental problems according to the Wall Street Journal. To prevent this from happening, the well must be plugged, which typically involves pulling out leftover drilling equipment and filling in the hole with absorbent materials like bentonite (a type of clay) and then capping the well with cement. But, plugging costs can range from several thousand dollars to tens of thousands per well.1
State law requires all oil and gas well operators to post a bond, letter of credit or cash deposit — which the Railroad Commission of Texas (Commission) will collect if operators abandon a well — if they can no longer legally produce or sell oil and gas.2
While the well operators should plug the well, sometimes this does not happen. Particularly near the end of an oil or gas boom, companies often go bankrupt or simply abandon the wells for financial reasons. As a result, the state often ends up holding the bag as the payor of last resort.3
However, the bonds do not cover the full cost of plugging the wells. Last year, the Sunset Commission found that bonds and other sureties covered only 15.9 percent of the cost of plugging abandoned wells. Their June 2017 report noted that in 2016, the Railroad Commission spent $11,772,895 plugging 692 wells — spending $17,012 per well. Of that amount, approximately $7 million came from sources other than the bonds. The report also noted that, "With a backlog of 9,715 abandoned wells, the Railroad Commission could be on the hook to pay more than $165 million to plug all of those wells."4 To deal with this issue, the Sunset Commission recommended an increase in statutory bonding requirements sufficient "to better reflect risk and increase equitability."
Texas created the Oil and Gas Regulation and Cleanup (OGRC) Fund for this purpose during the 82nd Legislature in 2011, replacing previous well-plugging funds. The Railroad Commission maintains a list (http://www.rrc.state.tx.us/oil-gas/environmental-cleanup-programs/state-managed-plugging) of orphaned oil wells and gas wells (orphan wells) waiting to be plugged with state funds including, but not limited to OGRC funds.5
The Railroad Commission defines orphaned oil wells as "inactive, non-compliant wells that have been inactive for at least 12 months and the responsible operator's Organizational Report (Form P-5) has been delinquent for greater than 12 months."
The Railroad Commission's "Oilfield Cleanup Program Annual Report for Fiscal Year 2017" (http://www.rrc.state.tx.us/media/43931/ofcu-program-annual-report-2017.pdf) noted the presence of 5,687 orphaned wells as of August 31, 2017. The report notes that the operators of record plug most of the compliant inactive wells and many of the non-compliant inactive wells; however, some number of the compliant and many of the orphan wells will be plugged by the Railroad Commission using OGRC funds as well as other state and/or federal funds.6
However, the Railroad Commission modified the definition of orphan wells effective September 2016 in Statewide Rule (SWR) 14(b)2. Consequently, comparing the current number of orphan wells to the number of such wells prior to that date is not straightforward. For example, the Railroad Commission notes in the "Oilfield Cleanup Program Annual Report for Fiscal Year 2016" a count of 10,161 orphan wells for August 2016 under the prior definition, but only 6,805 orphan wells in September 2016 using their new definition.7
Since then, the count fell to 5,687 orphan wells in August 2017, before increasing to 6,494 by June 2018.
Map 1 (above) shows the total number of orphaned oil and gas wells by county as of June 2018. The semi-transparent overlay shows the location of tight gas basins across the state as of 2015 according to the U.S. Energy Information Agency. These basins cover a much broader area than the current shale plays, but line up well with the counties that have orphan wells.
Not all orphaned wells are captured on these maps. The June 2018 list includes 69 orphaned wells in the Gulf of Mexico. These wells can be found in: Matagorda Island SB (3), Brazos LB (29), High Island LB (9), High Island SB (11), Matagorda Island LB (6), Mustang Island LB (9), and Mustang Island SB (2). For more information on where these areas located, see the Railroad Commission's online map, "Texas Coastal Counties, Offshore and Bay Areas, Oil and Gas Division Districts."8
In many cases, the orphan wells have been inactive far longer than 12 months. The June 2018 list of orphan wells includes 1,617 wells that have been inactive for 246 months. To put that into perspective, the Petrohawk Energy Corporation (now part of BHP Billiton) drilled the initial Eagle Ford Shale discovery well in 2008 in La Salle County. Petrohawk announced their findings in October 2008, a mere 116 months prior to June 2018.9
Map 2 (above) shows the location of wells that have been orphaned for more than ten years which is 120 months or four months longer than the Eagle Ford has been producing. To make this map easier to read, it does not include the basin overlay. Also, note that the brackets, which were adjusted due to the relatively smaller number of old orphan wells, differ from those used in the first map.
For June 2018, the Commission's list included 3,504 wells orphaned for more than 120 months. Of those, 35 were located offshore in the Gulf areas previously mentioned.
The Sunset Commission estimated the Railroad Commission's liability for 9,715 abandoned oil and gas wells to be as much as $165 million. With the change in definition for orphaned wells, that number appears lower with only 6,494 orphaned wells as of June 2018 – a difference of 3,221 wells. Still, even if we assume those 3,221 wells are not a threat to either our pocketbooks or our environment, that remains a large number of wells that need to be plugged – each of them potentially contaminating our water and air for years.
1. "What to Know about Orphaned Wells," Wall Street Journal, February 25, 2015, accessed August 1, 2018, https://blogs.wsj.com/briefly/2015/02/25/what-to-know-about-orphaned-wells-the-short-answer.
2. §§ 91.103, 91.104, 91.1041, 91.1042, and 91.105, Texas Natural Resource Code.
3. "What to Know About Orphaned Wells."
4. Staff Report with Final Results, Railroad Commission of Texas, Sunset Advisory Commission, June 2017, 44, accessed August 1, 2018, https://www.sunset.texas.gov/public/uploads/files/reports/Railroad%20Commissio%20of%20Texas%20Staff%20Report%20with%20Final%20Results_6-21-17.pdf.
5. "State Managed Plugging," Railroad Commission of Texas, last updated July 9, 2018, accessed July 31, 2018, http://www.rrc.state.tx.us/oil-gas/environmental-cleanup-programs/state-managed-plugging.
6. Oilfield Cleanup Program Annual Report for Fiscal Year 2017, Railroad Commission of Texas, January 23, 2018, accessed July 31, 2018,
http://www.rrc.state.tx.us/media/43931/ofcu-program-annual-report-2017.pdf.
7. Oilfield Cleanup Program Annual Report for Fiscal Year 2016, Railroad Commission of Texas, December 6, 2016, accessed July 31, 2018,
http://www.rrc.state.tx.us/media/37219/ogrc-annual-report-2016.pdf.
8. "Texas Coastal Counties, Offshore and Bay Areas, Oil and Gas Division Districts," Railroad Commission of Texas, accessed July 31, 2018,
http://www.rrc.state.tx.us/media/8992/cty_coast_offshore.pdf.
9. Petrohawk Energy Corporation, "Petrohawk Discovers Shale Gas Field in South Texas," Rigzone, October 21, 2008, accessed August 1, 2018, https://www.rigzone.com/news/oil_gas/a/68125/petrohawk_discovers_shale_gas_field_in_south_texas.

redpajama_set_name: RedPajamaCommonCrawl


'Due to a sudden industrial situation at Mumbai airport by AIATSL employees, some flights have got delayed. We are assessing the situation and all efforts are being made to minimise delays or disruption,' an airline spokesperson said.
"Some AIATSL employees at the Mumbai airport are on strike since Wednesday-Thursday (intervening) night over non-payment of Diwali Bonus, leading to disruption in services. These employees, however, are on contract," news agency PTI quoted an official as saying.
'Only early morning flights from Mumbai for delayed by 2 hours,' the airline had said.


text:
10 of the Most Exciting Stunts in Film History
By Alison Nastasi
World-class stuntman Vic Armstrong has lived as Indiana Jones, James Bond, Superman, and other epic cinema heroes throughout his career. He's worked closely with the action icons many of us grew up with on the big screen, and the stuntman has risked his life countless times to perfect the unforgettable scenes that have replayed in our collective movie memory for decades.
Armstrong's new book — The True Adventures of the World's Greatest Stuntman , a wild ride through the death-defying maestro's career — hits shelves on May 29. It's a reminder that some of the greatest talents in Hollywood are those behind the scenes and not mugging for the camera.
We wanted Armstrong's expert input on some of cinema's most exciting action stunts, and he was kind enough to share his thoughts about 10 different scenes. Head past the break where we dig up a few thrilling moments in action movie history, and drop your favorites below.
Supercop
Vic Armstrong: "Supercop is a very well shot piece of action… it is superbly shot, edited, and performed, and quite a risk looks to have been taken by the stunt rider."
Before Angelina Jolie's Tomb Raider or Salt, Michelle Yeoh proved women could be incredible action performers in 1992's Supercop. The actress played a police officer who matches action icon Jackie Chan note for note and steals the show during one impressive scene where she rides a motorcycle up a ramp, into the air, and onto the roof of a moving train. Yeoh performed all her own stunts in the film, all of them extremely dangerous.
While we don't think it's worth risking life and limb for a great shot, there's something to be admired about Hong Kong stuntworkers and coordinators who perform perilous acts, that while often absolutely thrilling and stunning, could cost them their life. That's dedication — and something you don't really see in Hollywood due to strict regulations and union codes.
Vic Armstrong: "This stunt on Raiders of the Lost Ark is superbly performed by Terry Leonard and directed by action unit director Mickey Moore. Terry had tried to perform this stunt before on the Legend of the Lone Ranger and it went badly wrong, and Terry's legs were run over by the stage coach. I used to run every day in Tunisia as part of Terry's rehab when we were working on Raiders. The original, though, is still the most amazingly dangerous stunt of them all performed by Yakima Canutt on Stagecoach."
As Vic shares, Steven Spielberg's Raiders modeled this famous scene after a stunt performed in the 1939 film Stagecoach starring John Wayne. It remains one of the greatest ever performed.
Vic Armstrong: "Jackie Chan is the master of comedy and action superbly mixed, and is the most original choreographer in the business today. I don't think this clip of Police Story does justice to his athletic ability and originality."
The 1985 Hong Kong martial arts comedy features many grand action scenes, but the most remembered is the climactic mall chase. After Jackie Chan's character defeats everyone around him inside a shopping mall, he leaps off the top floor and latches onto a pole wrapped in light bulbs. Then, he slides down, smashing them along the way, crashing through a glass ceiling, and eventually reaches the floor below. Chan suffered real-life burns on his hands, hurt his back, and dislocated his pelvis for the scene.
Steamboat Bill, Jr.
Vic Armstrong: "Buster Keaton in Steamboat Bill (and many, many other movies) is one of my favourite stunts. It was so original and extremely dangerous, and marked for me the beginning of carefully planned, calculated, original stunts that were performed with a lot of imagination and trust. They combined efforts and many departments on the film set, which is what the stunt business has become nowadays."
Although not as showy as some of the stunts featured on our list, the precision and danger involved in Buster Keaton's Steamboat Bill, Jr. feat make it a standout. He performed the stunt alone with no hidden tricks. The building façade is full-size and all real. Had Keaton stood an inch off his mark, he would have been crushed.
Vic Armstrong: "For me Ben-Hur is the ultimate action sequence, superbly conceived and directed by Yakima Canutt, incredible stunts performed by [his son] Joe Canutt, and many others. The forethought and preparation that went into this sequence is monumental. Someone had tried to shoot the sequence before Yak for less money, and it was a disaster. Yak had to rebuild the whole track surface, then he had to buy all the horses and train them and the actors to drive them, and then he had to shoot it — the ultimate "putting the money where his mouth was." It is a fantastic sequence that could never be repeated."
The famous stunt in question pops up around halfway through the chariot race, where Ben-Hur is practically crushed against the wall, headed straight for the wreckage of a fallen chariot. Stunt performer Joe Canutt had to leap over the smashed vehicle, which propels him over the front of his chariot. He barely makes it, but manages to climb back up in his seat. The entire scene was unplanned and near fatal. Watch it here.
Vic Artmstrong: "This sequence in The Spy Who Loved Me is the best opening sequence ever in a Bond film. I saw it when I was shooting a movie in Israel and will never forget the effect it had on me and the audience. It is an extremely dangerous stunt to perform and an extremely difficult stunt to photograph, and needed patience and nerves of steel from everyone involved to achieve — but most of all it was original."
Stuntman Rick Sylvester almost didn't survive his ski jump stunt in 1977 Bond classic The Spy Who Loved Me. After a chase down the hill, Sylvester made the epic leap, but a disengaged ski prevented his parachute from opening. Luckily it all turned out ok and brings a lot of nail-biting tension to the scene.
Vic Armstrong: "Death Proof is a nice car chase with an original, sexy edge to it performed by the 'real people' acting in it. It has a great double car jump and T-bone crash at the end. There are better car chases out there, though."
We agree that there are more classic car chases out there, but Zoë Bell is one of the best stuntpeople working today, and her ongoing collaboration with Quentin Tarantino is always highly anticipated.
Everything Tony Jaa does in Ong-bak
Vic Armstrong: "Ong-bak is one of my favorite fight movies. Tony Jaa is a friend of mine as is his stunt coordinator Kawee Sirikhanerut (Seng). In fact, I took Seng to New York to work on Salt with me. Muay Thai is a brilliant style of fighting for the movie business and these boys do it better than anybody. They are very close behind Jackie Chan in originality. More successes and bigger budgets will allow them to overtake Jackie in that respect."
Master fighter Tony Jaa gets chased by gangsters throughout Bangkok performing incredibly dangerous feats — including the insane fire fight, which burned his face. He also jumps through a mass of barbed wire without falling into the vats of hot oil below — or spearing himself — before leaping over cars and finishing with one of his gymnastic splits.
Vic Armstrong: "I am in awe of all these Parkour guys, and the chase in District B13 is exceptionally great. What Dave Belle does defies gravity and human abilities, and to be able to perform it on command as it were on a film shoot is brilliant. The risk is tremendous and it is almost stunt work going the full circle back to the early silent film days with people relying on their personal ability to entertain."
Belle is the leader of the parkour movement and performed his stunts without wires or special effects.
Mission Impossible 4: Ghost Protocol
Vic Armstrong: "The sequence around the Burj Khalifa in Mission Impossible 4: Ghost Protocol is an amazing sequence that was shot at the real location and performed by Tom Cruise for real. Having worked with Tom many times, I know he has this amazing, fearless approach to working at heights that terrify most mortals. Tom also has huge trust in his crew that rig it all for him, and their work together has achieved a breathtaking sequence."
It should be noted that the Burj Khalifa is the tallest tower in the world. Applause.


text:
Die Parlamentswahl in Kirgisistan 2000 wurde am 20. Februar 2000 mit einer Stichwahl am 12. März 2000 in Kirgisistan abgehalten. Gewählt wurden die insgesamt 105 Abgeordneten in beiden Kammern des Parlaments. Ein Großteil der Mandate ging an unabhängige Kandidaten.

Wahlsystem
Die Parlamentswahl im Jahr 2000 war die letzte Parlamentswahl vor dem Verfassungsreferendum im Jahr 2003, durch das der Wechsel von einem Zweikammersystem zu einem Einkammersystem vollzogen wurde. Im Vergleich zur Parlamentswahl 1995 wurde das Wahlsystem allerdings deutlich angepasst. Im Jahr 2000 wurde über insgesamt 105 Mandate in den zwei Kammern des kirgisischen Parlaments abgestimmt. Die 60 Sitze in der gesetzgebenden Versammlungen wurden durch eine Kombination aus Verhältniswahl und Mehrheitswahl vergeben. In landesweit 45 Wahlbezirken wurde per Mehrheitswahl je ein Abgeordneter in die gesetzgebende Versammlung gewählt, dabei musste dieser die absolute Mehrheit der Stimmen in seinem Wahlbezirk erringen. Gelang dies im ersten Wahlgang keinem der Kandidaten, wurde am 12. März 2000 eine Stichwahl in dem betroffenen Wahlbezirk abgehalten. Die übrigen 15 Mandate wurden durch Verhältniswahl über die Wahllisten der registrierten Parteien vergeben. Hierbei galt eine Sperrklausel von 5 % der Stimmen.

In der zweiten Kammer des Parlaments, der Versammlung der Volksvertreter, waren 45 Mandate zu vergeben. Diese wurden allesamt per Mehrheitswahl in den 45 Wahlbezirken des Landes vergeben, ebenfalls unter Voraussetzung einer absoluten Mehrheit für einen Kandidaten. Insgesamt wurden dementsprechend 105 Mandate vergeben, 90 davon durch Mehrheitswahl in den 45 Wahlbezirken und die restlichen 15 durch Verhältniswahl.

Hintergrund
Nachdem Kirgisistan nach dem Zerfall der Sowjetunion von vielen als ,,Insel der Demokratie" im allgemein von autoritären Regimen geprägten Zentralasien gelobt wurde, kam es unter dem Präsidenten Askar Akajew zu einer schrittweise Abkehr von der demokratischen Ausrichtung des Systems hin zu einem stark präsidentiellen System, in dem die Arbeit der freien Opposition stark eingeschränkt oder sogar verboten wurde. Nach seiner Wiederwahl bei der Präsidentschaftswahl in Kirgisistan 1995 gelang es Akajew, mehr Macht auf seine Person und das Amt des Präsidenten zu vereinen. Durch Verfassungsreferenden 1996 und 1998 wurde das Wahlrecht und die Zusammensetzung des Parlaments verändert, es kam zu einer Stärkung des Präsidenten gegenüber dem Parlament.

Kandidaten und Parteien
Die Registrierung der einzelnen Kandidaten und der Parteien sorgte im Vorfeld der Wahl für Komplikationen und Diskussionen, da der Vorgang der Registrierung eine Reihe von Dokumenten und Formalitäten erforderte. So mussten Kandidaten detaillierte Angaben zu ihren Finanzen machen und diese durch eine Vielzahl von Dokumenten belegen. Viele Kandidaten kritisierten, dass der Prozess der Registrierung nicht standardisiert sei und eine Ungleichbehandlung der Kandidaten möglich mache. Schließlich wurden 420 Kandidaten für die Wahl zugelassen und registriert.

Für Kontroversen sorgte außerdem das Zulassungsverfahren für Parteien und Wahlblöcke und dabei insbesondere Artikel 92 der Wahlrechtsverordnung, der unter anderem besagte, dass Parteien sich ein Jahr vor der offiziellen Ansetzung der Wahl registrieren lassen mussten. Dies ergab den 20. Januar 1999 als Stichdatum für die Registrierung der Parteien. Dieser Fristsetzung fiel die Registrierung von fünf Parteien zum Opfer, darunter der regierungstreuen Partei Adilet und der beiden wichtigen Oppositionsparteien Volkspartei und Ar-Namys. Gegen den Ausschluss dieser Parteien von der Wahl wurde ohne Erfolg geklagt, die strikte Auslegung der Registrierungsvorschriften wurde bestätigt und damit großer Einfluss auf die Wahl und insbesondere auf die Stärke der Opposition genommen. Die Partei Demokratische Bewegung Kirgisistans wurde trotz einer fristgemäßen Registrierung ebenfalls von der Wahl ausgeschlossen, da sie Politiker der ausgeschlossenen Partei Ar-Namys auf ihrer Wahlliste führte. Dieses Vorgehen wurde von der Wahlkommission verurteilt und führte zum Ausschluss der Partei. Da dieser Vorgang nicht unmittelbar vom kirgisischen Wahlrecht gedeckt war, sprachen Beobachter von einer politischen Entscheidung.

Nach dieser Ausdünnung der Parteienlandschaft vor der Parlamentswahl blieben elf Parteien übrig, die bei der Wahl antraten und eine Wahlliste aufstellten.

Wahlkampf
Im Vorfeld der Parlamentswahl kam es zu einem lebhaften Wahlkampf zwischen den verschiedenen Parteien und Kandidaten. Dazu gehörten Debatten im Fernsehen, Wahlwerbespots, Zeitungsanzeigen und Wahlplakate. Zahlreiche lokale Veranstaltungen und Debatten stießen auf großes Zuschauerinteresse. Die wichtigsten Themenbereiche in der politischen Debatte vor den Wahlen waren die Entwicklung der Wirtschaft, die Bekämpfung von Arbeitslosigkeit und Korruption und der Zugang zu medizinischer Versorgung. Neben den Parteien, deren Positionen oft nicht klar voneinander abgegrenzt werden konnten, prägten auch unabhängige Kandidaten den Wahlkampf.

Die kirgisischen Medien spielten eine wichtige Rolle im Wahlkampf. Allgemein wurde hier eine Gleichbehandlung der Parteien angestrebt, die aber nur teilweise umgesetzt werden konnte. Staatliche Medien vertraten eine tendenziell regierungstreue Linie, so veröffentlichte die vom Staat kontrollierte Zeitung Slovo Kyrgyzstana ausschließlich Anzeigen von regierungstreuen Parteien. Andere Zeitungen standen im Wahlkampf der Opposition nahe und unterstützten diese mit Anzeigen und Texten. Im Staatsfernsehen wurde sämtlichen Parteien Sendezeit eingeräumt, die Berichterstattung fiel allerdings positiv wertend gegenüber der Regierung aus. Kleinere, nicht-staatliche Medien gaben in vielen Fällen eine differenziertere Berichterstattung ab, sahen sich aber häufig dem Druck von Regierungsbehörden ausgesetzt und wurden teilweise zur Selbstzensur gedrängt. Insgesamt waren die Medien elementarer Bestandteil des Wahlkampfs und wurden von regierungstreuen und oppositionellen Parteien genutzt, eine ausgewogene und differenzierte Berichterstattung war aber nur begrenzt möglich.

Ablauf der Wahl
Die Parlamentswahl verlief im ersten und zweiten Wahlgang friedlich und geordnet. Im ersten Wahlgang wurden 600 Wahllokale in 42 der 45 Wahlbezirken von Beobachtern der Organisation für Sicherheit und Zusammenarbeit in Europa besucht und der Ablauf der Wahl beobachtet. In circa 99 % der Wahllokale waren kirgisische Wahlbeobachter von Nichtregierungsorganisationen und Parteien anwesend. Ein üblicher Vorgang bei der Wahl war die Präsenz lokaler Würdenträger in Wahllokalen. Diese trugen teilweise zur Erleichterung der Organisation der Wahl bei, standen aber in vielen Fällen einzelnen Kandidaten nahe und wurden daher der Einflussnahme verdächtigt. Auf Grund unpräziser Wählerlisten konnte bei der Wahl die doppelte Stimmabgabe teilweise nicht wirksam verhindert werden.

Ergebnis
Die Parlamentswahl im Jahr 2000 belegte erneut die bis dato geringe Attraktivität politischer Parteien in Kirgisistan. Wie bereits bei vorangegangenen Wahlen bildeten unabhängige Abgeordnete die größte Gruppe im neu gebildeten kirgisischen Parlament:

Mit der Union Demokratischer Kräfte wurde eine dem Präsidenten Akajew nahestehende Partei die stärkste Kraft im kirgisischen Parlament. Die kirgisische Parteienlandschaft blieb nach der Wahl aber zersplittert und dynamisch, Abspaltungen und Neugründungen veränderten diese regelmäßig. Der Sieg unabhängiger Kandidaten in einer Mehrheit der Wahlbezirke belegt die geringe Bedeutung von Parteien in der kirgisischen Politik zum Zeitpunkt der Wahl.

Bewertung
Die Wahl wurde von zahlreichen ausländischen und kirgisischen Wahlbeobachtern verfolgt und bewertet. Das 115-köpfige Beobachterteam der Organisation für Sicherheit und Zusammenarbeit in Europa kam in den meisten Fällen zu einer positiven Einschätzung, in 90 % der besuchten Wahllokale wurde die Durchführung der Wahl positiv bewertet. Für negative Schlagzeilen hingegen sorgten Berichte über die Beeinflussung des Wahlverhaltens von Studenten durch Universitäten, darunter die Landwirtschaftliche Universität Bischkek. In diesem Fall kandidierte der Direktor der Universität für ein Mandat im kirgisischen Parlament und die Studenten der Universität wurden unter Druck gesetzt, für diesen zu stimmen. Die meisten Unregelmäßigkeiten wurden im Gebiet Dschalalabat im Westen Kirgisistans registriert. Hier griffen lokale Amtspersonen eindeutig zu Gunsten einzelner Kandidaten in den Wahlkampf ein, zudem wurden die Endergebnisse in einzelnen Wahlbezirken von Beobachtern angezweifelt. Neben einer allgemein ausbaufähigen Organisation der Wahl kritisierten die Beobachter der OSZE auch den Umgang mit Oppositionsparteien und -politikern. Diese wurden insbesondere durch die schwierigen Registrierungsprozesse und Unregelmäßigkeiten bei der Auszählung der Stimmen an einer fairen und gleichberechtigten Teilnahme an der Wahl gehindert.

Folgen
Im Nachgang der Wahl beschäftigte insbesondere der Wahl des ehemaligen Oberbürgermeisters von Bischkek und späteren Premierminister Kirgisistans, Felix Kulow, das Land. Dieser hatte als Kandidat der Opposition in seinem Wahlbezirk, der von Unregelmäßigkeiten bei der Auszählung der Stimmen zu Ungunsten Kulows geprägt war, nach offiziellen Angaben im zweiten Wahlgang verloren. Kurz nach der Wahl wurde Kulow verhaftet und 2001 zu sieben Jahren Haft verurteilt. Im Distrikt Kara-Buraa im Nordwesten Kirgisistans und in Bischkek kam es nach der Verhaftung von Kulow zu Protesten, die von der Polizei teilweise gewaltsam aufgelöst wurden.

Premierminister wurde der parteilose Politiker Kurmanbek Bakijew, der am 21. Dezember 2000 das Amt übernahm. Bereits im Mai 2002 gab er seinen Rücktritt von dem Amt bekannt, nachdem sechs Demonstranten von Polizeikräften erschossen wurden. Im Zuge der Tulpenrevolution im Jahr 2005 und der Absetzung des Präsidenten Akajews konnte Bakijew sich als Anführer der Oppositionsbewegung zum neuen Präsidenten Kirgisistans aufschwingen.

Einzelnachweise

Kirgistan
2000

redpajama_set_name: RedPajamaWikipedia


Home/Car Care, News/Autoglym is Back!
After a 2 years hiatus, Autoglym is now back on our shelves. Yeah, that's pretty much what we've been working on since the start of 2019.
No, they don't change the color of your paintwork. This new product reacts to iron contaminants and changes colors before you washed them off.
There's carnauba wax and there's better carnauba wax. Don't take our word for it, let the water beads convince you.
You'll need a pressure washer or foam gun for the Polar Blast. We believe this is the consumer's version of the Autoglym's 25-litre Traffic Film Remover (TFR). This detergent do not require agitation and should be perfect for a quick wash on a mildly soiled paintwork.
If you are one of those foam-lovers, you should definitely give these high foaming formula detergents a try. Bodywork Shampoo Conditioner is still available for those of us who are not so into foams.
For longer lasting high gloss finishing on your tyres, this one would be up to the task. Apply this only on the side wall of your tyres, not the threads unless you are going for high performance skidding.
They've changed colors over the years from red to blue and now black but these handy pads (pun-intended) definitely makes the detailing process a more enjoyable chore. And they now come in pack of 2.
It's great to be bringing back this legendary brand to our customers again.
If you have any questions about these new Autoglym products or stock availability, just drop us an email.


The Ariat® Live Wire boot will have you ready to perform with confidence in and out of the arena!
Features standout seven-row Western stitching detail on shaft.
Duratread™ outsole provides excellent traction.


text:
UIndy communication student Madeline Fisher wins three pageant titles
by Arrianna Gupton | Editorial Assistant August 24, 2022
Published: August 24, 2022 Last Updated on August 21, 2022
The University of Indianapolis has its very own pageant titleholder: junior communication major Madeline Fisher. For the past seven years, Fisher had watched her hometown's pageant, Miss Harvest Homecoming, from backstage working as a stagehand. All of that changed after some of her friends urged her to become a contestant.
"… [I] always kind of disregarded myself and was like, 'This isn't for you. You're not made to do this kind of stuff. You're not good enough to do this kind of stuff,'" Fisher said. "But… last year, around this time I decided you know what, let's see what happens."
Fisher had participated in three different local pageants before becoming an official title holder. She said that before winning her title, it was a little discouraging to find herself on top one day and the next having to go home without placing. But she knew that she had to trust the process.
"You get to learn a lot about the other girls, and I think pageant day is more fun than it is stressful," Fisher said. "It's just a lot of connecting with people and sharing your stories and stuff like that. Before I was crowned, it was a little stressful trying to find local [pageants] that I could compete in and worrying about how I would do but… it's always been just a very fun day."
According to Fisher, the day of the pageant was long, lasting from 7 a.m. until 9:30 p.m. The day included walking patterns and interviews. Although Fisher is a communication major, she has roots in the world of theatre and dance, which she gets to implement when it is her time to get on the stage. As a fan of big dramatic songs, she sang 'Happy Days are Here Again' by Barbara Streisand at her most recent performance
Photo contributed by Madeline Fisher Junior Communication major Madeline Fisher performs in her talent gown at Miss Harvest Homecoming in 2022. She said that her performance differs for each pageant.
Fisher said that her first title, Miss Spirit Indiana, which she won in February of 2022, will always hold a special place in her heart. But in August, Fisher competed at Miss Harvest Homecoming, the place where it all started for her.
"It was the [competition] that I had watched for so long. So actually winning, it was a moment that still, almost a week later, I don't have words to fully describe." Fisher said. "Anytime you win something like that, you're a little emotional, but for me to win the title that I had poured so much of my life and my time into was absolutely incredible. And I'm still just so, so grateful. I still have my trophies on the table and all my flowers out … It just felt so amazing and it felt like a coming home kind of moment."
There is a lot more that goes into pageants than just going on stage dressed in a pretty dress, Fisher said, and Miss America is about needing to be more than a pretty face. She said that in order to compete, participants need something that they're deeply passionate about and want to change within their community.
"We all have social impact initiatives and mine is called YOUsical theater," Fisher said. "It's about advocating for the arts in schools and also in communities, making sure that they get the support and the funding that they need and that the educational and social and emotional benefits that it can have on both students and adults are well elaborated upon and that they're common knowledge."
Fisher said the General Manager of WICR-FM and communication instructor Scott Uecker has supported her in all of her endeavors. He has known Fisher for a year and is one of her instructors. According to Uecker, having Fisher in class is an enjoyable experience as she is engaged and does the best she can.
"She's a high achiever. She's very driven. She is incredibly talented," Uecker said. "She has a very solid work ethic and I think [that] may be the thing that endears her most to me is that she has a vision for her future and is willing to put in the work. However, she is also willing to change."
According to Uecker, it's very easy to see why Fisher's winning titles. He said even though Fisher makes school and pagenting look easy, there has been a lot of work put in for her to get to where she is now.
"She finds a way to say 'yes' to opportunities. Too many students don't get the success they deserve because they just don't put themselves out there. It's hard to put yourself out there, but she does," Uecker said. "… If you look at what she does to get what she's gotten, it's well deserved on her part. I couldn't be happier for her."
As far as what is next for Fisher, she will be participating in the Miss Indiana pageant next June. For the rest of this year, Fisher plans on dedicating her time to growing her social impact initiative, which entails community service and going out into the community.
"I love UIndy; they have been super, super supportive of all my pageant endeavors … [I] love the support that I've received from the Communication Department, from the professors through social media," Fisher said. "I'm just very grateful for my UIndy community in general because even though Spirit of Indiana and now Harvest Homecoming are not centered around the university, the university has really embraced this new wave of Miss America and pageantry. And I love that… they've been really invested and I'm really, really appreciative of that."
Arrianna GuptonIndianapolisIndyMadeline FischerMiss Harvest HomecomingMiss Spirit IndianaThe ReflectorThe Reflector OnlineUIndyUniversity of Indianapolis
'Bodies Bodies Bodies' Movie Review
'Beast' Movie Review
UIndy faculty and staff combine yoga and acts...
Senior Lainey Willis gives presentations about creating a...
Aspiring Educators fundraise with Christmas market
Winter Formal 2022: What students need to know
Faculty and staff connect through monthly book club
Business clubs engage students outside of the classroom
Students collaborate with Path4You to make contraceptives more...
ARCHAIC revitalized after COVID-19, connects those interested in...
Chemistry Club is back at UIndy
Mindfulness workshops help students practice healthy habits
Recommended for youx
UIndy faculty and staff combine yoga...
Senior Lainey Willis gives presentations about...


text:
package org.apache.cassandra.cql3.validation.entities.udfverify;

import java.nio.ByteBuffer;
import java.util.List;

import com.datastax.driver.core.TypeCodec;
import org.apache.cassandra.cql3.functions.JavaUDF;
import org.apache.cassandra.cql3.functions.UDFContext;

/**
 * Used by {@link org.apache.cassandra.cql3.validation.entities.UFVerifierTest}.
 */
public final class CallClone extends JavaUDF
{
    public CallClone(TypeCodec<Object> returnDataType, TypeCodec<Object>[] argDataTypes, UDFContext udfContext)
    {
        super(returnDataType, argDataTypes, udfContext);
    }

    protected ByteBuffer executeImpl(int protocolVersion, List<ByteBuffer> params)
    {
        try
        {
            clone();
        }
        catch (CloneNotSupportedException e)
        {
            throw new RuntimeException(e);
        }
        return null;
    }
}


text:
Home Education Western Maryland Health System Selects the Rothman Index for Global Clinical Surveillance...
Western Maryland Health System Selects the Rothman Index for Global Clinical Surveillance to Improve Health Outcomes
CHARLOTTE, N.C.–(BUSINESS WIRE)–As part of its continued effort to improve patient outcomes and further its mission of patient-centered care and improving the health and well-being of people in the communities it serves, Western Maryland Health System (WMHS) has chosen the Rothman Index software to replace the Modified Early Warning Score (MEWS). WMHS serves Allegany, Garrett and Washington Counties in Maryland and surrounding counties in West Virginia and Pennsylvania.
The Rothman Index is the first algorithm that automatically derives one simple score from the vast amount of data in electronic medical records to create a picture of any patient's condition, trended over time – any age, any disease, any unit. The data feeding the Rothman Index reflects the real-time status of multiple body systems, and therefore captures subtle changes in patient condition, often hours or days earlier than existing vitals-based algorithms like MEWS. For WMHS, the Rothman Index will connect to its MEDITECH system.
"The Rothman index will help us identify patient decline earlier to provide better service. Using predictive analytics will help lower mortality and readmission rates, and ultimately help improve quality while reducing costs," said James Karstetter, Vice President and Chief Nursing Officer, WMHS. "This technology aligns with our continual efforts towards performance excellence and enhanced patient safety."
WMHS expects the Rothman Index will help clinicians detect sepsis sooner by identifying patients who are deteriorating even before a sepsis screening takes place. It will also help identify patients eligible for a palliative care consult, while establishing customized and consistent patient alerts to assist with onboarding new employees.
"We are delighted Western Maryland Health System has selected the Rothman Index to advance its global clinical surveillance efforts. The Rothman Index is the only algorithm proven to reduce mortality in practice. As with all our valued customers, we are excited to begin this partnership, and we are committed to successful clinical and operational adoption and improvement," said PeraHealth CEO, Greg White.
To learn more about the power of the Rothman Index, register for PeraHealth's upcoming webinar: "The Rothman Index for Palliative Care: Have the Conversation," at https://www.perahealth.com/resources/webinars/the-rothman-index-for-palliative-care/.
About Western Maryland Health System
Western Maryland Health System was formed in 1996 to strengthen the healthcare services in Western Maryland and the surrounding communities in Pennsylvania and West Virginia. In November 2009, WMHS opened a new state-of-the-art hospital on Willowbrook Road in Cumberland, Maryland.
The Western Maryland Regional Medical Center has over 200 beds and offers a comprehensive range of general and specialty services for medical, surgical, and obstetrical patients. In addition to hospital-based services, WMHS has a network of diagnostic centers, urgent care centers, physician practices, a skilled nursing facility, home care, and other outpatient specialty services.
WMHS has been at the forefront of value-based care and is continuously working to improve the overall health of the community with a variety of health initiatives, including: health screenings, classes on adopting healthy lifestyles, community education, and exercise programs. WMHS has also addressed the issue of underserved populations by opening Community Outreach Clinics that aim to help at-risk populations make more informed healthcare decisions.
As of February 2018, WMHS and UPMC (University of Pittsburgh Medical Center) joined together in a clinical affiliation to work cooperatively to enhance healthcare services for local residents. The partnership enables WMHS to build upon its success in providing value-based care and to strengthen its ability to deliver quality care, transform care delivery and reduce the total cost of providing care in the community.
To learn more about Western Maryland Health System, visit www.wmhs.com. Find us on social media at facebook.com/westernmdhealth, youtube.com/WMHSCumberland, Twitter @westernmdhealth, and Instagram @westernmarylandhealthsystem.
About PeraHealth
PeraHealth is a software company that uses the Rothman Index to transform the clinical and financial efficiency of healthcare. The Rothman Index is the only algorithm that derives one simple score from the vast amount of data in the electronic medical record to create a picture of any patient's condition over time – any age, any disease, any unit. It is the only algorithm proven to reduce mortality in practice. Other results include reducing length of stay and readmissions. Our customers are leading hospitals and clinicians who need to identify patients at risk of rapid decline, make decisions about transfer and discharge, predict the risk of severe infection, and improve the overall efficiency and quality of care. For more information, visit PeraHealth.com and @PeraHealth.
Previous articleTotal: Launch of the Innovative European "3D" Project for the Capture and Storage of CO2 on an Industrial Scale
Next articlePelican Products Welcomes George Platisa as Chief Financial Officer