Why doesn't this listener get the custom event?

I’m very confused about why one of my event listeners does not catch a custom event while all of the others do. I have this in my FLA:


function runP5():void {
    p5 = new P5_SMS();
    addChild(p5);
    p5.addEventListener(NGDemoEvent.SMS_COMPLETE, closep5Handler);
}
function closep5Handler(e:NGDemoEvent):void {
    trace("closep5Handler()");
    p5.removeEventListener(NGDemoEvent.SMS_COMPLETE, closep5Handler);
    closep5();
}
function closep5() {
     trace("in FLA HSec, closep5()");
     if (p5) {
          if (p5.parent != null) removeChild(p5);
     }
}

Here is the class method in P5_SMS (p5) that dispatches the custom event:


private function finished():void {
     trace("in P5_SMS finished()");
     dispatchEvent(new NGDemoEvent(NGDemoEvent.SMS_COMPLETE));
}

And here is the custom event class called NGDemoEvent:


package {
    
     import flash.events.Event;
    
     public class NGDemoEvent extends Event {
          public static const LOGO_COMPLETE:String = "logoComplete";
          public static const INTRO_COMPLETE:String = "introComplete";
          public static const MENU_COMPLETE:String = "menuComplete";
          public static const TELEMATICS_COMPLETE:String = "telematicsComplete";
          public static const HOMESECURITY_COMPLETE:String = "homesecurityComplete";
          public static const SMS_COMPLETE:String = "smsComplete";
          public static const VIDEO_COMPLETE:String = "videoComplete";
          public static const IM_COMPLETE:String = "imComplete";
         
          public static const TELEMATICS_CLICKED:String = "telematicsClicked";
          public static const HOMESECURITY_CLICKED:String = "homesecurityClicked";
          public static const SMS_CLICKED:String = "smsClicked";
          public static const VIDEO_CLICKED:String = "videoClicked";
          public static const IM_CLICKED:String = "imClicked";

          public var params:Object;
         
          public function NGDemoEvent(type:String, params:Object = null) {
               trace("in NGDemoEvent, \"" + type + "\" fired");
               super(type);
               this.params = params;
          }
         
          public override function clone():Event {
               return new NGDemoEvent(type, this.params);
          }
     }
}

When p5 completes itself, finished() fires, which dispatches the NGDemoEvent.SMS_COMPLETE custom event.

I get this trace:


in P5_SMS finished()   // meaning the class method worked
in NGDemoEvent, "smsComplete" fired // meaning NGDemoEvent dispatched the event successfully

…which obviously means p5.finished() executed AND NGDemoEvent successfully fired the custom event. But I don’t get the trace from closeP5Handler() (and obviously not from closeP5).

My FLA file has six other such function calls to six other classes (P2, P3, etc.) and these all work. They’re identical. I’m tearing my hair out over this. Why won’t the listener get the event?

Thanks!