[Question]
  [
It's been a rough few months at work and I feel like I just want to scream right to my boss' face. I am, however, not one to directly confront people I have a problem with. I also don't want to lose my job.
So here's an idea: I want to be able to insult him, without him ever finding out. And I realized the perfect way: I need some sort of software that encodes an insult inside an otherwise perfectly fine message. And seeing as how he's known to not see forests for trees, I think I know just how:
Write me a program that takes as input a string of unknown length, but containing no line breaks. This will be the raw message I want to send.
If possible, return the string formatted such that the message "DIE IN A GREASE FIRE" makes up the entire left column. With new paragraphs where spaces in between words should go. Now, as I am very angry, it is equally important that every letter is in upper case.
You may not modify the string in any other way, i.e. you may not turn all of the string into upper case characters.
If the string in question cannot be formatted in this way, you are to return the original string. Read input from standard input.
Normal rules apply: No HTTP requests, no consulting Marvin from THGTTG, etc.
Example input:
> 
> Dear Boss, how are things? It has come to my attention that I received
>  all the blame for the mishap last Friday. Not just the majority of it.
>  Every last bit of it. Is it wrong for me to think that the rest of the
>  team were at least in part responsible? After all, all six of us were
>  involved from the get-go. Not that I think I should stand without
>  blame. Not at all. All I'm saying is this: I do my best. I try hard. I
>  improve constantly. And I am constantly taking responsibility.
>  Generally speaking, I am very okay with taking full responsibility for
>  my actions. But after this spring, it seems I get more than I deserve.
>  Remember the Flakenhauser contract? Everything went down just about as
>  smooth as one could have hoped. Or so it seemed at first. It was just
>  at the very last minute that things fell apart. All of the team agreed
>  that it was more akin to a freak accident than sloppy planning or
>  mismanaged resources. Still, I - alone - took blame for it. Even
>  though I said nothing then, my tolerance level for taking the blame
>  took a serious dent then. From that point on, I have felt it necessary
>  to always try twice as hard, just to escape scrutiny. And still, here
>  we are again. In spite of all my accomplishments. Right where we
>  always seem to end up these days. Every single project. It's becoming
>  unbearable.
> 
> 
> 
Example output:
> 
> Dear Boss, how are things?  
> 
>  It has come to my attention that I received all the blame for the mishap last Friday. Not just the majority of it.  
> 
>  Every last bit of it.
> 
> 
> Is it wrong for me to think that the rest of the team were at least in part responsible? After all, all six of us were involved from the get-go.  
> 
>  Not that I think I should stand without blame. Not at all.
> 
> 
> All I'm saying is this: I do my best. I try hard. I improve constantly. And I am constantly taking responsibility.
> 
> 
> Generally speaking, I am very okay with taking full responsibility for my actions. But after this spring, it seems I get more than I deserve.  
> 
>  Remember the Flakenhauser contract.  
> 
>  Everything went down just about as smooth as one could have hoped. Or so it seemed at first. It was just at the very last minute that things fell apart.  
> 
>  All of the team agreed that it was more akin to a freak accident than sloppy planning or mismanaged resources.  
> 
>  Still, I - alone - took blame for it.  
> 
>  Even though I said nothing then, my tolerance level for taking the blame took a serious dent then.
> 
> 
> From that point on, I have felt it necessary to always try twice as hard, just to escape scrutiny. And still, here we are again.  
> 
>  In spite of all my accomplishments.  
> 
>  Right where we always seem to end up these days.  
> 
>  Every single project. It's becoming unbearable.
> 
> 
> 
This is code golf. Shortest code wins.
  
[Answer]
# CJam, ~~56~~ 53 bytes
```
q_"DIEIINAAGGREASEFFIRE"{S@:A+S@+#:BA<AB>}%(!B)*\N*@?
```
[Try it online!](http://cjam.tryitonline.net/#code=cV8iRElFSUlOQUFHR1JFQVNFRkZJUkUie1NAOkErU0ArIzpCQTxBQj59JSghQikqXE4qQD8&input=RGVhciBCb3NzLCBob3cgYXJlIHRoaW5ncz8gSXQgaGFzIGNvbWUgdG8gbXkgYXR0ZW50aW9uIHRoYXQgSSByZWNlaXZlZCBhbGwgdGhlIGJsYW1lIGZvciB0aGUgbWlzaGFwIGxhc3QgRnJpZGF5LiBOb3QganVzdCB0aGUgbWFqb3JpdHkgb2YgaXQuIEV2ZXJ5IGxhc3QgYml0IG9mIGl0LiBJcyBpdCB3cm9uZyBmb3IgbWUgdG8gdGhpbmsgdGhhdCB0aGUgcmVzdCBvZiB0aGUgdGVhbSB3ZXJlIGF0IGxlYXN0IGluIHBhcnQgcmVzcG9uc2libGU_IEFmdGVyIGFsbCwgYWxsIHNpeCBvZiB1cyB3ZXJlIGludm9sdmVkIGZyb20gdGhlIGdldC1nby4gTm90IHRoYXQgSSB0aGluayBJIHNob3VsZCBzdGFuZCB3aXRob3V0IGJsYW1lLiBOb3QgYXQgYWxsLiBBbGwgSSdtIHNheWluZyBpcyB0aGlzOiBJIGRvIG15IGJlc3QuIEkgdHJ5IGhhcmQuIEkgaW1wcm92ZSBjb25zdGFudGx5LiBBbmQgSSBhbSBjb25zdGFudGx5IHRha2luZyByZXNwb25zaWJpbGl0eS4gR2VuZXJhbGx5IHNwZWFraW5nLCBJIGFtIHZlcnkgb2theSB3aXRoIHRha2luZyBmdWxsIHJlc3BvbnNpYmlsaXR5IGZvciBteSBhY3Rpb25zLiBCdXQgYWZ0ZXIgdGhpcyBzcHJpbmcsIGl0IHNlZW1zIEkgZ2V0IG1vcmUgdGhhbiBJIGRlc2VydmUuIFJlbWVtYmVyIHRoZSBGbGFrZW5oYXVzZXIgY29udHJhY3Q_IEV2ZXJ5dGhpbmcgd2VudCBkb3duIGp1c3QgYWJvdXQgYXMgc21vb3RoIGFzIG9uZSBjb3VsZCBoYXZlIGhvcGVkLiBPciBzbyBpdCBzZWVtZWQgYXQgZmlyc3QuIEl0IHdhcyBqdXN0IGF0IHRoZSB2ZXJ5IGxhc3QgbWludXRlIHRoYXQgdGhpbmdzIGZlbGwgYXBhcnQuIEFsbCBvZiB0aGUgdGVhbSBhZ3JlZWQgdGhhdCBpdCB3YXMgbW9yZSBha2luIHRvIGEgZnJlYWsgYWNjaWRlbnQgdGhhbiBzbG9wcHkgcGxhbm5pbmcgb3IgbWlzbWFuYWdlZCByZXNvdXJjZXMuIFN0aWxsLCBJIC0gYWxvbmUgLSB0b29rIGJsYW1lIGZvciBpdC4gRXZlbiB0aG91Z2ggSSBzYWlkIG5vdGhpbmcgdGhlbiwgbXkgdG9sZXJhbmNlIGxldmVsIGZvciB0YWtpbmcgdGhlIGJsYW1lIHRvb2sgYSBzZXJpb3VzIGRlbnQgdGhlbi4gRnJvbSB0aGF0IHBvaW50IG9uLCBJIGhhdmUgZmVsdCBpdCBuZWNlc3NhcnkgdG8gYWx3YXlzIHRyeSB0d2ljZSBhcyBoYXJkLCBqdXN0IHRvIGVzY2FwZSBzY3J1dGlueS4gQW5kIHN0aWxsLCBoZXJlIHdlIGFyZSBhZ2Fpbi4gSW4gc3BpdGUgb2YgYWxsIG15IGFjY29tcGxpc2htZW50cy4gUmlnaHQgd2hlcmUgd2UgYWx3YXlzIHNlZW0gdG8gZW5kIHVwIHRoZXNlIGRheXMuIEV2ZXJ5IHNpbmdsZSBwcm9qZWN0LiBJdCdzIGJlY29taW5nIHVuYmVhcmFibGUu)
### How it works
```
q_                     Read all input from STDIN and push a copy.
"DIEIINAAGGREASEFFIRE" Push the characters we're searching for in form of a
                       string. We'll try to prepend a linefeed to all of them.
                       Some characters are duplicated to prepend two linefeeds.
{                      For every character C in that string:
  S@                   Push ' ' and rotate the string on the stack on top of it.
  :A                   Save the string (initially the input) in A.
  +                    Prepend the space to A.
  S@+                  Construct the string " C".
  #                    Compute the index of " C" in the modified A.
  :B                   Save the index in the variable B.
  A<                   Push the substring of A up to the index.
  AB>                  Push the substring of A after the index.
}%
(                      Shift the first element of the resulting array.
!                      Compute the logical NOT. This pushes 1 if and only if the
                       array's first element is an empty string, which is true
                       if and only if the input string started with a D.
B)                     Push the last value of B and increment. If the last match
                       was successful and, therefore, all matches were successful,
                       B != -1, so B + 1 != 0.
*                      Compute the product of the two topmost items on the stack.
\                      Swap the resulting Booleanr with the array of substrings.
N*                     Join the array, separating by linefeeds.
@                      Rotate the input string on top of the stack.
?                      Select the joined array if the Boolean is 1 and the input
                       string otherwise.
```
[Answer]
## Perl - 60 bytes
```
#!perl -p
$_=(join$/,$_=~('DIE\IN\A\GREASE\FIRE'=~s/./($&.*)/gr))||$_
```
Counting the shebang as one.
This solution uses the innermost string to build up the following regex:
```
(D.*)(I.*)(E.*)(\.*)(I.*)(N.*)(\.*)(A.*)(\.*)(G.*)(R.*)(E.*)(A.*)(S.*)(E.*)(\.*)(F.*)(I.*)(R.*)(E.*)
```
which is similar to the regex used in [m.buettner's solution](https://codegolf.stackexchange.com/a/32025). The generated regex is then matched against the input. In a list context, this will return an array containing each of the match groups, which are joined together by a newline (the reason for the 'match nothing' groups `(\.*)`, is to insert an additional newline). If there is no match, the original string is output instead.
---
## Perl - 73 bytes
```
#!perl -pl
$s=$_}for(map$s!~s/.*?(?=$_)//?$\='':$&,'DIEI.NA.G.REASEF.IRE$'=~/./g){
```
Counting the shebang as two.
This splits up the string at the appropriate delimiters, and collects the pieces in an array. If any of them fail to match, the [output record separator](http://perldoc.perl.org/perlvar.html#%24OUTPUT_RECORD_SEPARATOR) (which was set to a newline with the `-l` option) is unset, and so the string is output unmodified.
[Answer]
# GolfScript, 53 bytes
Looks like Dennis and I came up with pretty similar things in parallel... But here's my attempt.
Click on the links before each code block to try it online. Unfortunately, the online interpreter won't allow you to run code larger than 1024 characters, so I had to perform some... "compression" of the test input. But it does still work.
[Squished version](http://golfscript.apphb.com/?c=OyJEZWFyIEJvc3MsIGhvdyBhcmUgdGhpbmdzPyBJdCBoYXMgY29tZSB0byBteSBhdHRlbnRpb24gdGhhdCBJIHJlY2VpdmVkIGFsbCB0aGUgYmxhbWUgZm9yIHRoZSBtaXNoYXAgbGFzdCBGcmlkYXkuIE5vdCBqdXN0IHRoZSBtYWpvcml0eSBvZiBpdC4gRXZlcnkgbGFzdCBiaXQgb2YgaXQuIElzIGl0IHdyb25nIGZvciBtZSB0byB0aGluayB0aGF0IHRoZSByZXN0IG9mIHRoZSB0ZWFtIHdlcmUgYXQgbGVhc3QgaW4gcGFydCByZXNwb25zaWJsZT8gQWZ0ZXIgYWxsLCBhbGwgc2l4IG9mIHVzIHdlcmUgaW52b2x2ZWQgZnJvbSB0aGUgZ2V0LWdvLiBOb3QgdGhhdCBJIHRoaW5rIEkgc2hvdWxkIHN0YW5kIHdpdGhvdXQgYmxhbWUuIE5vdCBhdCBhbGwuIEFsbCBJJ20gc2F5aW5nIGlzIHRoaXM6IEkgZG8gbXkgYmVzdC4gSSB0cnkgaGFyZC4gSSBpbXByb3ZlIGNvbnN0YW50bHkuIEFuZCBJIGFtIGNvbnN0YW50bHkgdGFraW5nIHJlc3BvbnNpYmlsaXR5LiBHZW5lcmFsbHkgc3BlYWtpbmcsIEkgYW0gdmVyeSBva2F5IHdpdGggdGFraW5nIGZ1bGwgcmVzcG9uc2liaWxpdHkgZm9yIG15IGFjdGlvbnMuIEJ1dCBhZnRlciB0aGlzIHNwcmluZywgaXQgc2VlbXMgSSBnZXQgbW9yZSB0aGFuIEkgZGVzZXJ2ZS4gUmVtZW1iZXIgdGhlIEZsYWtlbmhhdXNlciBjb250cmFjdD8gRSB3IGQgaiBhIGEgcyBhIG8gYyBoIGguIE8gcyBpIHMgYSBmLiBJIHcgaiBhIHQgdiBsIG0gdCB0IGYgYS4gQSBvIHQgdCBhIHQgaSB3IG0gYSB0IGEgZiBhIHQgcyBwIG8gbSByLiBTLCBJIC0gYSAtIHQgYiBmIGkuIEUgdCBJIHMgbiB0LCBtIHQgbCBmIHQgdCBiIHQgYSBzIGQgdC4gRiB0IHAgbywgSSBoIGYgaSBuIHQgYSB0IHQgYSBoLCBqIHQgZSBzLiBBIHMsIGggdyBhIGEuIEkgcyBvIGEgbSBhLiBSIHcgdyBhIHMgdCBlIHUgdCBkLiBFIHMgcC4gSSdzIGIgdS4iCgouLihcOzY4PSg%2BIklFSUlOQUFHR1JFQVNFRkZJUkUiezEkLkA%2FOl48bkBePn0vXShdXjA8PQ%3D%3D)
```
..(\;68=(>"IEIINAAGGREASEFFIRE"{1$.@?:^<n@^>}/](]^0<=
```
[Unsquished, commented version](http://golfscript.apphb.com/?c=OyJEIEIsIGggYSB0PyBJIGggYyB0IG0gYSB0IEkgciBhIHQgYiBmIHQgbSBsIEYuIE4gaiB0IG0gbyBpLiBFIGwgYiBvIGkuIEkgaSB3IGYgbSB0IHQgdCB0IHIgbyB0IHQgdyBhIGwgaSBwIHI%2FIEEgYSwgYSBzIG8gdSB3IGkgZiB0IGctZy4gTiB0IEkgdCBJIHMgcyB3IGIuIE4gYSBhLiBBIEknbSBzIGkgdDogSSBkIG0gYi4gSSB0IGguIEkgaSBjLiBBIEkgYSBjIHQgci4gRyBzLCBJIGEgdiBvIHcgdCBmIHIgZiBtIGEuIEIgYSB0IHMsIGkgcyBJIGcgbSB0IEkgZC4gUiB0IEYgYz8gRSB3IGQgaiBhIGEgcyBhIG8gYyBoIGguIE8gcyBpIHMgYSBmLiBJIHcgaiBhIHQgdiBsIG0gdCB0IGYgYS4gQSBvIHQgdCBhIHQgaSB3IG0gYSB0IGEgZiBhIHQgcyBwIG8gbSByLiBTLCBJIC0gYSAtIHQgYiBmIGkuIEUgdCBJIHMgbiB0LCBtIHQgbCBmIHQgdCBiIHQgYSBzIGQgdC4gRiB0IHAgbywgSSBoIGYgaSBuIHQgYSB0IHQgYSBoLCBqIHQgZSBzLiBBIHMsIGggdyBhIGEuIEkgcyBvIGEgbSBhLiBSIHcgdyBhIHMgdCBlIHUgdCBkLiBFIHMgcC4gSSdzIGIgdS4iCgouICAgICAgICMgKFNhdmUgaW5wdXQpCi4oXDsgICAgIyBHZXQgZmlyc3QgY2hhcmFjdGVyCjY4PSg%2BICAgIyBJZiAnRCcsIHdvcmsgd2l0aCBpbnB1dDsgZWxzZSwgd29yayB3aXRoIG9uZS1jaGFyYWN0ZXIgc3RyaW5nCiJJRUlJTkFBR0dSRUFTRUZGSVJFIgp7ICAgICAgICMgRm9yIGVhY2ggY2hhcmFjdGVyCiAxJC5AICAgIyAoRHVwbGljYXRlIG1lc3NhZ2UgdHdpY2UpCiA%2FOl4gICAgIyBGaW5kIGZpcnN0IGluZGV4IG9mIGNoYXJhY3RlcgogPG4gICAgICMgRXh0cmFjdCBwYXJ0IGJlZm9yZSBpbmRleCBhbmQgYWRkIGEgbmV3bGluZQogQF4%2BICAgICMgRXh0cmFjdCBwYXJ0IGluY2x1ZGluZyBhbmQgYWZ0ZXIgaW5kZXggYXMgbmV3ICJtZXNzYWdlIgp9LyAgICAgICMgKENsb3NlIGxvb3ApCl0oXV4wPD0gIyBJZiBsYXN0IGxpbmUgd2FzIHN1Y2Nlc3NmdWxseSBtYXRjaGVkLCBzZWxlY3QgcmVzdWx0OyBlbHNlLCBzZWxlY3QgaW5wdXQ%3D)
```
.       # (Save input)
.(\;    # Get first character
68=(>   # If 'D', work with input; else, work with one-character string
"IEIINAAGGREASEFFIRE"
{       # For each character
 1$.@   # (Duplicate message twice)
 ?:^    # Find first index of character
 <n     # Extract part before index and add a newline
 @^>    # Extract part including and after index as new "message"
}/      # (Close loop)
](]^0<= # If last line was successfully matched, select result; else, select input
```
A point raised by Dennis: All GolfScript programs print an automatic final newline. Whether or not this should invalidate my solution as-is, I'm not sure. I believe it would cost 4 characters to suppress the final newline by adding `"":n` somewhere near the end.
[Answer]
### Ruby - 140
```
a="DIEINAGREASEFIRE";n=[4,6,7,13];i=0;o='';s=ARGV[0]
s.chars.each{|c|
if c==a[i]
i+=1;o+="\n";o+="\n"if n-[i]!=n
end
o<<c
}
puts((i<16)?s:o)
```
**No regexes in this one**. It simultaneously walks the characters in the ARGV[0] input, and a string containing characters we need to break on to make our left-column message. Was originally going to stick spaces after the letters that need to have a newline, but found that it was a bit shorter to hardcode the indexes at which to insert the line break.
Once all is said and done, it checks to see that the `i` index has incremented enough times to have gone through every letter that needed breaking. If it hasn't, we just print out the original string. If it has, we give 'em the formatted one.
`n-[i]!=n` was a neat trick to save characters when checking whether or not the current index was one that needed an extra line break (as compared to `n.include? i`). Also saved some characters by using `{}`s instead of `do/end` despite being a multiline block, and used a ternary condition on the final puts to save characters when determining which one to output.
Not the shortest, but I thought it would be neat to do without regular expressions.
[Answer]
# JavaScript 116
Javascript implementation of m-buettner's idea
```
console.log((RegExp('^('+[...'DIE IN A GREASE FIRE$'].join('.*)(')+')').exec(z=prompt())||[,z]).slice(1).join('\n'))
```
**Test** snippet
```
z="Dear Boss, how are things? It has come to my attention that I received all the blame for the mishap last Friday. Not just the majority of it. Every last bit of it. Is it wrong for me to think that the rest of the team were at least in part responsible? After all, all six of us were involved from the get-go. Not that I think I should stand without blame. Not at all. All I'm saying is this: I do my best. I try hard. I improve constantly. And I am constantly taking responsibility. Generally speaking, I am very okay with taking full responsibility for my actions. But after this spring, it seems I get more than I deserve. Remember the Flakenhauser contract? Everything went down just about as smooth as one could have hoped. Or so it seemed at first. It was just at the very last minute that things fell apart. All of the team agreed that it was more akin to a freak accident than sloppy planning or mismanaged resources. Still, I - alone - took blame for it. Even though I said nothing then, my tolerance level for taking the blame took a serious dent then. From that point on, I have felt it necessary to always try twice as hard, just to escape scrutiny. And still, here we are again. In spite of all my accomplishments. Right where we always seem to end up these days. Every single project. It's becoming unbearable.";
T1.textContent = (RegExp('^('+[...'DIE IN A GREASE FIRE$'].join('.*)(')+')').exec(z)|| [,z]).slice(1).join('\n')
z='From that FIFA point on'
T2.textContent = (RegExp('^('+[...'DIE IN A GREASE FIRE$'].join('.*)(')+')').exec(z)|| [,z]).slice(1).join('\n')
```
```
pre { border: 1px solid black }
```
```
T1<pre id=T1></pre>
T2 (the FIFA test)<pre id=T2></pre>
```
[Answer]
## Perl, 184 bytes
Not a spectacular score for Perl, but here is a simple regex solution
```
$_=<>;s/^(D.*) (I.*) (E.*) (I.*) (N.*) (A.*) (G.*) (R.*) (E.*) (A.*) (S.*) (E.*) (F.*) (I.*) (R.*) E/$1\n$2\n$3\n\n$4\n$5\n\n$6\n\n$7\n$8\n$9\n$10\n$11\n$12\n\n$13\n$14\n$15\nE/;print;
```
[Answer]
# Python3 (166 138)
Golfed:
```
s='';o=input()
for n in o.split():s+=[n,'\n'+n.title()][n[0]==("DIEINAGREASEFIRE"*len(o))[s.count('\n')]]+' '
print([o,s][s.count('\n')==16])
```
Ungolfed-ish:
```
format_s = ''
unformat_s = input()
for n in unformat_s.split():
    format_s += [n, '\n' + n.title()][n[0] == ("DIEINAGREASEFIRE"*len(unformat_s))[format_s.count('\n')]] + ' '
print([unformat_s, format_s][format_s.count('\n') == 16])
```
Although the use of the lambda pleases me somewhat, that mass number of variables used and the somewhat messy development has the opposite effect. Regex may have been a good idea too. Hay ho, at least it works :).
Edit: replaced lambda variable with `count` builtin, and shortened split statement. 
[Answer]
---
# Python3 (165)
```
def c(m,h,l=[]):
 if h:s=m.rindex(h[0]);l=[m[s:]]+l;return c(m[:s],h[1:],l)
 return[m]+l
i=input()
try:print('\n'.join(c(i,"ERIF ESAERG A NI EID")))
except:print(i)
```
### Ungolfed
```
def headings_remaining(headings): return len(headings) > 0
def head(s): return s[0]
def tail(s): return s[1:]
def prepend(l,e): l.insert(0, e)
def reverse(s): return s[::-1]
def chunk(message,headings,output_list=[]):
    if headings_remaining(headings):
        split_index = message.rindex(head(headings))
        message_init = message[:split_index]
        message_last = message[split_index:]
        prepend(output_list, message_last)
        return chunk(message_init, tail(headings), output_list)
    else:
        prepend(output_list, message)
        return output_list
input_message=input()
try:
    headings=reverse("DIE IN A GREASE FIRE")
    print('\n'.join(chunk(input_message,headings)))
except ValueError: # Couldn't keep splitting chunks because didn't find heading
    print(input_message)
```
### Explanation
`chunk` recursively splits off the end of the message containing the last heading and prepends it to a list.
Caveat: this won't work if there are no spaces at all between two proposed headings in your letter for some reason, but that seems unlikely in a letter to your boss.
[Answer]
**Ruby 115**
```
n,a,c,i=[4,6,7,13],gets,'',0;a.chars{|x|x=='DIEINAGREASEFIRE'[i]?(i+=1;c+="\n"if n-[i]!=n;c+="\n#{x}"):c+=x};puts c
```
**Ruby 95**
```
a,c,i=gets,"",0;a.chars{|x|x=="DIEINAGREASEFIRE"[i]?(i+=1;c+="\n#{x}"):(c+=x)};puts c
```
[Answer]
# J - ~~110~~ 103 bytes
Why doesn't J have good functions to handle strings, but only array functions? I'll revise this if I figure out something smart.
Edit: Shortened and fixed output (it had extra spaces before) and checking. I also improved the explanation.
```
f=:[:>,&.>/@('IEIINAAGGREASEFFIRE'&t=:(}.@[t{.@[(}:@],(((0{I.@E.)({.;LF;}.)])>@{:))])`]@.(0=#@[))@< ::]
```
### Explanation:
> 
> I'll denote function usage as `[<left argument>] <function name> <right argument>`, e.g. `f <text>`. I also won't explain every detail because the function is quite long.
> 
> 
> `@` applies the right function to the left function, eg. `f@g x == f(g(x))`
> 
> 
> `t=:(}.@[t{.@[(}:@],(((0{I.@E.)({.;LF;}.)])>@{:))])']@.(0=#@[)` is a recursive function `<delimiters> t <boxed string>` that splits the string with every delimiter, in order. Fails if some delimiter is not found.
> 
> 
> `(((0{I.@E.)({.;LF;}.)])>@{:)` splits the string from the left side of the delimiter, adding a linefeed between them.
> 
> 
> `>@{:` gets the last string from a list (the one which hasn't been split yet)
> 
> 
> `0{I.@E.` gets the index to split at, failing if the delimiter doesn't exist.
> 
> 
> `{.;LF;}.` concatenates left side of the split, linefeed and right side of the split
> 
> 
> `}:@],` concatenates results of the earlier splits and the result of the last function (last meaning: look up)
> 
> 
> `']@.(0=#@[)` checks if there's any delimiters left, and calls the function described above (5 lines) if there is. Otherwise returns.
> 
> 
> `'IEIINAAGGREASEFFIRE'&` sets the left argument of `t` to that string
> 
> 
> `[:>,&.>/@` joins the results of splitting
> 
> 
> `::]` if something fails (I made the search for the split index the weak point), return the original string.
> 
> 
> 
### Examples (too long?):
```
   f 'Dear Boss, how are things? It has come to my attention that I received all the blame for the mishap last Friday. Not just the majority of it. Every last bit of it. Is it wrong for me to think that the rest of the team were at least in part responsible? After all, all six of us were involved from the get-go. Not that I think I should stand without blame. Not at all. All I''m saying is this: I do my best. I try hard. I improve constantly. And I am constantly taking responsibility. Generally speaking, I am very okay with taking full responsibility for my actions. But after this spring, it seems I get more than I deserve. Remember the Flakenhauser contract? Everything went down just about as smooth as one could have hoped. Or so it seemed at first. It was just at the very last minute that things fell apart. All of the team agreed that it was more akin to a freak accident than sloppy planning or mismanaged resources. Still, I - alone - took blame for it. Even though I said nothing then, my tolerance lev...
Dear Boss, how are things? 
It has come to my attention that I received all the blame for the mishap last Friday. Not just the majority of it. 
Every last bit of it. 
Is it wrong for me to think that the rest of the team were at least in part responsible? After all, all six of us were involved from the get-go. 
Not that I think I should stand without blame. Not at all. 
All I'm saying is this: I do my best. I try hard. I improve constantly. And I am constantly taking responsibility. 
Generally speaking, I am very okay with taking full responsibility for my actions. But after this spring, it seems I get more than I deserve. 
Remember the Flakenhauser contract? 
Everything went down just about as smooth as one could have hoped. Or so it seemed at first. It was just at the very last minute that things fell apart. 
All of the team agreed that it was more akin to a freak accident than sloppy planning or mismanaged resources. 
Still, I - alone - took blame for it. 
Even though I said nothing then, my tolerance level for taking the blame took a serious dent then. 
From that point on, 
I have felt it necessary to always try twice as hard, just to escape scrutiny. And still, here we are again. In spite of all my accomplishments. 
Right where we always seem to end up these days. 
Every single project. It's becoming unbearable.
   f 'Die in a grease fire. It''s fun. Every time.'
Die in a grease fire. It's fun. Every time.
   f 'hai'
hai
```
[Answer]
# JavaScript (ES6), ~~93~~ 115 bytes
```
alert(prompt(x=[...'DIEI1NA1G1REASEF1IRE',i=0]).replace(/\b./g,a=>i<20&&a.match(x[i])?(+x[++i]?i++&&`
`:`
`)+a:a))
```
I used `replace` to step through the string, with a match for `/\b./g` so as to only find characters that either followed a space or began the string. Then I checked each character to see if it matched the current index in the array I was looking for, and added a newline before it if it did, and incremented `i`.
EDIT:
Missed the need to create newlines between words. I've done that now, which brings it up to 115.
[Answer]
**PHP, 328 bytes**
Given a file named 'G' containing the raw text to "enmessage"
```
<?php
$a=implode(file("G"));$b=str_split('DIEINAGREASEFIRE');foreach(array_unique($b) as $c){foreach(str_split($a) as $h=>$d){if($c==$d)$l[$c][]=$h;}}$e=-1;$n=$a;foreach($b as $f=>$c){foreach($l as $j=>$m){if($c==$j){foreach($m as $k=>$h){if($h>$e){$n=substr($n,0,$h)."\n".$c.substr($a,$h+1);$e=$h+2;break 2;}}}}}echo nl2br($n);
```
Explanation (~ungolfed && commented code) :
```
<?php
$string=implode(file("G"));          // raw text to deal with
$msg=str_split('DIEINAGREASEFIRE');  // hidden message (make it an array)
 // 2D array : [letters of the message][corresponding positions in txt]
foreach(array_unique($msg) as $letter) {
    foreach (str_split($string) as $pos=>$let) {
        if ($letter==$let) $l[$letter][]=$pos; //1 array per seeked letter with its positions in the string
    }
}
$currentPos=-1;
$newString=$string;
foreach ($msg as $key=>$letter) { // deal with each letter of the desired message to pass
    foreach($l as $cap=>$arrPos) {// search in letters list with their positions
        if($letter==$cap) {       // array of the current parsed letter of the message
            foreach($arrPos as $kk=>$pos) { // see every position
                if ($pos>$currentPos) {     // ok, use the letter at that position
                    $newString=substr($newString,0,$pos)."\n".$letter.substr($string,$pos+1); // add line break
                    $currentPos=$pos+2; // take new characters into account (\n)
                    break 2;            // parse next letter of the message
                }
            }
        }
    }
}                    /* (note that I could have added some other (random) line breaks management, so that
                      * the message is not TOO obvious... !*/
echo nl2br($newString);
```
[Answer]
# PHP, 136 bytes
```
for($f=" ".join(file(F));$c=DIEINAGREASEFIRE[$i++];){while(($p=strpos($f,$c,$p))&&$f[$p-1]>" ");$p?$f[$p-1]="\n":$i=20;}echo$i<20?$f:"";
```
if the whole insult can be put; prints the modified string with a leading space or linebreak; empty output if not.
Run with `-r`.
**breakdown**
```
for($f=" ".join(file(F));       // read input from file "F"
    $c=DIEINAGREASEFIRE[$i++];) // loop through insult characters:
{
    while(($p=strpos($f,$c,$p))     // find next position of $c
        &&$f[$p-1]>" ");            // ... preceded by a space
    $p?$f[$p-1]="\n"                // if found, replace the space with a newline
    :$i=20;                         // else break the loop
}
echo$i<20?$f                // if modified text has the full insult, print it
    :"";                    // else print nothing
```
[Answer]
# [Zsh](https://www.zsh.org/) + [`sed`](https://www.gnu.org/software/sed/manual/sed.html#Top), ~~167~~ ... 158 bytes
```
cp a z;b=DIE_IN_A_GREASE_FIRE
for c (${(s::)b}){sed -i "$ s/ $c/ \n$c/" a
((##$b[j++]==95))&&sed -i '$ i\\' a}
$b()<a;`<a|cut -c -1|sed 's/^$/_/g'|rs -g0`||<z
```
[Try it Online!](https://tio.run/##VZRBc9s2EIXv/hU7iSaSJpbUHnqoY9fjTOQML8mMc6xbZUlBJCwS4GBBKXKU3@6@BeQ4vUgkuHjY/fYtHqV5urxcfr79i88@GA703oucU@P3xMFQbKyr5ZqKSA0LVb7DmqfuQByjcdF6hxiOVFAwlbE7syZuW6wZKltG9MaH9NZZabinliXSbbBrPszpk4/0MGAhBfCDDzYeyG/IxjktdyYccnxp4/NqIfijffCuTtI5H01zmxNRqWAkbdDnaLijvUEt@NgalbOOeg5Rw3rvxJatuaabTTRBcz9PBYj9pgqD5L3W7XyrxW2C75JubeKs9rmGE4GcRUHS@KFdk0R2a9rbiNeYaeRwBOOIOd3gnGLckfABlMmKKsgFFNYJcYky5qoLDg2HtT7brg9@Z9AJp/qxBcYbHFMQynxZpMhb1fxZom2Bdk4fjTMBhx9IepNCzvPWBNtv@ZASft6@GZDi/zUydfS/0ubLnN6jOE7wNHvohqSKLokxnUAeqKjzyU3stDojJuwA4850pitNNshty1vjGh7wUSuJAUdcZxskG6ITLgLN3mXTcKlc4UrpvEfOePJOySj8hgGp8b0Btc@BxD8npAaNtLEhsYWVsC3LZe@8uK6zbojm2VU6B7Qx4MFqnty9Xz3GdTAQT@E266ailaR6lOEdIAe4yq61kkRDWt/3B@pbdk5rVLhWOnZcQwzo/RAqA8xfolVvFjSDebTOGUT99pcpOw2NDqQf6kaNyHZNzmd6SNSda@eib@EBVxmMw860eUJzv1/GNmkziAXrMQSnhI2bY3jTBKDK3luseqdZJd7Ak2p3uApEOBxS3e2eD5JMHPcWpwKMuvn8NPqejFTcG5IqDNG6k6El19vo9O1Nuoy4ZosEClDrLToD@jqqyYy4mfoWV0yHREHrztYNevBzd85B@58OhP7Qaz1iCDeRPN82AgitIYzYg6mSP8aCMYS40hlciRuScV3Mz3BjPlU9CD2@K68@FMtV8Wl1s/p4t7z5slzdFnfLM8Va0WT0fSIXF9Pyx/S7oKMzS69GJAsaVQu6d/h9RXw2mbx@PSr/fnj79p@rqz//mE7fvDkFj0dk7@/HxD/ORuVkesnvvl7ysYLxZxXNfj9q2FgW/44Wq0U9PgahWf3b1@Px8vHp6T8)
The long email one-liner is stored in file `a`. Using `sed -i '$ <blah>'` always edits the *last line* of `a`. The last line `$` is incrementally reduced as we insert `\n` characters.
Cut out quite a few bytes in the early versions of this solution. Added ~50 bytes for the 'original string' requirement. Ignored the STDIN thing per meta consensus.
Could be a lot shorter ([101 bytes](https://tio.run/##VZRBb9s4EIXv@RWDIkATIHa718TbwEWdQpcWSK976EgeS4wlUuBQ9iqb/e3ZN6TddC@JTZOP8755w2ftXlerzfeHT3zxRTjS56B6Q104Ekeh1Dnf6j1ViTpWasKAtUDDTJyS@OSCxx5OVFGURtxBtsR9jzWhumfs3oWYvw1OOx6pZ030EN2W5yV9C4meJizkDfwUokszhR25tKTNQeJc9tcunVcrxT86xuDbLF3qsTL3pRCTiqL5gH1OwgMdBV7wYy8m5zyNHJNtG4NXV/dyT@tdkmi132QD6v42hUnLWecPoTdzuxiGrNtKWrSheDgRKFVUpF2Y@i1pYr@lo0v4mgqNsh2bccWS1rinej@Q8gzK5NQU9BYK24y4ho2l6YJDx3Frn90wxnAQdMKbfuqBcY1rKoLNt0VKvDfNXxZdD7RL@ipeIi6fSUfJW27K0Qw77HnOBZ@P7yaU@H@NQh39b6z5uqTPMMcZnlUP3ZhV0SUVGRTyQEVDyGlib@5EJR4A41EGGWopAXnoeS@@4wk/mpMUccV9iUGOITrhE9AcfQkN18YVqdQhBNSMT8EbGYPfMSB1YRRQ@x5Jw7kgC2iinYuZLaKEY0WuZOctdYPzU5JzqmwOaCfgwRae0r3fM8ZtFIjn7a7oZtNG0jLKyA6QA1zjtuYk09A@jONMY8/em0eD63Rgzy3EgD5MsRFg/pGcZbOiBcJjPhcQDfvfpuw0NDaQYWo7CyK7LflQ6KFQf2OdS6FHBnwjGIeD9GVCS7/fxjZrM4hFFzAEp4LFLzG8eQLgcgwOq8FbVZk38GTvHk@BKsc5@@6PPGsOcTo63Aowluab0@gHEm14FNImTsn5U6C1@O1s@o6SHyNu2aGACtRGh86Avo1qDiNeprHHEzOgUNB6dG2HHvw6XWqw/ucLoT@N5keF8BLp@bVRQOiFMGJP0uR8vFeMIcSNzuRrvJCM52J5gRfztRlB6Pmu/vNLtam@rb8@btY/Ng/V4@bOkDZ0dfnPld7eXtf/XiuauXD07pL0A102H@gvj7/viC8u66vrFd/9XPFLgzgvGlr88RKVFu3Hny8vq@fX1/8A)) if we ignore the requirement for extra line breaks
```
cp a z;b=DIEINAGREASEFIRE;for c (${(s::)b})sed -i "$ s/ $c/ \n$c/" a
$b()<a;`<a|cut -c -1|rs -g0`||<z
```
Old versions that don't fully meet the requirements:
 ~~[106 bytes](https://tio.run/##VZRBb9s4EIXv@RWD1mgS1HFPe9hssoGLOoUuLZAeN4tgJI8txhIpcCh7tUV/e/YNaTfdiy1Rw8eZb97wX21fbm5WX@//5LNPwpE@BtU5teFAHIVS6/xW76hK1LJSE3qsBeon4pTEJxc8YjhRRVEacXtZE3cd1oTqjhG9CTG/9U5bHqhjTXQf3ZqnBX0JiZ5HLOQAfg7RpYnChlxa0GovcSrxtUun1UrxR4cY/DZLl3wszV1JxKSiaN5gz0m4p4OgFnzsxOScp4FjsrAheHV1J3e03CSJlvs8F6DuH1MYtex1fh86K24TQ591t5KutqHUcCRQsqhI2zB2a9LEfk0Hl/CaCo0SjmAcsaAlzqnOe1KeQJmcmoJeQ2GdEdcoY2G64NByXNuz64cY9oJOeNNPHTAucUxFKPN1kRLvTPNnia4D2gV9Fi8Rh0@kg@SQedmaYYcdTznh0/bNiBT/r1Goo/@NNV8X9BHFcYZn2UM3ZlV0SUV6hTxQUR@ym9hbdaIS94DxIL30tRSD3He8E9/yiI9WSYo44q7YINsQnfAJaA6@mIZr4wpXah8CcsZT8EbG4LcMSG0YBNS@RtJwSsgMmmjjYmYLK2FbkSveeXVd7/yY5OQqmwPaCHiwmad071eP8TYKxHO4K7q5aCNpHmV4B8gBrnFrqyTT0C4Mw0RDx95bjQbXac@etxAD@jDGRoD5W3LmzYquYB6r8wqiYffLlB2HxgYyjNvWjMhuTT4UekjUz61zKXTwgG8E47CXrkxo6ffr2GZtBrHoAobgmLD4BYY3TwCqHILDavCWVeYNPLl2j6tAleOU6@4OPGk2cTo4nAow5ub5cfQDiTY8CGkTx@T80dBa6m1t@g6SLyPeskMCFagNDp0BfRvVbEbcTEOHK6ZHoqD14LYtevBzd8nB@p8PhP44WD0qhJtIT7eNAkInhBF7lib741wxhhA3OqOvcUMyrovFGW7Ml/r2U7V6qr48LZ8@P6yW31ZP99XD6sx4NnQx@36h19eX9Y/L74pWXjl6MyP9QLPmAz16/L4hPru4ePt2Vv/1/P7937e3v/92efnu3TH4fEbu8fGc@McfN/zy8h8)~~
 ~~[115 bytes](https://tio.run/##VZRBbxs5DIXv@RVEazQ26rjYwx42m2zgok4xlxZIj00R0GPao3hGGogae2eL/vb0UXKa7sm2LD3xfXzUf9o8XV2tPt/@w2cfhCO9D6pzasKROAqlxvmd3lCVqGGlOnRYC9SNxCmJTy547OFEFUWpxR1kQ9y2WBNat4zd2xDzr85pwz21rIluo9vwuKBPIdHjgIW8gR9DdGmksCWXFrQ6SBzL/rVLz6uV4oOOMfhdli71WJn7UohJRdF8wL4n4Y6OAi/4sxWTc556jsm29cGrW7dyQ8ttkmi1z7MBdf@awqDlrPOH0Jq5bQxd1t1JutiF4uFEoFRRkTZhaDekif2Gji7hZyo0ynZsxhULWuKe6rwj5RGUyakp6CUUNhnxGjYWpgsODceNfXddH8NB0Alv@qkFxiWuqQg2XxYp8d40f1l0LdAu6KN4ibh8JO0lb5mXoxl22POYC34@vh1Q4v81CnX0v7bm64LewxxneFY9dGNWRZdUpFPIAxV1IaeJvbkTlXgAjDvppFtLCchty3vxDQ/405ykiCtuSgxyDNEJn4Dm6EtoeG1ckUrtQkDN@Ba8kTH4DQNSE3oBtc@RNDwXZAFNtHUxs0WUcKzIley8pK5zfkjynCqbA9oKeLCFp3Tv94zxLgrE83ZXdLNpI2kZZWQHyAGudhtzkmloG/p@pL5l782jwXXasecdxIA@DLEWYP6SnGWzoguEx3xeQDTsf5uy09DYQIZh11gQ2W3Ih0IPhfq5dS6FFhnwtWAcDtKWCS39fhnbrM0gFl3AEJwKFr/A8OYJgMs@OKwGb1Vl3sCTvXs8Baocx@y7PfKoOcTp6HArwFia56fRDyRacy@kdRyS86dAa/Hb2PQdJT9GvGOHAipQ6x06A/o2qjmMeJn6Fk9Mh0JB687tGvTg1@lSg/U/Xwj9oTc/KoSXSJ9fGwWEVggj9ih1zse5YgwhbnQGv8YLyXguFmd4MZ/W1x@q1UP16WH58PFutfyyerit7lZnxrOm6eT7VC8vZ@sfs@@KVl6sHL2akL6bfl3cfJvRpH53/wfde3y@Ij6bTl@/nqy/Pr59@@36@q8/Z7M3b/IpR@cTcvd0Tvzj7yt@evoJ)~~
 ~~[146 bytes](https://tio.run/##VZRBb9s4EIXv/hWDbpDYqO0ihz1sNmngok6hSwukx7ZIR9LYYiyRAknZUYv@9uwb0m66J0nU8HHmmzf8EZrn6@v1p7u3PHkv7OmdC2FOjTsQe6HYGLsNt1REajhQ5TqsOepG4hjFRuMsYjhSQV4qMXupidsWa0Jly4jeOJ@@OhMa7qnlEOnOm5rHJX10kR4HLKQAfnTexJHchkxc0novfszxpYmn1SLgQQfv7DZJ53w0zV1ORKW8hLRB36NwRwdBLfjZisoZSz37qGG9s8GUrdzSahPFa@7zVEAwT6owhLzX2L1rtbiNd13S3UpcbF2u4UggZ1FQaNzQ1hQi25oOJuIzZho5HME4YkkrnFNcdBR4BGUyQRXCFRTqhLhEGUvVBYeGfa3vpuu92ws6YVU/tsC4wjEFocyXRYq8U83fJZoWaJf0Qax4HD5S6CWFzPPWBNvteEwJn7ZvBqT4f41MHf2vtPlhSe9QHCd4mj10fVJFl4JIFyAPVNS55Ca2Wp0E8XvAuJdOulKyQe5a3olteMBPrSR6HHGbbZBsiE7YCDQHm03DpXKFK0PnHHLGm7NKRuE3DEiN6wXUPnkK7pSQGjTSxvjEFlbCtiyXvfPius7YIcrJVToHtBHwYDVP7t6fHuOtF4incJN1U9FKUj3K8A6QA1xlaq0k0Qit6/uR@pat1RoVrgkdW95CDOjd4CsB5s/RqDcLWsA8WucCom73x5Qdh0YH0g3bRo3IpibrMj0kaufauehaeMBWgnHYS5snNPf7ZWyTNoOYNw5DcExY7BLDmyYAVfbOYNVZzSrxBp5Uu8VVEAL7MdXdHngMycTxYHAqwKib58fRdySh4l4oVH6Ixh4NHXK9jU7fQdJlxFs2SKAAtd6gM6Cvo5rMiJupb3HFdEgUtO7NtkEPfu/OOWj/04HQH3qtJwjhJgqn2yYAQiuEEXuUKvnjImAMIa50BlvihmRcF8sJbszn8uZ9sX4oPj6sHj7cr1ef1w93xf16ojwrmp79nIarq1n5a/YzoJWLtaFX4c30y/L224zOqjdfL@mrxfMV8WQ6/X6oaNFe8/e3l7PZ@XkjjC2XxOfnabOhi8v6ApFPN2fll8fXr7/9O53@9XRz88/fGi5V435Nrvn5@T8)~~
 ~~[153 bytes](https://tio.run/##VZRBb9s4EIXv/hWDbpDYqOPChz1sNmngok6hSwukx7ZIx/LYYiKRAoey4xb97dk3pNN0T5Ko4ePMN2/4Q5uny8vlp5u3PHovHOldUJ1SE/bEUSg1zm/1mqpEDSvVocNaoO5AnJL45IJHDCeqKEotbidr4rbFmtCqZURvQsxfndOGe2pZE91Et@bDjD6GRPcDFnIA34fo0oHChlya0XIn8VDiVy49r1aKB@1j8NssXfKxNB9KIiYVRfMGe0/CHe0FteBnKybnPPUck4X1watbtXJNi02SaLlPcwHqHk1h0LLX@V1orbhNDF3W3Uo634ZSw5FAyaIibcLQrkkT@zXtXcJnKjRKOIJxxIwWOKc660j5AMrk1BT0AgrrjHiFMmamCw4Nx7W9u66PYSfohDf91ALjAsdUhDJfFinxg2n@LtG1QDujD@Il4vADaS85ZFq2ZtjhgQ854eftmwEp/l@jUEf/a2u@zugdiuMMz7KHbsyq6JKKdAp5oKIuZDext@pEJe4A41Y66VZSDHLT8oP4hgf8tEpSxBHXxQbZhuiET0Cz98U0vDKucKV2ISBnvAVvZAx@w4DUhF5A7VMkDc8JmUETbVzMbGElbCtyxTsvruucH5I8u8rmgDYCHmzmKd3702O8jQLxHO6Kbi7aSJpHGd4BcoCr3doqyTS0DX1/oL5l761Gg@u0Y89biAF9GGItwPw5OfNmRecwj9V5DtHw8MeUHYfGBjIM28aMyG5NPhR6SNRPrXMptPCArwXjsJO2TGjp98vYZm0GsegChuCYsPgZhjdPAKrsg8Nq8JZV5g08uXaPq0CV4yHX3e75oNnEae9wKsCYm6fH0Q8kWnMvpHUckvNHQ2upt7Hp20u@jHjLDglUoNY7dAb0bVSzGXEz9S2umA6Jgtat2zbowe/dJQfrfz4Q@kNv9agQbiJ9vm0UEFohjNi91NkfZ4oxhLjRGfwKNyTjupiNcGM@ra7eV8u76uPd4u7D7XLxeXl3U90uR8azpvHJz7FeXExWvyY/Fa08Xzp6pW/GX2bX3yZ0Ur/5OqevHs9XxCPFhHzf13QOd33/dzw@mb@dTyanp40wds6JT0@zhqOz@foMGx6vTlZf7l@//obgvx6vrv7528KlbsKv0SU/Pf0H)~~
 ~~[167 bytes](https://tio.run/##VZRBb9s4EIXv@RWDbuA4QOzChz00TRq4qFPo0gLpcVOkY3lsMZZIgUPZ623727NvSKdpT5Io8nHmmzfznzZPV1eLz7fv@OSDcKT3QfWCmrAnjkKpcX6jN1QlalipDh3WAnUH4pTEJxc89nCiiqLU4nayIm5brAktW8budYj5q3PacE8ta6Lb6FZ8mNKnkOhxwELewI8hunSgsCaXprTYSTyU/UuXnlcrxYP2MfhNli7xWJjbEohJRdF8wN6TcEd7QS742YrJOU89x2Tb@uDVLVu5ofk6SbTYL3IC6v41hUHLWed3obXk1jF0WXcjabIJJYcjgRJFRdqEoV2RJvYr2ruEz1RolO3YjCumNMc91VlHygdQJqemoJdQWGXES6QxNV1waDiu7N11fQw7QSW86acWGOe4piKk@bJIibem@StF1wLtlD6Kl4jLD6S95C0X5WiGHbZ8yAE/H18PCPFPjUId9a@t@Dql90iOMzyLHroxq6JKKtIp5IGKupDdxN6yE5W4A4w76aRbSjHIbctb8Q0P@GmZpIgrbooNsg1RCZ@AZu@LaXhpXOFK7UJAzHgL3sgY/IYBqQm9gNrnSBqeAzKDJlq7mNnCSjhW5Ip3XlzXOT8keXaV9QGtBTzYzFOq97vHeBMF4nm7K7o5aSNpHmV4B8gBrnYryyTT0Db0/YH6lr23HA2u0449byAG9GGItQDzl@TMmxVNYB7LcwLRsP2ty45NYw0Zhk1jRmS3Ih8KPQTqL6xyKbTwgK8F7bCTtnRoqfdL22ZtBrHoAprgGLD4KZo3dwCy7IPDavAWVeYNPDl3j1GgyvGQ8273fNBs4rR3uBVgzM0Xx9YPJFpzL6R1HJLzR0Nrybex7ttLHka8YYcAKlDrHSoD@taq2YyYTH2LEdMhUNC6c5sGNfh1usRg9c8XQn/oLR8VwiTS52mjgNAKocUepc7@OFO0IcSNzuCXmJCMcTE9wcR8Wl5/qBYP1aeH@cPHu8X8y@LhtrpbnBjPmsan38d6eXm@/Hk@Hv9VX1@/@fv8fDTaXt/f@x8/viuqO3E0WdArfT3@Z3rz9ZxO69f3M7r3eL4ifqtom2/7miaw3Le34/Hp7N3MJBphnJ0Rj0ZHlbPZ6sw@rfXSmk63o9Hg7fj258kVPz39Dw "Zsh – Try It Online")~~
[Answer]
**Python - 190 Bytes**
```
l,r="IExINxAxGREASExFIRE","\n";k=p=raw_input();y=i=0
for c in l:
    if c!="x":
        h=len(p);x=p[y:h].find(c)
        if x==-1:i+=1
        p=p[0:x+y-1]+r+p[x+y:h];y=x+y;r="\n"
    else:r=r+r
if i!=0:p=k
```
**Ungolfed**
This is my first golf attempt :) Looking to learn some great coding techniques, regardless, I just focused on using find and then some string splicing to find the appropriate characters and format the output.
Variables -
l.r = l is assigned characters we will be using as our guide to create our new formatted paragraph. r is assigned the new line character for us in spacing the new output.
k,p = The input paragraph. K is used to revert to the original as it is not reassigned during execution of the script. I check against x to know when to add a double new line for spacing purposes.
y,i = y is a "cursor" of sorts, keeps track of the last position a character was found so we find through the paragraph correctly for splicing purposes, i is sanity check, if we don't hit all of our characters we revert the paragraph (p variable) to it's original input via the k variable.
h = Input length, which we use in splicing.
x = The position of the current character represented by C, used for splicing as well.
c = Characters in l to iterate and search for.
The following code is reworded and broken out from the original code for readability to as what is happening:
```
letters,return="IExINxAxGREASExFIRE","\n"
input1=input2=raw_input()
lastpos=sanity=0
for char in letters:
    if char != "x":
        inputlength=len(input1)
        charposition=input1[lastpos:inputlength].find(char)
        if charposition==-1:
            sanity+=1
        input1=input1[0:position+lastpos-1]+return+input1[position+lastpos:inputlength]
        lastpos=position+lastpos
        return="\n"
    else:return=return+return
if sanity!=0:
    input1=input2
```
I would appreciate your feedback! I am looking to learn.
]