text:
Cognition, Decision making	 June 26, 2019 June 26, 2019
Higher Intelligence And An Analytical Thinking Style Offer No Protection Against "The Illusory Truth Effect" – Our Tendency To Believe Repeated Claims Are True
By Matthew Warren
It's a trick that politicians have long exploited: repeat a false statement often enough, and people will start believing that it's true. Psychologists have named this phenomenon the "illusory truth effect", and it seems to come from the fact that we find it easier to process information that we've encountered many times before. This creates a sense of fluency which we then (mis)interpret as a signal that the content is true.
Of course, you might like to believe that your particular way of thinking makes you immune to this trick. But according to a pre-print uploaded recently to PsyArXiv, you'd be wrong. In a series of experiments, Jonas De keersmaecker at Ghent University and his collaborators found that individual differences in cognition had no bearing on the strength of the illusory truth effect.
The researchers wondered whether three aspects of cognition, already known to influence how people make judgments, could determine how prone someone is to the illusory truth effect: cognitive ability or intelligence; the need for cognitive closure (i.e. the desire to avoid ambiguity); and cognitive style (whether someone thinks in a rapid and intuitive manner or takes a slower and more analytic approach). For example, someone who relies more on intuition and wants hard-and-fast answers might be more likely to use the fact that information has been repeated as a cue to its truthfulness.
Across six experiments involving between 199 and 336 participants, the team measured the illusory truth effect while also tapping into these aspects of cognition. The exact methods varied for each study, but generally participants would first read a mix of true and false trivia statements, then complete various cognitive tests and surveys, and finally they would re-read and judge as true or false the earlier trivia statements, as well as new ones interspersed among them. A seventh study was similar but involved fake and real political headlines (the participants' final challenge in this case was to judge which were real and which were made up).
The researchers found the illusory truth effect across all seven studies: participants were more likely to rate trivia statements and headlines as true/real if they'd seen them previously. Crucially, the strength of this effect did not vary according to the participants' cognitive ability or style, or need for closure. (A couple of studies found some small significant associations, but these disappeared when the researchers integrated all the data.)
These results suggest that we are all predisposed to believe repeated information regardless of our own particular cognitive profile. And while that might make us all susceptible to advertising and the fabrications of dishonest politicians, the researchers have a more optimistic take. "These novel findings are in line with the assertion that processing fluency is not a judgmental bias and flaw in the individual, but rather a cue to truth that is universal and epistemologically justified in most contexts", they write. In other words, it's not that there's a foolish subgroup of people who are more vulnerable to the "illusory truth" effect, but rather it's an advantageous and universal bias that's arisen because most of the time fluency actually is a reliable signal of truth. For example, a statement that is often repeated may tend to be endorsed by more people, which could be a useful cue to its truth.
But that doesn't mean that there aren't individual differences relating to the illusory truth effect waiting to be discovered, the team adds. Individuals with Alzheimer's disease, for example, seem to show a less strong effect, suggesting that certain fundamental aspects of memory and cognition may be required to support the effect. With a greater willingness to publish null results like this one – and not just leave them in the file drawer – researchers should be able to build up a much more complete picture of the illusory truth effect and other cognitive biases.
—Investigating the robustness of the illusory truth effect across individual differences in cognitive ability, need for cognitive closure, and cognitive style [This study is a preprint meaning that it has not yet been subject to peer review and the final published version may differ from the version on which this report was based]
Matthew Warren (@MattbWarren) is Staff Writer at BPS Research Digest
Psychologists Have Identified The Creatures We Find Most Scary And Revolting
By Christian Jarrett. The spider was unique in being intensely fear- and disgust-inducing in equal measure.
Preliminary Evidence That Stress Makes Negative Memories Less Distinctive, With Implications For Witness Testimony
By Matthew Warren. It's not the strength of our memories that's affected by stress, but their fidelity, the research suggests.
9 thoughts on "Higher Intelligence And An Analytical Thinking Style Offer No Protection Against "The Illusory Truth Effect" – Our Tendency To Believe Repeated Claims Are True"
Pingback: Higher Intelligence And An Analytical Thinking Style Offer No Protection Against "The Illusory Truth Effect" – Our Tendency To Believe Repeated Claims Are More Likely To Be True – O Society
Pingback: Higher Intelligence And An Analytical Thinking Style Offer No Protection Against "The Illusory Truth Effect" – O Society
kdn026 says:
One repeated piece of information that many people are predisposed to believe without questioning is that "the mind is inside the head." This assumption leads to several invalid assumptions and also restricts research investigations in other interesting areas.
Pingback: We are running out of time to find the meaning of work - Mapene
Pingback: Higher Intelligence And An Analytical Thinking Style Offer No Protection Against "The Illusory Truth Effect" – Snapzu Health & Body
TruthBtold says:
Brain experiments and studies should have had very strict guidelines and only be done on volunteers who gave conscious informed consent. At this point anyone who tries to deny someone else's experience is creating problems. Perception rhymes with deception –
Pingback: Just Read #9 – Disparate Fran
Pingback: Intelligenza superiore e pensiero analitico non proteggono contro l'effetto "Verità Illusoria" [EN] – hookii


text:
The Principles
The Framework
Purpose that Serves Society
Coaches & Consultants Network
Research and Academics
Other Influencers
Panel Event: A Good Citizen – Discussing fairness in collaboration with the RSA
JUNE 2018 PANEL: Becoming a Purpose-led Employer
PANEL: What does it mean to be honest and fair with customers?
Meaning Conference: Blueprint Workshop
The Blueprint Blog
Papers, reports and research
Navigating Purpose – provocations for CEOs
By Admin17/10/2019Blog
Charles Wookey, CEO, A Blueprint for Better Business
This introduction was given to an audience of FTSE 100 leaders at a recent Blueprint CEO Forum.
Ahead of this evening's discussion, I wanted to offer this illustration as an opening framing, and from there draw out three provocations. In doing this, I'm conscious that we represent a charity working with business leaders – one offering insights and questions – but we are not the people on the bridge of the ship. You are.
You are all leaders of major companies, and collectively have powerful agency in the system. You hold your roles at a time of extraordinary upheaval. Navigating the ships you each command can rarely have been more challenging. Wherever you look there is uncertainty, fragility and rapid change: the economy, politics, the climate crisis, social fragmentation, and technological innovation. All these at once, and alongside that rising social expectations and the constant invigilation of social media, and that is before we even think about investors and the demands of capital markets.
So my first provocation to you is that in navigating the shoals of uncertainty your course needs the guidance of a deep belief about what you think makes for a successful business that serves society in the long term. Navigating by purpose, rather than by simply maximising profit, means avoiding two rocks on either side of the channel. One is marked "frictionless win/win" – the idea that with "added purpose", everything else carries on as before and we simply get a purpose dividend. The other is marked "purpose always means accepting lower performance" – the idea that there is always some kind of enduring trade-off. In our view, both assumptions should be avoided. But it is not easy, it means setting the direction of travel fundamentally by reference to the better society that arises from our success. Profit is a vital fuel that powers the ship, but is not the goal.
So, my first provocation is: What are your beliefs about the role of business in society and the purpose of your business, which set the direction and help you navigate? What guides you?
Secondly, Blueprint's point of view is that beyond the distortion in business caused by a narrow focus on maximising shareholder value there has been a second distortion created by assuming that as people at work we are purely self-interested and motivated by money, status and power.
Our behaviour is shaped by the culture around us and the behaviour of others. We know from many sources that people are in fact fundamentally social. Evidence from wisdom traditions and empirical sciences point to three things most people want: meaning and to make a positive contribution through work; to care and be cared for – to belong; and to grow as people – seeking autonomy, mastery and development. At Blueprint, our belief is that understanding this and shaping the processes and structures within business accordingly, has the power to unlock the latent potential of people to commit to a shared worthwhile endeavour.
This is why in our work we bring together a provocation about purpose with a second provocation about people. The power of purpose to inspire and motivate people can only be realised if the business sees itself as a social organisation, a series of relationships in which each person matters. The benefits that then flow help create a better business – in terms of performance, engagement, and better quality relationships with customers, suppliers and communities.
So, my second provocation is: What assumptions do you have – or do you think your business has – about what motivates people, and how does that show up in practice in the business? What motivates you?
Finally, I want to draw our attention to collective action. People are searching for a new and better narrative about the role of business:
2020-30 is the decade of decision, and huge transitions need to be made if the SDGs are to be met. We all know the vital role business has to play and that now is the time to step up
With continuing political turbulence business has a stabilising role to play by leading for positive societal impact, and holding itself more accountable
There is a lot of anger and frustration out there, but also a yearning for hope and for institutions that can carry and enhance a wider common good
Business as a social institution can help hugely if it sees itself as part of society, a healthy human system contributing to the common good. It is a big shift and no one company acting alone can change this. It needs courage and collective action. However, a number of leading businesses acting together can help shape the evolution of expectations of business in society. And do it without resorting to law and regulation.
So, my third provocation is: What can you do together to redefine what a better business looks like and does in meeting the challenge of the decade ahead? What will you do to put this into practice?
In summary – the three provocations:
What beliefs do you have about the role of business, and of your business in society, which set the direction and help you navigate? What guides you?
What assumptions do you have – and does your business have – about what motivates people? What motivates you?
What can you do together to redefine what a better business looks like to help reset societal expectations about how business can best meet the challenge of the decade ahead? What will you do to put this into practice?
We are interested to hear your experiences in leading through a period of change and having a robust discussion about what guides decision taking in practice. If you would get in touch with Blueprint about this or any other topic, please contact: enquiries@blueprintforbusiness.org
Accountability: A business answer to a world in crisis
Purpose and culture
How can business respond to the climate crisis?
Are you talking to your team about climate?
Blueprint Trust is an independent charity. We are not a membership organisation. Our work is not about compliance or regulation but about stimulating and energising positive behavioural change.
Accountability: A business answer to a world in crisis 21/11/2019
Purpose and culture 30/10/2019
Navigating Purpose – provocations for CEOs 17/10/2019
How can business respond to the climate crisis? 20/09/2019
Are you talking to your team about climate? 19/09/2019
© 2020 A Blueprint for Better Business.

redpajama_set_name: RedPajamaCommonCrawl


text:
News March 21, 2016 0
Mayor Kiko Munro announces flight between Cd. Juarez and Puerto Peñasco
Puerto Peñasco, Sonora. March 20, 2016. In order to improve international connectivity while reviving municipal economic development, Mayor Kiko Munro announced commercial flights between Cd. Juárez and Puerto Peñasco will begin June 26th. The flights will initially operate weekly on Thursdays and Sundays.
He explained the new route, operated by the TAR airline (Transportes Aéreos Regionales) headquartered in Querétaro, was obtained through joint efforts of the State Government and Secretary of Tourism (SECTUR).
"Peñasco's connectivity to the world, and reviving economic development, has been my priority since day one of our administration," he emphasized, "now we will see these results, and negotiations are still underway with TAR for another flight to Hermosillo, and there are talks with Volaris."
Mayor Munro added that with this achievement efforts are well underway to ensure Puerto Peñasco develops not solely as a real estate destination, but rather once find itself in the spotlight for both national and international tourism.
The agreement for the upcoming flight was reached during the visit of Municipal Economic Development Coordinator, Ruben Sánchez Lizárraga, to Mexico City where he met with Salvador Sánchez Estrada, Deputy Secretary of Planning and Tourism Policy, Roberto Cabral y Bowling, General Director of Planning, and Vanessa María Vázquez Meseguer, Consulting Coordinator of the Deputy Secretary of Planning and Tourism Policy, all from SECTUR.
Others involved in the talks included José Luis Rangel Esquivel, Executive Director of Offices from the Mexican Tourism Board, Alejandro Cobián Bustamante, General Director of the National Chamber of Aerotransport (CANERO) and Fernando Antillón Valenzuela, Director of the Aeropuerto Mar de Cortés.
Nayo Jones to headline Jazz Festival in Rocky Point
Family Tourism bounces back over Spring Break in Rocky Point


text:
package net.researchgate.restdsl.resources;

import com.mongodb.BasicDBObject;
import net.researchgate.restdsl.annotations.PATCH;
import net.researchgate.restdsl.exceptions.RestDslException;
import net.researchgate.restdsl.model.ServiceModel;
import net.researchgate.restdsl.queries.ServiceQuery;
import net.researchgate.restdsl.util.RequestUtil;

import javax.ws.rs.DELETE;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import static javax.ws.rs.core.Response.Status.CREATED;
import static javax.ws.rs.core.Response.Status.OK;

/**
 * Service resource that provides all HTTP verbs with default implementation.
 * If you don't want all of these, extend BaseServiceResource yourself and include what you want.
 */
public abstract class ServiceResource<V, K> extends BaseServiceResource<V, K> {
    private final ServiceModel<V, K> serviceModel;

    public ServiceResource(ServiceModel<V, K> serviceModel, Class<V> entityClazz, Class<K> idClazz) {
        super(serviceModel, entityClazz, idClazz);
        this.serviceModel = serviceModel;
    }

    @POST
    public Response createEntity(V entity, @Context UriInfo uriInfo) throws RestDslException {
        validatePostEntity(entity);
        V persisted = serviceModel.save(entity);
        return Response.status(CREATED).entity(persisted).build();
    }

    @PATCH
    public V patchEntity(V entity, @Context UriInfo uriInfo) throws RestDslException {
        validatePatchEntity(entity);
        return serviceModel.patch(entity, RequestUtil.getPatchContext(uriInfo));
    }

    @Path(PATH_SEGMENT_PATTERN)
    @PUT
    public Response updateEntity(@PathParam("segment") String id, V entity, @Context UriInfo uriInfo) throws RestDslException {
        K key = getId(id);
        if (key == null) {
            throw new RestDslException("Key cannot be null", RestDslException.Type.PARAMS_ERROR);
        }
        validatePut(key, entity);

        entityInfo.setIdFieldValue(entity, key);
        V persisted = serviceModel.save(entity);
        return Response.status(OK).entity(persisted).build();
    }

    @Path(PATH_SEGMENT_PATTERN)
    @DELETE
    @Produces("application/json;charset=UTF-8")
    public Response delete(@PathParam("segment") PathSegment segment, @Context UriInfo uriInfo) throws RestDslException {
        ServiceQuery<K> query = getQueryFromRequest(segment, uriInfo);
        int deleted = serviceModel.delete(query);
        return Response.ok().entity(new BasicDBObject("deleted", deleted).toString()).build();
    }

    protected void validatePostEntity(V entity) throws RestDslException {
        // override if you need extra validation
    }

    protected void validatePatchEntity(V entity) throws RestDslException {
        K val = entityInfo.getIdFieldValue(entity);
        if (val == null) {
            throw new RestDslException("Id must be provided when patching an entity, but was null", RestDslException.Type.ENTITY_ERROR);
        }
    }

    protected void validatePut(K key, V entity) throws RestDslException {
        K val = entityInfo.getIdFieldValue(entity);
        if (val != null && !val.equals(key)) {
            throw new RestDslException("Id either should not be provided or be equal to the one in the entity, " +
                    "but was: " + val + " vs " + key, RestDslException.Type.ENTITY_ERROR);
        }
    }
}

redpajama_set_name: RedPajamaGithub


California auto insurance quotes are said to be the most expensive in the nation. We can help you obtain affordable auto insurance rates here.
The 32-year-old waiter-bartender came to L.A. from Puebla, Mexico, when he was 20 and worked as a gardener and at a car wash before making his way. doesn't have health insurance. Every month, he tr.
This is his story, as told to MONEY reporter Kara Brandeisky. My monthly take-home pay from the insurance company was about $2,200, and I made about $1,000 at Pizza Hut. After gas, car insurance, t.
We flew from Christchurch to Queenstown and then got a rental car at the Airport. From there. t real – if they don't feel.
A Tesla Model S crashed into a fire truck while driving down a California highway. it is more difficult for a car's radar-based system to detect and respond to a stationary object than a moving one.
Karl Koscher and Ian Foster remotely hack a Corvette by tapping into its tracker dongle — the same used by major insurance companies. The latest way to remotely hack a car? By tapping into. from t.
The company grew revenue 93% to $100 million in the 1Q18 and operates in China's rapidly expanding used car market, expected to grow at a. EverQuote, the largest online marketplace for insurance in.
Learn more about California requirements for car insurance. offer online quoting for CA at this time; however, we can assist you with a quote over the phone.
MSME credit and especially micro credit — including loans by banks and NBFCs — show a healthy rate of growth in recent quarters. According to the report, bank credit to MSMEs increased on an average b.
With auto insurance, California drivers can rest easy knowing they're protected by a high rated insurance company. California Casualty can send you a quote.
Elon Musk unveiled Tesla's (TSLA) first electric semi truck in Hawthorne, California, which he claimed to have blown. the actual price of the truck is not made public. As this is not a car for the.


Inconel 800 ASTM B366 Long Radius Bend, Inconel UNS N08800/N08810/N08811 Pipe Cap, Inconel DIN 1.4876/1.4958/1.4859 Seamless Buttweld Fittings Manufacturer & Exporter in South America, Kuwait, US, Indonesia, UAE, Philippines, Egypt, Jordan, Oman, Peru.
We have developed as the prominent exporter, supplier, manufacturer and trader of an extensive range of Alloy 800, 800H, and 800HT Pipe Fittings. These are quite recognized for durability, corrosion resistance, enhanced bend ability and sturdy construction. Attributes of these alloys are: Durable, Robust design, Flawless finish, and so on. Inconel 800HT Pipe Fittings (UNS N08811) is nickel-iron-chromium alloy and have a lot of of the same features of other fellows of the 800 alloy group. Inconel 800H Pipe Fittings (UNS N08810) have resistance to protracted exposure to high temperatures.
800 Pipe Fittings (UNS N08800) is nickel-iron-chromium alloys by means of having outstanding resistance to carburization and oxidation in soaring temperature exposure, along with excellent strength. We offer these products to our customers at reasonable prices as per their demands.
Inconel 800H Welded Pipe Fittings Exporter in Australia, Inconel 800HT Equal & Unequal(reducing) Cross Suppliers in Africa, ASME 16.28 Inconel Piggable Bend Exporter in India.
Nigeria, Venezuela, Pakistan, Colombia, Sri Lanka, Hungary, France, Azerbaijan,Jordan, Kenya, Russia, Kazakhstan, Morocco, Croatia, Lithuania, Bangladesh, Vietnam, Angola, Canada, Saudi Arabia, United States, Malaysia, Tibet, Poland, Norway, Chile, Greece, Ghana, Gambia, Thailand, Costa Rica, Austria, Taiwan, Qatar, India, Mexico, Portugal, Romania, Hong Kong, Trinidad & Tobago,Tunisia, Brazil, Germany, United Kingdom, Indonesia, Switzerland, Mongolia, Namibia, Belarus, Estonia, Australia, Libya, Iran, Afghanistan, Denmark, Yemen, Spain, Slovakia, Puerto Rico, Argentina, Chile, Italy, Sweden, Ireland, Macau, Belgium, Philippines, Finland, Bahrain, Zimbabwe, United Arab Emirates, Iraq, Bhutan, New Zealand, Israel, China, South Africa, Czech Republic, Oman, Peru, South Korea, Iran, Algeria, Ukraine, Kuwait, Lebanon, Bulgaria, Egypt, Japan, Poland, Ecuador, Bolivia, Serbia, Nepal, Singapore, Mexico, Gabon, Nigeria, Turkey, Netherlands.
Ludhiana, Al Jubail, Mumbai, Busan, New York, Nagpur, Thane, Dammam, Hyderabad, Port-of-Spain, New Delhi, Gurgaon, Nashik, Geoje-si, Ranchi, Doha, Seoul, Muscat, Ahmedabad, Chiyoda, Riyadh, Karachi, Melbourne, Baroda, Vadodara, Calgary, Ahvaz, Petaling Jaya, Al Khobar, Cairo, Pune, Secunderabad, Hong Kong, Jamshedpur, Tehran, Toronto, Dallas, Moscow, Faridabad, Howrah, Kanpur, Bengaluru, Manama, Jaipur, Indore, Bogota, Algiers, Visakhapatnam, Bangkok, Noida, Jeddah, Atyrau, Bhopal, Lahore, Ankara, Gimhae-si, Istanbul, Granada, Singapore, Kuwait City, Haryana, Los Angeles, La Victoria, Dubai, Montreal, Surat, Lagos, Coimbatore, Jakarta, Kuala Lumpur, Chandigarh, Milan, Aberdeen, Thiruvananthapuram, Chennai, Rio de Janeiro, Caracas, Mexico City, Ulsan, Courbevoie, Ernakulam, Colombo, Santiago, Houston, London, Sharjah, Rajkot, Edmonton, Madrid, Abu Dhabi, Kolkata, Vung Tau, Ho Chi Minh City, Perth, Hanoi, Brisbane, Navi Mumbai, Pimpri-Chinchwad, Sydney.


We are excited to continue upon the success of last year's Sommelier Series! This collaboration between two of Milwaukee's leaders in wine - Bacchus and Harbor House - makes wine more approachable and fun with a focus on the different varieties from all over the world.
Join General Manager and Sommelier Patrick Erdman as he explains Sauvignon Blanc on Saturday, April 28 at Bacchus. Enjoy tastings of six different types of Sauvignon Blanc with light hors d'oeuvres.
As a special gift for those guests who would like to stay longer with us, we will be offering a free appetizer with the purchase of dinner. Seating tends to fill up quickly after these events, so purchase your tickets and make a reservation for dinner as well!


text:
Dease, Thomas (Déis, Tomás)
Dease, Thomas (Déis, Tomás) (c. 1568–1651/2), catholic bishop of Meath and poet in Irish, was second of three sons of Richard Dease of Turbotstown, Co. Westmeath, and his wife Lady Eleanor Nugent of Carlanstown, Co. Meath. He was closely related to the Nugents of Delvin…
Dease, William
Dease, William (1752–98), surgeon, was born in Lisney, Co. Cavan, into an ancient landed family, younger son of Richard Dease and Anne Dease (née Johnson). After a classical education at Dr Clancy's school in Dublin, he was apprenticed to a Dublin surgeon, Dr Keogh (most likely…
Deasy, Henry Hugh Peter
Deasy, Henry Hugh Peter (1866–1947), soldier, explorer, and pioneer motorist, was born 29 June 1866 in Dublin, second son of Rickard Deasy (qv), privy councillor for Ireland and previously lord justice of appeal, of Carysfort,…
Deasy, Joseph ('Joe')
Deasy, Joseph ('Joe') (1922–2013), left-wing activist, was born on 12 July 1922 in Ballyfermot, Dublin, the eldest of two boys and two girls born to Dick Deasy, a train driver with the Great Southern Railway (GSR), and Mary Deasy (née O'Connor). Educated at St Michael's National School…
Deasy, Liam
Deasy, Liam (1896–1974), IRA officer and author, was born 6 May 1896 at Kilmacsimon Quay, Bandon, Co. Cork, third among six sons of William Deasy, seaman, and Mary Deasy (née Murray). He was educated locally at Ballinadee before leaving school at 13 to work in nearby Bandon.…
Deasy, Rickard
Deasy, Rickard (1916–99), army officer and a founder of the National Farmers' Association, was born 13 March 1916 in Leeson St., Dublin, the youngest of three children (one son and two daughters) of Major Henry Hugh Peter Deasy, car manufacturer, explorer and son of the Clonakilty…
Deasy, Rickard Morgan
Deasy, Rickard Morgan (1812–83), MP, lawyer, and judge, was born 23 December 1812 in Clonakilty, Co. Cork, second son of Rickard Deasy and Mary-Anne Deasy (née Caller). He entered TCD in 1829 and graduated in 1833. After a distinguished,…
Deasy, Timothy
Deasy, Timothy (1838/41–1880), soldier, Fenian, and politician, was born in Clonakilty, Co. Cork. During 1847 his family emigrated to Boston, Massachusetts, and settled in the nearby city of Lawrence, in a district dominated by Irish immigrants. He may have completed an…
De Barra, Dáibhí (Barry, David; Dáth an Ghleanna)
De Barra, Dáibhí (Barry, David; Dáth an Ghleanna) (1757/8–1851), prose writer, scribe, and poet in Irish, was born in Woodstock, Carrigtohill, Co. Cork, son of Dáibhí, a tenant farmer on the earl of Barrymore's estate. He was educated locally and could read and write both Irish and…
de Barra, Leslie (Mary)
de Barra, Leslie (Mary) (1893–1984), republican and Red Cross pioneer, was born 9 January 1893 at 39 Royal Canal Bank, Dublin, daughter of Michael Price , blacksmith, and Mary Price (née Hamilton). Both parents were enthusiasitic supporters of…
De Bhailís, Colm
De Bhailís, Colm (1796–1906), composer of traditional songs, was born 2 May 1796 in the area known as Ceantar na nOileán (then an isolated island district), west of Béal an Daingin in Connemara, Co. Galway. The precise location of his birth is unknown; Denvir (p. 8) suggests three…
De Bhál (de bhFál), Éamonn (Edward Wall)
De Bhál (de bhFál), Éamonn (Edward Wall) (1667/8–1763), poet, was probably a native of Couragh in the parish of Dungourney, some 10 km north-east of Midleton, Co. Cork – the district in which he spent most of his life. Nothing is known of his immediate family, but a hostile…
de Bhaldraithe, Tomás
de Bhaldraithe, Tomás (1916–96), Irish-language scholar, was born in Ballincurra, Co. Limerick, one of five children of Pádraig de Bhaldraithe (1884–1953), civil servant, from Nenagh, Co. Tipperary, and Eilís Nic Conmara (1886–1973) from near Kilkee, Co. Clare. When his family…
De Blacam, Aodh (Hugh Saunders Blackham, Aodh Sandrach de Blacam)
De Blacam, Aodh (Hugh Saunders Blackham, Aodh Sandrach de Blacam) (1891–1951), journalist and politician, was born Hugh Saunders Blackham in London on 11 December 1891, son of William George Blackham, a Newry-born apothecary, and his English wife Elizabeth (née Saunders). He was…
de Blaquiere, Sir John
de Blaquiere, Sir John (1732–1812), 1st baronet and 1st Baron de Blaquiere , politician, of Ardkill, Co. Londonderry, was born 15 May 1732, fifth son of Jean de Blaquiere, an émigré huguenot merchant of Greenwich, Kent, England, and Mary Elizabeth de Blaquiere (née de…
De Brana, George
De Brana, George (a.1455–1529), bishop of Dromore and Elphin, was one of several foreigners provided to Irish sees in the second half of the fifteenth century. He is said to have been Athenian by birth and was almost certainly provided to the vacant see of Dromore on the…
De Breffny, Brian
De Breffny, Brian (1931–89), architectural historian, genealogist, and author, was born Brian Michael Lees on 14 January 1931 at 66 Gordon Avenue, Isleworth, London, the only son of Maurice Lees (Moses Leese), a turf accountant and taxi driver, and his wife, Marguerite Mary (née O'…
De Brún, Pádraig (Browne, Patrick)
De Brún, Pádraig (Browne, Patrick) (1889–1960), priest, scholar, and academic administrator, was born 13 October 1889 in Grangemockler, Co. Tipperary, third child and second son among four sons and two daughters of Maurice Browne (1844–1911), a national school teacher from…
De Buitléar, Éamon
De Buitléar, Éamon (1930–2013), filmmaker, environmentalist, author and musician, was born on 22 January 1930 in Renmore Barracks, Co. Galway, one of seven children of Colonel Éamon de Buitléar (1902–81), an army officer of Clanbrassil Street, Dublin, and his wife Nóra (née O'Brien…
de Búrca, Séamus
de Búrca, Séamus (1912–2002), writer and costumier, was born James Bourke on 16 March 1912 in Dublin, one of the ten children of the writer-actor-manager P. J. Bourke (qv) and Margaret Bourke (née Kearney), a Dublin seamstress.…
De Búrc (Búrc), Éamon
De Búrc (Búrc), Éamon (1866–1942), storyteller and singer in Irish, was born 2 April 1866 in Carna, Connemara, Co. Galway, son of the storyteller Liam a' Búrc. His mother came from Cashel, Roundstone, Connemara; other details of her are unknown. He was more commonly known as Éamon…
de Burgo, Augustine Gibbon
de Burgo, Augustine Gibbon (1613–76), one of the most eminent of Irish counter–reformation theologians and an erudite writer on the Lutheran–Calvinist controversies of his day, was born in Connacht and entered the Order of the Hermits Augustinian at Ballinrobe, Co. Mayo, at age 20…
De Chenu, (Roger) Noël
De Chenu, (Roger) Noël (1924–2002), architect, artist and actor, was born on 25 December 1924 in Drumcondra, Dublin, the son of Roger Louis de Chenu (1891–1964) and his wife Aileen (née McShane; b. 1893). Roger, a dress designer, originally came from Poitiers in France, and is said…
Declan (Déclán)
Declan (Déclán) (fl. 5th/early 6th cent.) of Ardmore, saint in the Irish tradition, bishop and patron of the Déisi of East Munster. The martyrologies and genealogies give inconsistent information about him, but according to tradition he was born in Drumroe, near Cappoquin…
Deegan, Columbanus
Deegan, Columbanus (1925–2007), war veteran and Franciscan friar, was born John Joseph Deegan on 4 April 1925 at 23 Usher's Island on Dublin's south quays, one of three boys of James Deegan, a labourer, and his wife Annie Deegan (formerly Finnegan; née Quinn). Known in his youth as…


The Sonnet, Kolkata is ready to meet the needs of discerning travellers with its contemporary space, ultra modern ambience, varied dining experiences, state-of-the-art technology and comprehensive in-house facilities. Uniquely positioned to offer a 4-star luxury experience in the heart of Kolkata's IT district, the hotel is an ideal venue for business events. The Sonnet caters to the needs of leisure and business travellers seeking the finest facilities and world class service.


I first became interested in hiking the AT, while going through chemotherapy for Non Hodgkin's Lymphoma, which I was diagnosed with in October of 2008. I came across Jean Deeds' book, "There Are Mountains To Climb" in the share library at the infusion center. Jean was a 52 year old woman who aspired to hike the AT in her middle years, and did finally complete it after an injury threw her off trail for some time.
I thought to myself, "I want to do that. If she can do it, I think I can, too".
Although I am currently in remission and hopefully shall continue to be so for a long time, it's not one of the 30+ types of NHL that is actually curable. Time really is tick, tick, ticking … the time is now, as I just don't know how many seasons I will be gifted with. I hope that in this transcribing of the journey, others with chronic illnesses realize that these limitations and challenges can be worked around, that illness doesn't have to stop you from living out your dreams.
I was not in the best of physical shape after nearly 2 years of treatments, and a 25 year smoker, so at age 54, I took up running – which has increased my leg strength and cardio capacity greatly. Believe me, I did not start out "running" miles and miles, rather, it's been a slow incremental process, but I can honestly say I'm in the best shape of my life.
I had never even heard of the AT previously, although had been a car camper and day hiker in my native Oregon. I began reading everything I could get my hands on about hiking long distances, along with the books out there about the long distance trails.
Perhaps the most challenging thing the Appalachian Trail will present is facing one of my worst phobia's: thunderstorms.
Oddly enough, my Great Great Grandparents came from the beginning area of the AT – NE Georgia and the area around Canton, NC and Hall County, Georgia. My Great Great Grandmother was Cherokee (and possibly part Catawba) and the Great Great Grandfather's mother was Native, although I don't know which tribe. I have one photo of her. They left Georgia and moved to Arkansas (She walked, unable to ride the horse because she was pregnant). One of their daughters (my Grandmother's mother) married and migrated to Oregon.
My Grandmother, unfortunately, was from the old school thinking "throw 'em in the pool to teach 'em to swim", to get over fears.
I'm middle aged now and still have a very distinct reaction when storms brew up…all systems are "go" and my body still goes into total flight or fight response.
I now think that perhaps Grandma, who carried many of her Cherokee ancestral beliefs and practices, found magic in the Thunder, and could not understand my fear.
It's one of the most engaging lures for me – this reverence for Thunder, the draw to the place my family came from. The facing of my worst phobia.


text:
System Shock 2 Melee-Only Walkthrough
God save the UNN . . . their weapons sure won't.
Sector C Continued
Bulkhead 43
Preliminaries / Top
When you get to Deck 4, there's really nowhere else you can possibly go but bulkhead 41. It's directly to the right of the elevator. Walk through the door, and stand by the female corpse in the chair, to her left, with the desk to your right. It's the best view to watch the following scenes in. Take out any implants, you won't need them during the show. Just sit back and enjoy it.
I've got a bad feeling about this.....
Once it's over, there's really nothing to hang around for. Neither Polito, the gun on the floor, or the desk, have anything in them. Approach the bulkhead to trigger the e-mail from Shodan, then go through the bulkhead once it's done.
There are a few little things you can do in this central room. There are crates to your right, if you search them you'll get stuff in the form of a maintenance tool, 4 packs of cigarettes, and a log. Across the room is a resurrection station, activate it. In front of the sliding doors lies a log. Listen to it. Isn't it wonderful how bad guys always leave clues that tell you exactly how to foil their evil plans? Judging by the 2 logs you have, you know that Malick was the one taking out the Sim Units, and Malick has created overrides for his experiments with the Sim Units. You just have to keep an eye out for his 3 special friends in red. For tips on dealing with his friends in red, and their identical friends dressed in black, take a peek at Interlude 4. Also, tips on deciding which deck to do first are hiding there.
Sector B / Top
Head through the door, and you'll see the first victim. Follow him. You won't be able to keep up with him probably, but he'll corner himself quite nicely. There's a camera in the hallway he ran down, take it out. Go through the door, and you'll be in large, 2 story room, kind of a hallway I suppose. At the far end, near the room the assassin ran into, there's a new hybrid, a grenade hybrid. If you ever succeeded in dodging one of the toxin balls flying out of an egg and didn't need to use 2 toxin hypos to heal yourself afterwards, these guys are no trouble. The exploding grenades makes a loud noise that alerts everyone nearby, that's really all you have to worry about. Take him out, maybe try dodging a grenade or two if you wish. There's another grenade hybrid on the second floor, and the assassin in a room nearby, but neither are going to cause you trouble, so don't worry about it.
When it's time for the assassin, there's two options for how to deal with him. The first is the normal way of doing things, simply running into the room, charging him, beating him down, and taking his chip. The second way I uncovered during a game where I refused to kill anything myself. If you go to the second floor of the area you're in, the grenade hybrid will behind hurling grenades at you. Smash the largest window, the one overlooking the conference table, yourself, (the splash damage from the grenade hitting the window might injure you otherwise) and carefully position yourself so the grenade hybrid will hurl grenades at you, miss, and the grenade will land in the back of the conference room, which is where the assassin is. Odds are you can just turn around and keep an eye on the assassin to make sure he's where he needs to be, the hybrid couldn't hit you if his life depended on it. Once the assassin is dead, add the grenade hybrid to the casualty list.
Now, you can explore the rooms at your leisure. I'll list what's in each of them, go back to the doorway you entered from, start with the door to the left. Let's just call it door #1. In the room, there's a log, and a rad hypo, and two eggs who'll drop worms on your head if you get too close. My advice - don't go near the children. Behind door #2, there's a med hypo in a desk, and 15 nanites in the other. Behind door #3 is the conference room, and likely the corpse of a certain cyborg assassin. Behind door #4 are 18 bullets in a desk. (12 in the gun, 6 on their own.) Behind door #5 there's 6 anti-personnel bullets in a desk.
There's a grav shaft leading up to the second floor, take out the grenade hybrid, (assuming you haven't already) then return to the shaft, and go to the first door to your left. And behind door #1 is... nothing. Behind door #2, *there's a beaker in a desk,* and 15 nanites and 2 cyber modules down a little ladder. It's a trap, you'll get hurt if you go down there. But, hell, why not go for it? Behind door #3, there's 20 nanites in a desk. Behind door #4, there's... nothing. Behind door #5, there's nothing again. So, we might as well go back down. *Go back the way you came, and at the intersection turn right and go through the big sliding doors, picking the log up off the floor along the way, and 6 rifled slugs off the corpse on the other side of the door.*
You shouldn't be far at all from the grav shafts. When you go up, beware the monkey. Notice how he's red instead of blue? He fires a pyrokinesis blast.
Oh, goody. Just what I needed, a hotshot monkey.
Kill everyone up there, and swipe 3 cyber modules on a corpse by the stats upgrade unit. If you're planning on using the crystal shard, and don't have it or the skills for it just yet, you might as well upgrade your exotic weapon skills to 1 now, that's all you need. *There's 2 pool cues up here, they're recyclable, but they take up 3 inventory slots, so you should probably store them somewhere for later, unless you went to Rec first and have the recycler handy.*
When you go back down the grav shafts, there's two big sliding doors which lead to an unmarked area on your automap. Go straight ahead, ready to swing, a grenade hybrid will come out of the doors in front of your face. Once he's dead, continue down the hall to some grav shafts. Take them down, and begin looting the rooms to the left of the shaft. Behind door #1, a corpse with a log by Malick beside it. Malick's death log by the sound of things. If you wish, hit him, he's the reason you're having to fix all the sim units in the first place.
As gross as it is, there's a smidge of satisfaction in the squishy sound of the wrench hitting the dead Malick.
*There's also 6 anti-personnel shotgun shells in the locker.* Behind door #2, an egg, 12 standard bullets, a log, and standard combat armor. If you still have light armor as backup, throw it away and take the standard armor instead. Behind door #3 are some very fond memories. I'll share for the hell of it.
I'd wimped out and got the no-spider patch, and forgotten that the two doors that don't open right away released a spider when they did open. When I got my new computer I forgot to install the no-spider patch, and decided to not bother. When the doors opened, I didn't worry at all. Then, I noticed my sound card popping. I didn't worry at first, then I remembered—this sound card was new, and didn't pop, and the sound was coming from behind me. Then I turned around and saw a spider flying at my face...
Long story short, there's a big fat juicy spider who can jump, and comes through the door once you pass the doorway into the room with the piano. Enchantermon shared a handy little strategy for killing him, I'll let him tell you in his own words how he did it:
On my screenie run, I backed into the room, and when the doors opened, slipped silently around the corner. Much to my surprise, the spider came out into the hallway, and, after a few seconds, patrolled up to the doorway, turned on its heels, and walked back to its room. Seizing the opportunity, I jumped him. Just thought it would be worth mentioning, as those buggers can really hurt you.
Turn around and back into room(A). When marked door(B) opens, run to ambush corner(C) to ambush big, fat, juicy spider(D, not shown).
There's an auto-repair unit on the floor, and 30 nanites and 3 cyber modules in the locker. *When you leave, hop into the water, and look back at the door. Above and to the right of it, on a ledge, you should see 30 nanites. They're within reach, surprisingly enough. Thanks to Enchantermon, Waffnuffly, and D'Arcy for their joint efforts in resolving the mystery of the easiest way to get to those damned nanites!*
Behind door #4, there's 20 nanites and a toxin hypo in a locker. Behind door #5, there's a pipe hybrid by the bed. As he said when I walked around the corner and ran into him, watch out!
WARNING Hybrid alert in the bedroom! Approach with caution! Terminate with extreme prejudice!
In the gun near the female corpse you'll find 2 bullets, in the locker there's 1 med hypo, and in the bedroom, a plant. And that's all there is down here, head back up.
Go towards the body, and the sound of the worms. Search the body to snatch 12 anti-personnel bullets, and you'll meet those worms. You'll likely hear, or even see, a shotgun hybrid down the hallway, and hear a camera to your right. If you need to go down the hallway towards the hybrid, take down the camera first. Once they're no longer a concern, look to the lower story. There are lots of worms down there, but nothing that can't be dealt with.
When I got down here, a protocol droid showed up above, waiting for me to return, and later so did a grenade hybrid. Wave to him, as it's likely he's waving to you. I noticed the grenade hybrid shaking his fist at me, a hold over from Thief which I thought was pretty funny. Not as funny as seeing a rumbler doing the frustration dance, though. (If you don't know what it is, you'll have a perfect opportunity to find out on the Rickenbacker, in Pod 1.)
Anyways, while you're down here, search and destroy all the eggs. Go back to the grav shaft leading down, and start searching the rooms, naturally starting with the door on your left. Behind door #1 are several eggs and worms, and a maintenance tool in a locker. Behind door #2 there's 6 armor piercing bullets by the toilet (hey, you should always be prepared, right?), and 3 cyber modules in the locker by the nearest bed. Behind door #3 there's lots of fun. There 2 eggs which release swarms, 1 toxin egg, and a cyborg midwife. Kill the lady, destroy the eggs and run out. When the swarms die off, you'll find a speed booster, and 20 nanites in the near locker, then 6 rifled slugs, 3 cyber modules in the far locker, *and a plant by the door.*
Behind door #4, there are worms that fall out of the ceiling, and an egg. In the way of goodies, there's a psi hypo *and a beaker* in the nearby locker, 20 nanites in the security crate, *and a plant by the door.* Behind door #5, there's a shotgun hybrid who runs out of the far room. In the rooms themselves, there's a psi hypo and 10 nanites in one locker, and a SwiftBoost implant in another. And, finally, behind door #6, you'll find a pyro monkey by the locker with 12 armor piercing bullets and a med kit in it. The monkey makes no noise for me, it's not fun searching the crate and getting a pyrokinesis blast up your ass, then hearing the monkey scream as the blast kills him, but not me.
Head up, and deal with any friends who showed up, then head on down the way you haven't gone yet. In case you don't know which way that is, check your map, and head towards the chemical store room.
Attention all shoppers! Follow the red line to free chemicals for all your pharmecutical needs!
If you've been trying to research anything, but don't have the chemicals for it, see if what you need is in here. By the way, you know that one psi-booster that you need the chemicals Na and Ir to research? Once it's researched you can recycle it, but you need to know what it is first. Seems like it's worth the trouble for me, get the chemicals here. In the crate just before the bulkhead, you'll find an EndurBoost implant, and 25 nanites. Speaking of the bulkhead, as you've completely cleared this area, it's time to head through it.
Sector C / Top
When you arrive, you'll hear a camera to your left. Run and take it out. There's a protocol droid down the way, now is a nice time to practice your explosion dodging skills, or try to learn them. In the long hallway with the two eggs above it, there's 20 nanites. What you'll discover when you go up there is that there's two hidden eggs up there. You'll probably trigger 3 of them getting to the nanites, and each drops 2 worms. If you want to try for it, you can jump onto the railing beside the eggs, then swing and lean forward. You can take them out fairly easily that way. It's just the hidden ones then that'll cause you trouble. Especially if they land on your head and you run in circles trying to figure out where the worm is...
So.....what exactly is keeping these worms off of the floor, anyway?
Anyways, once you're done with that, there's, yet again, lots of rooms to go through. Head left out of the bulkhead, and the first door you get to is door #1. Behind it is... nothing. Behind door #2 is one of the Sim units. You only have 1 sim unit card at the moment, but it's for this unit, luckily. Click and drag the card on it, and clear up an inventory slot and receive 15 cyber modules. Behind door #3, in the locked crate, is a LabAssistant implant, and 15 nanites. Behind door #4 is a log by Malick, in the desk. Behind door #5 is *a psi hypo on a corpse,* and the crystal shard. So, do you want to use it? If so, you need to research it. Might as well get it going now. (I really haven't been very smart this time through. I didn't heed my own advice and forgot the chemical I need to research it on Deck 2. Not only that, you need a research skill of level 4 to research it, and I'm still at 1. Well, it seems I shall continue wrench only for a while.) Behind door #6 is nothing, yet again.
As you're done here, head left towards the sound of the worms. When you walk around the corner past the corpse they'll see you and come to say hello. There's a corpse hanging off the ceiling, approach him and some more worms will show up to say hello/commit suicide. There's a psi hypo on the ground below our ceiling friend, and he's got 3 cyber modules and 3 grenades still in his pockets. Keep the wall on your left, and you'll see you're at the mess hall. There's a corpse on the ground by the replicator, (where isn't there one?) swipe his 6 anti-personnel bullets, and get 2 bullets out of his pistol. Now, I normally avoid this part, but since I'm doing this for you guys, I'll put up with the mess hall. If you don't want to get torn to shreds just to say you've gone through the entire level, skip to the next part.
Well, what kind of co-author would I be if I didn't brave the Mess Hall to get some screenies? Onward!
Mess hall / Top
Take the left door in, that way you won't risk the turrets locking onto you. If you want to search to where the turrets are, it couldn't hurt to take out the security. Leaving the security enabled may in fact prove a bit painful for good old Goggles. Down the ramp to your left, and you'll trigger a ghost scene of the massacre that happened there, which will trigger a maintenance robot being spawned. Stay near the top of the ramp, when he shows up kill him swiftly. Then go to the security station on the other side of the column in the room, take down the security, *grabbing the log next to the table next to the window first,* and haul ass to the other side of the mess hall, where the camera and the turrets are. If you mantle onto the table under the camera, you can destroy it. The two turrets can be destroyed normally. There's a female corpse by one of the turrets, she has 25 nanites on her. Go down the ramp back to the area where the camera is, there's a corpse with a maintenance tool on him.
Now, it's time to go to the bathroom. Down the men's side, there's a really, really odd shotgun hybrid. Not only does he not make a single sound, but he doesn't move, although it could just be a bug in my version of the game. There's an egg nearby which isn't so harmless, it releases worms.
That's odd. The female annelids are in the men's bathroom.....
*Once you've dealt with the egg, swipe 25 nanites out of one of the stalls,* then go into the girl's bathroom, and you'll find an egg that releases annelid swarms.
...and the male annelids are in the women's bathroom. O_o
Destroy it and run. When the swarms die off, destroy the toilets, and you'll notice there's version 2 hacking software in one of them. Odd. Check the corpse, she has 6 armor-piercing bullets and 20 nanites which she obviously won't need anymore. *You'll also get 3 bullets from the pistol by her hand.*
There, Enchantermon, are the grammar police happy now? ;-)
Return to the area with the huge massacre ghost scene. There's a door leading in back to the kitchen.
(*pokes head in door* HEY! I NEED TWO BIG MAC'S, A TRAIN WRECK SPECIAL, AND THREE SKINNY-BOY DECAF MOCHA LATTES OUT HERE, ON THE DOUBLE!
Hang a right once you go through the door and you should be there. Beware the monkey, I wasn't able to hear him either, although, again, it could just be a bug in my version of the game. Another situation where I was oblivious to the monkey until I got a pyrokinesis blast up the ass. In the room by the monkey, there's an overturned table with 10 nanites and 3 cyber modules in it, and lots of chips. Head out, and go to the cold storage area. On the corpse by an annelid swarm egg you'll find a med hypo, and in the gun near her, there's 1 shotgun shell. There's an awkward to reach corpse in one of the storage thingies, just past a 'pile of disgusting worms', who has 15 nanites on him. *There's also 12 armor piercing bullets by an egg which releases worms, and 2 worms on a shelf.* And, that's about all I could find. Head back out via the doors you came in by, the ones by the replicator.
Sector C Continued / Top
You likely heard hybrids nearby, when you leave the mess hall hang a left, and head towards their sound. You'll see a radiated hallway, and a ramp leading up and around the radiation. Go up the ramp, and kill the 2 hybrids you find. When you go down on the other side, you'll find *a log,* and a female corpse, snatch her 6 rifled slugs and 20 nanites. There's a shotgun just past her with 1 slug left in it, might as well take it too. When you were up the ramp you probably heard eggs, they're in the door under the ramp you came up. It's before the radiation, so you should backtrack to get there. Considering there's some goodies in the form of 3 cyber modules, an ice-pick, and 6 rifled slugs, in addition to the eggs, you might as well head back. And I swear, this wasn't the first time I saw that room. Honestly.
I recently played SS2 through on Impossible, and I noticed that there was no ice pick in this room on that difficulty setting.
In the corpse by the radiation leak, there's a rad hypo, and 3 grenades. There's a recharge station and a security crate near here, in the crate there's 6 armor piercing bullets and 20 nanites. Head down the hall, and you'll meet a shotgun hybrid, and another red cyborg, who'll promptly take off and leave the shotgun hybrid and you alone. Search the corpse by the resurrection station, he has 3 grenades and 6 standard bullets, and activate the station.
If you keep the wall on your right, you'll come to a door, and 3 crates. There's 6 anti-personnel shotgun shells *and 12 standard bullets* in one of them. Go into the room, and search the corpse to get his toxin hypo and 10 nanites. Go up the grav shaft, and kill the numerous worms that appear out of the corpse. Once the room's secured, you'll find 2 drinks on a shelf, a med hypo and maintenance tool on the corpse, and 2 pool cues on the pool table.
Too bad this is a melee-only run, if it wasn't, we could shoot some pool! *rimshot*
When you go back down, check between the two benches, there's another maintenance tool back there. There's also 2 cyber modules on one of the benches. You can upgrade yourself here, if you want.
Now's time to deal with the cyborg. Head out the door, and go to the hallway he ran to, the one with the steam coming out of it. Destroy the camera to your right, and go into the room. Provoke the cyborg to move around the room, and let time take care of business. Exploding barrels fall from the roof, and even if they kill you, they'll likely also kill him too. Once he's dead, wait for the explosions to stop, then it's safe to explore.
In the far corner, out of sight of the door, where you probably found the cyborg cowering originally, there's a med kit beside an EMP rifle, *and a WormMind implant.* In the corpse across from it, you'll find 20 nanites. If you search the crates, you'll find nothing *aside from a small beaker in the crate on the far left.* Just make sure you took the cyborg's card, then head left to the exit. There's a log with the code to a weapons lockup by a steaming turret, which is destroyed, don't worry. It holds a portable battery, actually. On the corpse you'll find 2 cyber modules and 6 anti-personnel shotgun shells, and in the shotgun nearby, 1 shotgun shell.
As you're done here, go through the bulkhead. It's actually bulkhead 42, which leads to the main room with the elevator. As we cleared out this sector already, there's a good chance a friend or two may have spawned here. I got a shotgun hybrid, a simple overhead swing dealt with him. As there's only one bulkhead left to deal with, go through it. Time for the toughest part of Deck 4, bulkhead 43... (if you run to Med/Sci Deck to heal up before going there, we have something in common.)
Bulkhead 43 / Top
Semi important note: when I was writing the walkthrough, I messed up big time. I meant to do things in the layout that it'll be in here, but due to a significant screw-up involving the first turret you find, a grenade hybrid, and a homicidal monkey, I got side tracked and completely forgot about how I originally planned to do things. I meant to have dealing with Sim unit 3 pretty much the first thing you do on this deck, but when I took notes I did it last. I tried to fix it up, but if it's still a bit confusing, that's why. Okay, here it goes!
When you arrive in here, you go down a short hallway, then can go right down towards a turret, or straight ahead. Go straight ahead, there's a few hybrids around here you need to deal with. Kill the first one, a grenade hybrid, then search the area here to find a ladder, which leads to catwalks above the room.
Here's the ladder, in case you're having trouble locating it.
Searching the catwalks will yield 3 cyber modules when you find the corpse under the egg with the annelid swarm. When you go back down to the lower level, track down the auto-repair unit by a corpse, if you haven't already found it.
Another visual aid for those who couldn't find it.
Keep sharp, because another grenade hybrid will make an appearance soon.
(Originally written after the other Sim unit was taken down, and everything else was done, the most nitpicking opportunities will be here, hopefully)
Once you're done, go through the nearby door, which leads into a spot in the mini-map that isn't filled in.
That would be this door.
If you see a log on the other side of the door, by Malick, you're heading the right way. Go left, and run down the hall and take out the camera. If you go right, you'll be playing a game of chicken with a turret, which is aiming right in your direction when it comes out of standby. In other words, it's not such a good idea. When you go into the rooms here, you'll have the perfect opportunity to ambush it. Check your mini-map. There's a room that has a door right beside the turret, if you go out there, and slowly circle the turret so it can't get a steady shot at you, you can destroy it.
This is the door you want to use for your ambush.
Once you're ready, return to the catwalks in the middle of all of the room in this area. There's *15 nanites and an ExpertTech implant in the desk in the first room on the right, and in the first room on the left, there's a small beaker.* Check your mini-map, you're about to deal with Sim Unit 3, which is booby trapped, like the log said. There's a room with the numbers 3 and 4 in it, and two ladders leading down. Whatever you do, don't go down there! You'll be using them to escape. Go to the catwalks as far away from there as you can, and look down. See Sim Unit 3?
Okay, so.....what? Do you expect me to jump down there?
Now, get the card into an easy to reach slot. Try to jump onto the railing that runs towards and over the Sim unit, then drop onto it, and reprogram it. It's the easiest railing to leap onto, so you shouldn't have any trouble.
Me and my big mouth.....
If you do, just vault over the railing and crash to the ground. You may take more damage, but that's life. Once the unit's reprogrammed, make a beeline for the ladders to avoid the spiders. *Or, if you're feeling lucky, well, I'll let Enchantermon take the stage... *
There's six standard bullets and a laser rapier on the female corpse in front of the sim unit, and three standard bullets in the gun by her hand. Believe it or not, I managed to get a hold of these goodies without any damage from the spiders. First, before going down, clear out three inventory slots, six if you're also going for the rapier, seven if you don't have a slot for standard bullets. Drop onto the sim unit, reprogram it, then get the spiders to follow you on a merry chase around the pillar in front of the corpse. When you get far enough ahead of the spiders, grab the bullets off of the corpse, then on the next pass, grab the laser rapier, and on the final pass, grab the gun and run for the ladders. You can unload the gun and toss it once you're safe.
Once you're running for the ladders, you'll see there's eggs by them. If you go up, you should be safe from the swarms. Now, head back to the hallway with the turret in it, which you haven't gone down yet.
(What I wrote before I did the sim unit section mentioned above)
When I approached the hallway with the turret down it again, both a grenade hybrid and monkey were on their way looking for me, the hybrid I'd killed had a chance to throw a grenade and alert them. As they were going to sneak up on me and tear me apart if I avoided them, I finally broke down and killed them both. Since I had to get into the hallway to do this, the turret was alerted. I waited until the turret went into stand-by mode, you can hear it when it happens, then I charged it and destroyed it.
When you've finished it off, listen a moment. Do you hear an odd squishy noise to the hallway down to the right, the same direction as the camera you hear? Destroy the camera and you'll meet the creator of that noise... a spider. Yippee! Kill it, then activate the resurrection station. Hope you have lots of nanites, you may very well be massacred shortly.
If go out of the station, and look to your left, you'll notice a keypad. Well, you received a code earlier on the deck for an armory. Shall we try it? 13433, for the lazy.
If you have the laser rapier, now would be a very good time to equip it.
On the other side is a brand new robot to play with! Take him out, and get 12 bullets from the assault rifle, and 6 grenades from the back room. Or, just not bother with him. Your decision.
Leave the room, head straight ahead, and get 6 anti-personnel shells off the floor in front of the replicator. If you haven't gone to Rec deck yet, you may wanna hack this replicator, with either an ice-pick or your ub3r l33t hacking skills, because you get a recycler from it. If you went to Rec already, don't bother, either you already have a recycler, or you're about a hop and a skip away from the replicator which only needs a repair tool before it'll give you a recycler.
Once you've got it, go to your right. There's a turret in this hallway, by a recharge station, there's a conveniently place security station near a door here. If you're hacking, you can just slip into the room here, and hack the nearby security machine to be in relative safety while you pound the turret to death.
If you're not hacking, try out this trick Marecki told me. If you crouch and squeeze yourself as far as you can between the turret and the recharge station, for some reason it won't be able to hit you. The explosion will probably kill you, but that's life.
Speaking of the room by the security station, if you raid it, you can find some supplies. A log, 75 nanites, a silent egg, 3 cyber modules, a ton of worms, and a spawned grenade hybrid. Remember this room, we'll be running here later.
Since we're going to be stepping straight into hell soon, let's backtrack a bit. Go back to the turret by the ramp, and keep going the way you haven't gone just yet, you should see a log on the floor by a door. There's more bunks here. In the lockers, you'll find a BrawnBoost implant, 45 nanites, and a speed booster. Be forewarned, when you reach the back of the room, 2 shotgun hybrids will appear, but they're nothing an overhand swing with your wrench won't deal with. Once you're done with that, leave the room.
Hang a right and run down the hallway, there's a turret you want to take out. When it's gone, go into the large, empty room with the 12 anti-personnel bullets in the center, snatch them, then go to the upgrade units. There's a corpse in the middle with 3 cyber modules, might as well take them, he obviously can't use them. If you want to, get some upgrades. If you want, say, more hitpoints to deal with the next part, help yourself.
Once you're done with, head back to the hallway with the destroyed turret by the recharge station. Head down the hallway, when the door opens, run to the turret to the left. There were originally 2, but someone who's probably dead by now destroyed the other. Bang on the turret, try to destroy it before the shotgun hybrid, robot, and spider nearby come in the room.
When you're resurrected, go back to the room by the security station and the remains of the turret near there. Look down the hallway towards where your foes will be approaching from, and be ready to duck back into the room when they do. Marecki told me that it's much easier to destroy the robot when you're hiding behind the pillars in this room, if you're lucky they'll block the explosion that follows the robot's death. Don't bother using med hypos during this particular fight, unless you start running out of nanites, or you can't get a single hit in without getting killed, or the baddies are standing right in front of the resurrection station.
Once the spider, hybrid, and robot are killed, you're almost done here. Go back to the two-turret room and search them both for supplies, and get the 6 armor piercing bullets off the corpse.
Head straight down the hall, and you'll find the final red cyborg. Be ready to swing as soon as you can, he'll take off running down a hallway with a camera in it, and odds are you won't catch him before he's in it. Marecki pointed out that it's easier to just let him go once he reaches that hall. Once the door the assassin runs through closes, (assuming it doesn't just stay open) run down the hallway and destroy the camera. Then, go through the door, and give the assassin the same fate as the camera.
Once you kill him, conveniently enough you're right next to the sim unit he has the card for. This room is the one you may or may not need the security card from Engineering to get into. It's an absolute mess in here, but there's goodies to be found.
Allow me to be the first to say: Where are the guts that are supposed to be hanging out of Bronson?
You'll find: 6 anti-personnel shotgun shells, 12 standard bullets, 1 maintenance tool, 1 Diego log, 1 Bronson log, 1 psi hypo, and 40 nanites. Marecki reminded me that you need to watch out while you're searching this area. As he said:
Once you've reprogrammed the sim unit two shotgun hybrids and a spider are bound to show up in the area, one by one. Taking them out is easy, but only if they don't catch you with your back to the door and sifting through Bronson's intestines in search of useful equipment.
When you leave through the hall, before you get to the junction room again, you'll notice a room to your right with an elevator in it. Take it down, and you'll find some corpses in cells. There's one cell you can walk into, after a ton of worms spawn, search the body and find some kind of implant. Turn to leave, and you'll notice the cell bars that you can see on the other cells have shown up.
I didn't do it! Honestly! I was framed! I WAS FRAMED!
Look up, and you'll see some stuff to break. Break everything within reach, and you should be able to leave.
When you reach the junction hallway again, head straight across. There's a log by Delacroix on the floor, and just to the left of the huge mess around the corner, you'll find a med kit, *and 2 cyber modules in the hole in the floor.* When you're back in the junction room, go right, and you'll alert a camera. Destroy it, and remember this area. You'll be coming back here later.
When you go to leave here, you'll notice a ramp leading down. Oh, hell, why don't we go check this out? I mean, the worst that could happen is we get killed, and sent back to the resurrection station, which is closer to where we want to go anyhow. There's 4 doors down here, naturally, we're starting with the one to our left. Behind this door is an incomplete surgery unit. Behind door #2, we have lots of worm piles, 6 rifled slugs, and a maintenance tool. Behind door #3, we have a corpse with 2 cyber modules, and to the right of his head, on the floor behind a chair, we have a log, which is the code to the armory on Deck 2. Handy this late in the game? If you want a few nanites, I suppose so. Behind door #4, we have a monkey, and who shot me in the face with a pyro blast, killing both of us. If you come back, you'll find a psi booster behind his corpse.
Get out of bulkhead 43. Run for it, and get out, killing anyone you come across, since you'll be coming back here. When you get to the elevator, you may have a very, very nasty surprise waiting for you. I had 2 cyborg assassins, a shotgun hybrid, and 21 hitpoints coming in here. I wasn't exactly amused to put it mildly. I managed to kill them all, and ran into the elevator, and headed to my safe spot, Deck 2, as we're done on Deck 4, for a little while. Depending on how you did things, either you want to get ready for, then head to, Rec deck, or you want to get ready for, then head to, Command deck.
During my game where I noted what stats I upgraded when, I did this level after rec deck. I took my exotic weapon skills to level 6, and my agility to level 3.
© TheNightTerror 2005.


text:
#include <config.h>

#include <assert.h>
#include <sys/types.h>
#include <getopt.h>

#include "system.h"
#include "error.h"
#include "fadvise.h"
#include "hard-locale.h"
#include "linebuffer.h"
#include "memcasecmp.h"
#include "quote.h"
#include "stdio--.h"
#include "xmemcoll.h"
#include "xstrtol.h"
#include "argmatch.h"

/* The official name of this program (e.g., no `g' prefix).  */
#define PROGRAM_NAME "join"

#define AUTHORS proper_name ("Mike Haertel")

#define join system_join

#define SWAPLINES(a, b) do { \
  struct line *tmp = a; \
  a = b; \
  b = tmp; \
} while (0);

/* An element of the list identifying which fields to print for each
   output line.  */
struct outlist
  {
    /* File number: 0, 1, or 2.  0 means use the join field.
       1 means use the first file argument, 2 the second.  */
    int file;

    /* Field index (zero-based), specified only when FILE is 1 or 2.  */
    size_t field;

    struct outlist *next;
  };

/* A field of a line.  */
struct field
  {
    char *beg;			/* First character in field.  */
    size_t len;			/* The length of the field.  */
  };

/* A line read from an input file.  */
struct line
  {
    struct linebuffer buf;	/* The line itself.  */
    size_t nfields;		/* Number of elements in `fields'.  */
    size_t nfields_allocated;	/* Number of elements allocated for `fields'. */
    struct field *fields;
  };

/* One or more consecutive lines read from a file that all have the
   same join field value.  */
struct seq
  {
    size_t count;			/* Elements used in `lines'.  */
    size_t alloc;			/* Elements allocated in `lines'.  */
    struct line **lines;
  };

/* The previous line read from each file. */
static struct line *prevline[2] = {NULL, NULL};

/* This provides an extra line buffer for each file.  We need these if we
   try to read two consecutive lines into the same buffer, since we don't
   want to overwrite the previous buffer before we check order. */
static struct line *spareline[2] = {NULL, NULL};

/* True if the LC_COLLATE locale is hard.  */
static bool hard_LC_COLLATE;

/* If nonzero, print unpairable lines in file 1 or 2.  */
static bool print_unpairables_1, print_unpairables_2;

/* If nonzero, print pairable lines.  */
static bool print_pairables;

/* If nonzero, we have seen at least one unpairable line. */
static bool seen_unpairable;

/* If nonzero, we have warned about disorder in that file. */
static bool issued_disorder_warning[2];

/* Empty output field filler.  */
static char const *empty_filler;

/* Field to join on; SIZE_MAX means they haven't been determined yet.  */
static size_t join_field_1 = SIZE_MAX;
static size_t join_field_2 = SIZE_MAX;

/* List of fields to print.  */
static struct outlist outlist_head;

/* Last element in `outlist', where a new element can be added.  */
static struct outlist *outlist_end = &outlist_head;

/* Tab character separating fields.  If negative, fields are separated
   by any nonempty string of blanks, otherwise by exactly one
   tab character whose value (when cast to unsigned char) equals TAB.  */
static int tab = -1;

/* If nonzero, check that the input is correctly ordered. */
static enum
  {
    CHECK_ORDER_DEFAULT,
    CHECK_ORDER_ENABLED,
    CHECK_ORDER_DISABLED
  } check_input_order;

enum
{
  CHECK_ORDER_OPTION = CHAR_MAX + 1,
  NOCHECK_ORDER_OPTION,
  HEADER_LINE_OPTION
};

static struct option const longopts[] =
{
  {"ignore-case", no_argument, NULL, 'i'},
  {"check-order", no_argument, NULL, CHECK_ORDER_OPTION},
  {"nocheck-order", no_argument, NULL, NOCHECK_ORDER_OPTION},
  {"header", no_argument, NULL, HEADER_LINE_OPTION},
  {GETOPT_HELP_OPTION_DECL},
  {GETOPT_VERSION_OPTION_DECL},
  {NULL, 0, NULL, 0}
};

/* Used to print non-joining lines */
static struct line uni_blank;

/* If nonzero, ignore case when comparing join fields.  */
static bool ignore_case;

/* If nonzero, treat the first line of each file as column headers -
   join them without checking for ordering */
static bool join_header_lines;

void
usage (int status)
{
  if (status != EXIT_SUCCESS)
    fprintf (stderr, _("Try `%s --help' for more information.\n"),
             program_name);
  else
    {
      printf (_("\
Usage: %s [OPTION]... FILE1 FILE2\n\
"),
              program_name);
      fputs (_("\
For each pair of input lines with identical join fields, write a line to\n\
standard output.  The default join field is the first, delimited\n\
by whitespace.  When FILE1 or FILE2 (not both) is -, read standard input.\n\
\n\
  -a FILENUM        print unpairable lines coming from file FILENUM, where\n\
                      FILENUM is 1 or 2, corresponding to FILE1 or FILE2\n\
  -e EMPTY          replace missing input fields with EMPTY\n\
"), stdout);
      fputs (_("\
  -i, --ignore-case  ignore differences in case when comparing fields\n\
  -j FIELD          equivalent to `-1 FIELD -2 FIELD'\n\
  -o FORMAT         obey FORMAT while constructing output line\n\
  -t CHAR           use CHAR as input and output field separator\n\
"), stdout);
      fputs (_("\
  -v FILENUM        like -a FILENUM, but suppress joined output lines\n\
  -1 FIELD          join on this FIELD of file 1\n\
  -2 FIELD          join on this FIELD of file 2\n\
  --check-order     check that the input is correctly sorted, even\n\
                      if all input lines are pairable\n\
  --nocheck-order   do not check that the input is correctly sorted\n\
  --header          treat the first line in each file as field headers,\n\
                      print them without trying to pair them\n\
"), stdout);
      fputs (HELP_OPTION_DESCRIPTION, stdout);
      fputs (VERSION_OPTION_DESCRIPTION, stdout);
      fputs (_("\
\n\
Unless -t CHAR is given, leading blanks separate fields and are ignored,\n\
else fields are separated by CHAR.  Any FIELD is a field number counted\n\
from 1.  FORMAT is one or more comma or blank separated specifications,\n\
each being `FILENUM.FIELD' or `0'.  Default FORMAT outputs the join field,\n\
the remaining fields from FILE1, the remaining fields from FILE2, all\n\
separated by CHAR.\n\
\n\
Important: FILE1 and FILE2 must be sorted on the join fields.\n\
E.g., use ` sort -k 1b,1 ' if `join' has no options,\n\
or use ` join -t '' ' if `sort' has no options.\n\
Note, comparisons honor the rules specified by `LC_COLLATE'.\n\
If the input is not sorted and some lines cannot be joined, a\n\
warning message will be given.\n\
"), stdout);
      emit_ancillary_info ();
    }
  exit (status);
}

/* Record a field in LINE, with location FIELD and size LEN.  */

static void
extract_field (struct line *line, char *field, size_t len)
{
  if (line->nfields >= line->nfields_allocated)
    {
      line->fields = X2NREALLOC (line->fields, &line->nfields_allocated);
    }
  line->fields[line->nfields].beg = field;
  line->fields[line->nfields].len = len;
  ++(line->nfields);
}

/* Fill in the `fields' structure in LINE.  */

static void
xfields (struct line *line)
{
  char *ptr = line->buf.buffer;
  char const *lim = ptr + line->buf.length - 1;

  if (ptr == lim)
    return;

  if (0 <= tab && tab != '\n')
    {
      char *sep;
      for (; (sep = memchr (ptr, tab, lim - ptr)) != NULL; ptr = sep + 1)
        extract_field (line, ptr, sep - ptr);
    }
  else if (tab < 0)
    {
      /* Skip leading blanks before the first field.  */
      while (isblank (to_uchar (*ptr)))
        if (++ptr == lim)
          return;

      do
        {
          char *sep;
          for (sep = ptr + 1; sep != lim && ! isblank (to_uchar (*sep)); sep++)
            continue;
          extract_field (line, ptr, sep - ptr);
          if (sep == lim)
            return;
          for (ptr = sep + 1; ptr != lim && isblank (to_uchar (*ptr)); ptr++)
            continue;
        }
      while (ptr != lim);
    }

  extract_field (line, ptr, lim - ptr);
}

static void
freeline (struct line *line)
{
  if (line == NULL)
    return;
  free (line->fields);
  line->fields = NULL;
  free (line->buf.buffer);
  line->buf.buffer = NULL;
}

/* Return <0 if the join field in LINE1 compares less than the one in LINE2;
   >0 if it compares greater; 0 if it compares equal.
   Report an error and exit if the comparison fails.
   Use join fields JF_1 and JF_2 respectively.  */

static int
keycmp (struct line const *line1, struct line const *line2,
        size_t jf_1, size_t jf_2)
{
  /* Start of field to compare in each file.  */
  char *beg1;
  char *beg2;

  size_t len1;
  size_t len2;		/* Length of fields to compare.  */
  int diff;

  if (jf_1 < line1->nfields)
    {
      beg1 = line1->fields[jf_1].beg;
      len1 = line1->fields[jf_1].len;
    }
  else
    {
      beg1 = NULL;
      len1 = 0;
    }

  if (jf_2 < line2->nfields)
    {
      beg2 = line2->fields[jf_2].beg;
      len2 = line2->fields[jf_2].len;
    }
  else
    {
      beg2 = NULL;
      len2 = 0;
    }

  if (len1 == 0)
    return len2 == 0 ? 0 : -1;
  if (len2 == 0)
    return 1;

  if (ignore_case)
    {
      /* FIXME: ignore_case does not work with NLS (in particular,
         with multibyte chars).  */
      diff = memcasecmp (beg1, beg2, MIN (len1, len2));
    }
  else
    {
      if (hard_LC_COLLATE)
        return xmemcoll (beg1, len1, beg2, len2);
      diff = memcmp (beg1, beg2, MIN (len1, len2));
    }

  if (diff)
    return diff;
  return len1 < len2 ? -1 : len1 != len2;
}

/* Check that successive input lines PREV and CURRENT from input file
   WHATFILE are presented in order, unless the user may be relying on
   the GNU extension that input lines may be out of order if no input
   lines are unpairable.

   If the user specified --nocheck-order, the check is not made.
   If the user specified --check-order, the problem is fatal.
   Otherwise (the default), the message is simply a warning.

   A message is printed at most once per input file. */

static void
check_order (const struct line *prev,
             const struct line *current,
             int whatfile)
{
  if (check_input_order != CHECK_ORDER_DISABLED
      && ((check_input_order == CHECK_ORDER_ENABLED) || seen_unpairable))
    {
      if (!issued_disorder_warning[whatfile-1])
        {
          size_t join_field = whatfile == 1 ? join_field_1 : join_field_2;
          if (keycmp (prev, current, join_field, join_field) > 0)
            {
              error ((check_input_order == CHECK_ORDER_ENABLED
                      ? EXIT_FAILURE : 0),
                     0, _("file %d is not in sorted order"), whatfile);

              /* If we get to here, the message was just a warning, but we
                 want only to issue it once. */
              issued_disorder_warning[whatfile-1] = true;
            }
        }
    }
}

static inline void
reset_line (struct line *line)
{
  line->nfields = 0;
}

static struct line *
init_linep (struct line **linep)
{
  struct line *line = xmalloc (sizeof *line);
  memset (line, '\0', sizeof *line);
  *linep = line;
  return line;
}

/* Read a line from FP into LINE and split it into fields.
   Return true if successful.  */

static bool
get_line (FILE *fp, struct line **linep, int which)
{
  struct line *line = *linep;

  if (line == prevline[which - 1])
    {
      SWAPLINES (line, spareline[which - 1]);
      *linep = line;
    }

  if (line)
    reset_line (line);
  else
    line = init_linep (linep);

  if (! readlinebuffer (&line->buf, fp))
    {
      if (ferror (fp))
        error (EXIT_FAILURE, errno, _("read error"));
      freeline (line);
      return false;
    }

  xfields (line);

  if (prevline[which - 1])
    check_order (prevline[which - 1], line, which);

  prevline[which - 1] = line;
  return true;
}

static void
free_spareline (void)
{
  size_t i;

  for (i = 0; i < ARRAY_CARDINALITY (spareline); i++)
    {
      if (spareline[i])
        {
          freeline (spareline[i]);
          free (spareline[i]);
        }
    }
}

static void
initseq (struct seq *seq)
{
  seq->count = 0;
  seq->alloc = 0;
  seq->lines = NULL;
}

/* Read a line from FP and add it to SEQ.  Return true if successful.  */

static bool
getseq (FILE *fp, struct seq *seq, int whichfile)
{
  if (seq->count == seq->alloc)
    {
      size_t i;
      seq->lines = X2NREALLOC (seq->lines, &seq->alloc);
      for (i = seq->count; i < seq->alloc; i++)
        seq->lines[i] = NULL;
    }

  if (get_line (fp, &seq->lines[seq->count], whichfile))
    {
      ++seq->count;
      return true;
    }
  return false;
}

/* Read a line from FP and add it to SEQ, as the first item if FIRST is
   true, else as the next.  */
static bool
advance_seq (FILE *fp, struct seq *seq, bool first, int whichfile)
{
  if (first)
    seq->count = 0;

  return getseq (fp, seq, whichfile);
}

static void
delseq (struct seq *seq)
{
  size_t i;
  for (i = 0; i < seq->alloc; i++)
    {
      freeline (seq->lines[i]);
      free (seq->lines[i]);
    }
  free (seq->lines);
}

/* Print field N of LINE if it exists and is nonempty, otherwise
   `empty_filler' if it is nonempty.  */

static void
prfield (size_t n, struct line const *line)
{
  size_t len;

  if (n < line->nfields)
    {
      len = line->fields[n].len;
      if (len)
        fwrite (line->fields[n].beg, 1, len, stdout);
      else if (empty_filler)
        fputs (empty_filler, stdout);
    }
  else if (empty_filler)
    fputs (empty_filler, stdout);
}

/* Print the join of LINE1 and LINE2.  */

static void
prjoin (struct line const *line1, struct line const *line2)
{
  const struct outlist *outlist;
  char output_separator = tab < 0 ? ' ' : tab;

  outlist = outlist_head.next;
  if (outlist)
    {
      const struct outlist *o;

      o = outlist;
      while (1)
        {
          size_t field;
          struct line const *line;

          if (o->file == 0)
            {
              if (line1 == &uni_blank)
                {
                  line = line2;
                  field = join_field_2;
                }
              else
                {
                  line = line1;
                  field = join_field_1;
                }
            }
          else
            {
              line = (o->file == 1 ? line1 : line2);
              field = o->field;
            }
          prfield (field, line);
          o = o->next;
          if (o == NULL)
            break;
          putchar (output_separator);
        }
      putchar ('\n');
    }
  else
    {
      size_t i;

      if (line1 == &uni_blank)
        {
          struct line const *t;
          t = line1;
          line1 = line2;
          line2 = t;
        }
      prfield (join_field_1, line1);
      for (i = 0; i < join_field_1 && i < line1->nfields; ++i)
        {
          putchar (output_separator);
          prfield (i, line1);
        }
      for (i = join_field_1 + 1; i < line1->nfields; ++i)
        {
          putchar (output_separator);
          prfield (i, line1);
        }

      for (i = 0; i < join_field_2 && i < line2->nfields; ++i)
        {
          putchar (output_separator);
          prfield (i, line2);
        }
      for (i = join_field_2 + 1; i < line2->nfields; ++i)
        {
          putchar (output_separator);
          prfield (i, line2);
        }
      putchar ('\n');
    }
}

/* Print the join of the files in FP1 and FP2.  */

static void
join (FILE *fp1, FILE *fp2)
{
  struct seq seq1, seq2;
  int diff;
  bool eof1, eof2;

  fadvise (fp1, FADVISE_SEQUENTIAL);
  fadvise (fp2, FADVISE_SEQUENTIAL);

  /* Read the first line of each file.  */
  initseq (&seq1);
  getseq (fp1, &seq1, 1);
  initseq (&seq2);
  getseq (fp2, &seq2, 2);

  if (join_header_lines && seq1.count && seq2.count)
    {
      prjoin (seq1.lines[0], seq2.lines[0]);
      prevline[0] = NULL;
      prevline[1] = NULL;
      advance_seq (fp1, &seq1, true, 1);
      advance_seq (fp2, &seq2, true, 2);
    }

  while (seq1.count && seq2.count)
    {
      size_t i;
      diff = keycmp (seq1.lines[0], seq2.lines[0],
                     join_field_1, join_field_2);
      if (diff < 0)
        {
          if (print_unpairables_1)
            prjoin (seq1.lines[0], &uni_blank);
          advance_seq (fp1, &seq1, true, 1);
          seen_unpairable = true;
          continue;
        }
      if (diff > 0)
        {
          if (print_unpairables_2)
            prjoin (&uni_blank, seq2.lines[0]);
          advance_seq (fp2, &seq2, true, 2);
          seen_unpairable = true;
          continue;
        }

      /* Keep reading lines from file1 as long as they continue to
         match the current line from file2.  */
      eof1 = false;
      do
        if (!advance_seq (fp1, &seq1, false, 1))
          {
            eof1 = true;
            ++seq1.count;
            break;
          }
      while (!keycmp (seq1.lines[seq1.count - 1], seq2.lines[0],
                      join_field_1, join_field_2));

      /* Keep reading lines from file2 as long as they continue to
         match the current line from file1.  */
      eof2 = false;
      do
        if (!advance_seq (fp2, &seq2, false, 2))
          {
            eof2 = true;
            ++seq2.count;
            break;
          }
      while (!keycmp (seq1.lines[0], seq2.lines[seq2.count - 1],
                      join_field_1, join_field_2));

      if (print_pairables)
        {
          for (i = 0; i < seq1.count - 1; ++i)
            {
              size_t j;
              for (j = 0; j < seq2.count - 1; ++j)
                prjoin (seq1.lines[i], seq2.lines[j]);
            }
        }

      if (!eof1)
        {
          SWAPLINES (seq1.lines[0], seq1.lines[seq1.count - 1]);
          seq1.count = 1;
        }
      else
        seq1.count = 0;

      if (!eof2)
        {
          SWAPLINES (seq2.lines[0], seq2.lines[seq2.count - 1]);
          seq2.count = 1;
        }
      else
        seq2.count = 0;
    }

  /* If the user did not specify --check-order, then we read the
     tail ends of both inputs to verify that they are in order.  We
     skip the rest of the tail once we have issued a warning for that
     file, unless we actually need to print the unpairable lines.  */
  struct line *line = NULL;
  bool checktail = false;

  if (check_input_order != CHECK_ORDER_DISABLED
      && !(issued_disorder_warning[0] && issued_disorder_warning[1]))
    checktail = true;

  if ((print_unpairables_1 || checktail) && seq1.count)
    {
      if (print_unpairables_1)
        prjoin (seq1.lines[0], &uni_blank);
      seen_unpairable = true;
      while (get_line (fp1, &line, 1))
        {
          if (print_unpairables_1)
            prjoin (line, &uni_blank);
          if (issued_disorder_warning[0] && !print_unpairables_1)
            break;
        }
    }

  if ((print_unpairables_2 || checktail) && seq2.count)
    {
      if (print_unpairables_2)
        prjoin (&uni_blank, seq2.lines[0]);
      seen_unpairable = true;
      while (get_line (fp2, &line, 2))
        {
          if (print_unpairables_2)
            prjoin (&uni_blank, line);
          if (issued_disorder_warning[1] && !print_unpairables_2)
            break;
        }
    }

  freeline (line);
  free (line);

  delseq (&seq1);
  delseq (&seq2);
}

/* Add a field spec for field FIELD of file FILE to `outlist'.  */

static void
add_field (int file, size_t field)
{
  struct outlist *o;

  assert (file == 0 || file == 1 || file == 2);
  assert (file != 0 || field == 0);

  o = xmalloc (sizeof *o);
  o->file = file;
  o->field = field;
  o->next = NULL;

  /* Add to the end of the list so the fields are in the right order.  */
  outlist_end->next = o;
  outlist_end = o;
}

/* Convert a string of decimal digits, STR (the 1-based join field number),
   to an integral value.  Upon successful conversion, return one less
   (the zero-based field number).  Silently convert too-large values
   to SIZE_MAX - 1.  Otherwise, if a value cannot be converted, give a
   diagnostic and exit.  */

static size_t
string_to_join_field (char const *str)
{
  size_t result;
  unsigned long int val;
  verify (SIZE_MAX <= ULONG_MAX);

  strtol_error s_err = xstrtoul (str, NULL, 10, &val, "");
  if (s_err == LONGINT_OVERFLOW || (s_err == LONGINT_OK && SIZE_MAX < val))
    val = SIZE_MAX;
  else if (s_err != LONGINT_OK || val == 0)
    error (EXIT_FAILURE, 0, _("invalid field number: %s"), quote (str));

  result = val - 1;

  return result;
}

/* Convert a single field specifier string, S, to a *FILE_INDEX, *FIELD_INDEX
   pair.  In S, the field index string is 1-based; *FIELD_INDEX is zero-based.
   If S is valid, return true.  Otherwise, give a diagnostic and exit.  */

static void
decode_field_spec (const char *s, int *file_index, size_t *field_index)
{
  /* The first character must be 0, 1, or 2.  */
  switch (s[0])
    {
    case '0':
      if (s[1])
        {
          /* `0' must be all alone -- no `.FIELD'.  */
          error (EXIT_FAILURE, 0, _("invalid field specifier: %s"), quote (s));
        }
      *file_index = 0;
      *field_index = 0;
      break;

    case '1':
    case '2':
      if (s[1] != '.')
        error (EXIT_FAILURE, 0, _("invalid field specifier: %s"), quote (s));
      *file_index = s[0] - '0';
      *field_index = string_to_join_field (s + 2);
      break;

    default:
      error (EXIT_FAILURE, 0,
             _("invalid file number in field spec: %s"), quote (s));

      /* Tell gcc -W -Wall that we can't get beyond this point.
         This avoids a warning (otherwise legit) that the caller's copies
         of *file_index and *field_index might be used uninitialized.  */
      abort ();

      break;
    }
}

/* Add the comma or blank separated field spec(s) in STR to `outlist'.  */

static void
add_field_list (char *str)
{
  char *p = str;

  do
    {
      int file_index;
      size_t field_index;
      char const *spec_item = p;

      p = strpbrk (p, ", \t");
      if (p)
        *p++ = '\0';
      decode_field_spec (spec_item, &file_index, &field_index);
      add_field (file_index, field_index);
    }
  while (p);
}

/* Set the join field *VAR to VAL, but report an error if *VAR is set
   more than once to incompatible values.  */

static void
set_join_field (size_t *var, size_t val)
{
  if (*var != SIZE_MAX && *var != val)
    {
      unsigned long int var1 = *var + 1;
      unsigned long int val1 = val + 1;
      error (EXIT_FAILURE, 0, _("incompatible join fields %lu, %lu"),
             var1, val1);
    }
  *var = val;
}

/* Status of command-line arguments.  */

enum operand_status
  {
    /* This argument must be an operand, i.e., one of the files to be
       joined.  */
    MUST_BE_OPERAND,

    /* This might be the argument of the preceding -j1 or -j2 option,
       or it might be an operand.  */
    MIGHT_BE_J1_ARG,
    MIGHT_BE_J2_ARG,

    /* This might be the argument of the preceding -o option, or it might be
       an operand.  */
    MIGHT_BE_O_ARG
  };

/* Add NAME to the array of input file NAMES with operand statuses
   OPERAND_STATUS; currently there are NFILES names in the list.  */

static void
add_file_name (char *name, char *names[2],
               int operand_status[2], int joption_count[2], int *nfiles,
               int *prev_optc_status, int *optc_status)
{
  int n = *nfiles;

  if (n == 2)
    {
      bool op0 = (operand_status[0] == MUST_BE_OPERAND);
      char *arg = names[op0];
      switch (operand_status[op0])
        {
        case MUST_BE_OPERAND:
          error (0, 0, _("extra operand %s"), quote (name));
          usage (EXIT_FAILURE);

        case MIGHT_BE_J1_ARG:
          joption_count[0]--;
          set_join_field (&join_field_1, string_to_join_field (arg));
          break;

        case MIGHT_BE_J2_ARG:
          joption_count[1]--;
          set_join_field (&join_field_2, string_to_join_field (arg));
          break;

        case MIGHT_BE_O_ARG:
          add_field_list (arg);
          break;
        }
      if (!op0)
        {
          operand_status[0] = operand_status[1];
          names[0] = names[1];
        }
      n = 1;
    }

  operand_status[n] = *prev_optc_status;
  names[n] = name;
  *nfiles = n + 1;
  if (*prev_optc_status == MIGHT_BE_O_ARG)
    *optc_status = MIGHT_BE_O_ARG;
}

int
main (int argc, char **argv)
{
  int optc_status;
  int prev_optc_status = MUST_BE_OPERAND;
  int operand_status[2];
  int joption_count[2] = { 0, 0 };
  char *names[2];
  FILE *fp1, *fp2;
  int optc;
  int nfiles = 0;
  int i;

  initialize_main (&argc, &argv);
  set_program_name (argv[0]);
  setlocale (LC_ALL, "");
  bindtextdomain (PACKAGE, LOCALEDIR);
  textdomain (PACKAGE);
  hard_LC_COLLATE = hard_locale (LC_COLLATE);

  atexit (close_stdout);
  atexit (free_spareline);

  print_pairables = true;
  seen_unpairable = false;
  issued_disorder_warning[0] = issued_disorder_warning[1] = false;
  check_input_order = CHECK_ORDER_DEFAULT;

  while ((optc = getopt_long (argc, argv, "-a:e:i1:2:j:o:t:v:",
                              longopts, NULL))
         != -1)
    {
      optc_status = MUST_BE_OPERAND;

      switch (optc)
        {
        case 'v':
            print_pairables = false;
            /* Fall through.  */

        case 'a':
          {
            unsigned long int val;
            if (xstrtoul (optarg, NULL, 10, &val, "") != LONGINT_OK
                || (val != 1 && val != 2))
              error (EXIT_FAILURE, 0,
                     _("invalid field number: %s"), quote (optarg));
            if (val == 1)
              print_unpairables_1 = true;
            else
              print_unpairables_2 = true;
          }
          break;

        case 'e':
          if (empty_filler && ! STREQ (empty_filler, optarg))
            error (EXIT_FAILURE, 0,
                   _("conflicting empty-field replacement strings"));
          empty_filler = optarg;
          break;

        case 'i':
          ignore_case = true;
          break;

        case '1':
          set_join_field (&join_field_1, string_to_join_field (optarg));
          break;

        case '2':
          set_join_field (&join_field_2, string_to_join_field (optarg));
          break;

        case 'j':
          if ((optarg[0] == '1' || optarg[0] == '2') && !optarg[1]
              && optarg == argv[optind - 1] + 2)
            {
              /* The argument was either "-j1" or "-j2".  */
              bool is_j2 = (optarg[0] == '2');
              joption_count[is_j2]++;
              optc_status = MIGHT_BE_J1_ARG + is_j2;
            }
          else
            {
              set_join_field (&join_field_1, string_to_join_field (optarg));
              set_join_field (&join_field_2, join_field_1);
            }
          break;

        case 'o':
          add_field_list (optarg);
          optc_status = MIGHT_BE_O_ARG;
          break;

        case 't':
          {
            unsigned char newtab = optarg[0];
            if (! newtab)
              newtab = '\n'; /* '' => process the whole line.  */
            else if (optarg[1])
              {
                if (STREQ (optarg, "\\0"))
                  newtab = '\0';
                else
                  error (EXIT_FAILURE, 0, _("multi-character tab %s"),
                         quote (optarg));
              }
            if (0 <= tab && tab != newtab)
              error (EXIT_FAILURE, 0, _("incompatible tabs"));
            tab = newtab;
          }
          break;

        case NOCHECK_ORDER_OPTION:
          check_input_order = CHECK_ORDER_DISABLED;
          break;

        case CHECK_ORDER_OPTION:
          check_input_order = CHECK_ORDER_ENABLED;
          break;

        case 1:		/* Non-option argument.  */
          add_file_name (optarg, names, operand_status, joption_count,
                         &nfiles, &prev_optc_status, &optc_status);
          break;

        case HEADER_LINE_OPTION:
          join_header_lines = true;
          break;

        case_GETOPT_HELP_CHAR;

        case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);

        default:
          usage (EXIT_FAILURE);
        }

      prev_optc_status = optc_status;
    }

  /* Process any operands after "--".  */
  prev_optc_status = MUST_BE_OPERAND;
  while (optind < argc)
    add_file_name (argv[optind++], names, operand_status, joption_count,
                   &nfiles, &prev_optc_status, &optc_status);

  if (nfiles != 2)
    {
      if (nfiles == 0)
        error (0, 0, _("missing operand"));
      else
        error (0, 0, _("missing operand after %s"), quote (argv[argc - 1]));
      usage (EXIT_FAILURE);
    }

  /* If "-j1" was specified and it turns out not to have had an argument,
     treat it as "-j 1".  Likewise for -j2.  */
  for (i = 0; i < 2; i++)
    if (joption_count[i] != 0)
      {
        set_join_field (&join_field_1, i);
        set_join_field (&join_field_2, i);
      }

  if (join_field_1 == SIZE_MAX)
    join_field_1 = 0;
  if (join_field_2 == SIZE_MAX)
    join_field_2 = 0;

  fp1 = STREQ (names[0], "-") ? stdin : fopen (names[0], "r");
  if (!fp1)
    error (EXIT_FAILURE, errno, "%s", names[0]);
  fp2 = STREQ (names[1], "-") ? stdin : fopen (names[1], "r");
  if (!fp2)
    error (EXIT_FAILURE, errno, "%s", names[1]);
  if (fp1 == fp2)
    error (EXIT_FAILURE, errno, _("both files cannot be standard input"));
  join (fp1, fp2);

  if (fclose (fp1) != 0)
    error (EXIT_FAILURE, errno, "%s", names[0]);
  if (fclose (fp2) != 0)
    error (EXIT_FAILURE, errno, "%s", names[1]);

  if (issued_disorder_warning[0] || issued_disorder_warning[1])
    exit (EXIT_FAILURE);
  else
    exit (EXIT_SUCCESS);
}